1 module vksdk.httpclient.VibeClient;
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 VibeClient : BaseTransportClient {
12 
13     private static VibeClient instance;
14 
15     static TransportClient getInstance() {
16         if (instance is null) {
17             instance = new VibeClient;
18         }
19 
20         return instance;
21     }
22 
23     private ClientResponse call(string url, string requestBody, bool isPost) {
24         HTTPClientSettings settings = new HTTPClientSettings;
25         settings.defaultKeepAliveTimeout = 0.seconds; // closes connection immediately after receiving the data.
26 
27         requestHTTP(url,
28     		(scope req) {
29     			req.method = HTTPMethod.POST;
30     			req.writeJsonBody(requestBody);
31     			req.headers = ["Content-Type" : CONTENT_TYPE, "User-Agent" : USER_AGENT];
32     		},
33     		(scope res) {
34     		    assert(res.statusCode == HTTPStatus.ok);
35     		    logInfo("Response: %d", res.statusCode);
36                 foreach (k, v; res.headers)
37                     logInfo("Header: %s: %s", k, v);
38     			logInfo("Response: %s", res.bodyReader.readAllUTF8());
39     		}, settings
40     	);
41 
42 
43         auto request = Request();
44 		request.addHeaders(["Content-Type" : CONTENT_TYPE, "User-Agent" : USER_AGENT]);
45 		request.verbosity = 3;
46 		request.timeout = 60.seconds;
47 
48         for (int i = 0; i < 3; i++) {
49             try {
50                 //supervisor.addRequest(request);
51 
52                 //long startTime = Clock.currTime();
53 
54                 Response response;
55 				if (requestBody != null) {
56 					response = request.post(url, requestBody);
57 				} else {
58 					response = request.post(url);
59 				}
60 
61                 //logger.log("%s\t\t%s", url, Clock.currTime() - startTime);
62 
63                 //supervisor.removeRequest(request);
64                 
65                 return new ClientResponse(response.code, cast(string)response.responseBody, response.responseHeaders);
66             } catch (Exception e) {
67                 //logger.warningf("Network troubles:\n%s", e.msg);
68                 throw e;
69             }
70         }
71 
72         throw new Exception("Something wrong");
73     }
74     
75     private ClientResponse call(string url, MultipartForm form) {
76 		auto request = Request();
77 		request.verbosity = 3;
78 		request.timeout = 60.seconds;
79 		// TODO
80 		auto response = request.post(url, form);
81 		return new ClientResponse(response.code, cast(string)response.responseBody, response.responseHeaders);
82 	}
83 
84     override ClientResponse post(string url, string fileName, File file) {
85 		MultipartForm form;
86 		form.add(formData("file", file, ["filename": fileName, "Content-Type": "text/plain"]));
87 
88         return call(url, form);
89     }
90 }