1 module vksdk.httpclient.MarsTransportClient; 2 3 import std.datetime; 4 import std.experimental.logger.filelogger; 5 import std.stdio; 6 7 import vksdk.client.ClientResponse; 8 import vksdk.client.TransportClient; 9 import mars; 10 11 // Singleton 12 // https://p0nce.github.io/d-idioms/#Leveraging-TLS-for-a-fast-thread-safe-singleton 13 class MarsTransportClient : BaseTransportClient { 14 15 private __gshared static MarsTransportClient instance; 16 17 private HttpClient client; 18 19 static TransportClient getInstance() { 20 if (instance is null) { 21 instance = new MarsTransportClient; 22 } 23 24 return instance; 25 } 26 27 private this() { 28 super(); 29 30 HttpClientOptions options = new HttpClientOptions; 31 options.headers = ["Content-Type" : CONTENT_TYPE, "User-Agent" : USER_AGENT]; 32 options.timeout = 60.seconds; 33 client = CurlHttpClient.init(options); 34 } 35 36 private ClientResponse call(string url, string requestBody) { 37 for (int i = 0; i < 3; i++) { 38 try { 39 //supervisor.addRequest(request); 40 41 //long startTime = Clock.currTime(); 42 43 Request postRequest = new Request.Builder() 44 .url(url) 45 .data(requestBody) 46 .build(); 47 Response response = client.post(postRequest); 48 49 //logger.log("%s\t\t%s", url, Clock.currTime() - startTime); 50 51 //supervisor.removeRequest(request); 52 53 return new ClientResponse(response.getStatusCode, response.getResponseBodyString, response.getHeaders); 54 } catch (Exception e) { 55 //logger.warningf("Network troubles:\n%s", e.msg); 56 throw e; 57 } 58 } 59 60 throw new Exception("Something wrong"); 61 } 62 63 /*private ClientResponse call(string url, MultipartForm form) { 64 auto request = Request; 65 request.verbosity = 3; 66 request.timeout = 60.seconds; 67 // TODO 68 auto rs = rq.post(url, form); 69 70 }*/ 71 72 override ClientResponse post(string url, string fileName, File file) { 73 //MultipartForm form; 74 //form.add(formData("file", file, ["filename": fileName, "Content-Type": "text/plain"])); 75 76 //return call(url, form); 77 return call(url, null); 78 } 79 }