1 module vksdk.httpclient.RequestsTransportClient;
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 requests;
10 
11 class RequestsTransportClient : BaseTransportClient {
12 
13     private static RequestsTransportClient instance;
14 
15     static TransportClient getInstance() {
16         if (instance is null) {
17             instance = new RequestsTransportClient;
18         }
19 
20         return instance;
21     }
22 
23     private ClientResponse call(string url, string requestBody, bool isPost) {
24         auto request = Request();
25 		request.addHeaders(["Content-Type" : CONTENT_TYPE, "User-Agent" : USER_AGENT]);
26 		request.verbosity = 3;
27 		request.timeout = 60.seconds;
28 
29         for (int i = 0; i < 3; i++) {
30             try {
31                 //supervisor.addRequest(request);
32 
33                 //long startTime = Clock.currTime();
34 
35                 Response response;
36 				if (requestBody != null) {
37 					response = request.post(url, requestBody);
38 				} else {
39 					response = request.post(url);
40 				}
41 
42                 //logger.log("%s\t\t%s", url, Clock.currTime() - startTime);
43 
44                 //supervisor.removeRequest(request);
45                 
46                 return new ClientResponse(response.code, cast(string)response.responseBody, response.responseHeaders);
47             } catch (Exception e) {
48                 //logger.warningf("Network troubles:\n%s", e.msg);
49                 throw e;
50             }
51         }
52 
53         throw new Exception("Something wrong");
54     }
55     
56     private ClientResponse call(string url, MultipartForm form) {
57 		auto request = Request();
58 		request.verbosity = 3;
59 		request.timeout = 60.seconds;
60 		// TODO
61 		auto response = request.post(url, form);
62 		return new ClientResponse(response.code, cast(string)response.responseBody, response.responseHeaders);
63 	}
64 
65     override ClientResponse post(string url, string fileName, File file) {
66 		MultipartForm form;
67 		form.add(formData("file", file, ["filename": fileName, "Content-Type": "text/plain"]));
68 
69         return call(url, form);
70     }
71 }