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 }