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 }