src/HTTPClient.cpp
branchv_0
changeset 10 479557122717
parent 9 9fdbfbe24161
child 11 6b913e82f52a
equal deleted inserted replaced
9:9fdbfbe24161 10:479557122717
    87 		return list;
    87 		return list;
    88 	}
    88 	}
    89 };
    89 };
    90 
    90 
    91 HTTPClient* HTTPClient::open() {
    91 HTTPClient* HTTPClient::open() {
    92 	return new HTTPClient(new HTTPClient::HTTPClientImpl(curl_easy_init()));
    92 	HTTPClient::HTTPClientImpl* impl = new HTTPClient::HTTPClientImpl(curl_easy_init());
       
    93 
       
    94 	typedef size_t(*CurlWriteCallback)(char*, size_t, size_t, HTTPClient::HTTPClientImpl*);
       
    95 
       
    96 	// set response body callback
       
    97 	curl_easy_setopt(impl->curl, CURLOPT_WRITEDATA, impl);
       
    98 	curl_easy_setopt(impl->curl, CURLOPT_WRITEFUNCTION, (CurlWriteCallback)[](char* buffer, size_t size, size_t nmemb, HTTPClient::HTTPClientImpl * impl)->size_t {
       
    99 		size_t r = size * nmemb;
       
   100 		impl->responseBody.write(buffer, r);
       
   101 		return r;
       
   102 	});
       
   103 
       
   104 	// set response headers callback
       
   105 	curl_easy_setopt(impl->curl, CURLOPT_HEADERDATA, impl);
       
   106 	curl_easy_setopt(impl->curl, CURLOPT_HEADERFUNCTION, (CurlWriteCallback)[](char* buffer, size_t size, size_t nmemb, HTTPClient::HTTPClientImpl * impl)->size_t {
       
   107 		size_t r = size * nmemb;
       
   108 		impl->responseHeaders.write(buffer, r);
       
   109 		return r;
       
   110 	});
       
   111 
       
   112 	return new HTTPClient(impl);
    93 }
   113 }
    94 
   114 
    95 HTTPClient::~HTTPClient() {
   115 HTTPClient::~HTTPClient() {
    96 	curl_easy_cleanup(impl->curl);
   116 	curl_easy_cleanup(impl->curl);
    97 	delete impl;
   117 	delete impl;
   107 
   127 
   108 	// set request headers
   128 	// set request headers
   109 	CurlList requestHeders;
   129 	CurlList requestHeders;
   110 	for (size_t i = 0; i < request.headers.size(); i += 2) requestHeders.append(request.headers[i] + ": " + request.headers[i + 1]); // TODO: validate, no CR/LF...
   130 	for (size_t i = 0; i < request.headers.size(); i += 2) requestHeders.append(request.headers[i] + ": " + request.headers[i + 1]); // TODO: validate, no CR/LF...
   111 	curl_easy_setopt(impl->curl, CURLOPT_HTTPHEADER, requestHeders.getList());
   131 	curl_easy_setopt(impl->curl, CURLOPT_HTTPHEADER, requestHeders.getList());
   112 
       
   113 	typedef size_t(*CurlWriteCallback)(char*, size_t, size_t, HTTPClient::HTTPClientImpl*);
       
   114 
       
   115 	// set response body callback
       
   116 	curl_easy_setopt(impl->curl, CURLOPT_WRITEDATA, impl);
       
   117 	curl_easy_setopt(impl->curl, CURLOPT_WRITEFUNCTION, (CurlWriteCallback)[](char* buffer, size_t size, size_t nmemb, HTTPClient::HTTPClientImpl * impl)->size_t {
       
   118 		size_t r = size * nmemb;
       
   119 		impl->responseBody.write(buffer, r);
       
   120 		return r;
       
   121 	});
       
   122 
       
   123 	// set response headers callback
       
   124 	curl_easy_setopt(impl->curl, CURLOPT_HEADERDATA, impl);
       
   125 	curl_easy_setopt(impl->curl, CURLOPT_HEADERFUNCTION, (CurlWriteCallback)[](char* buffer, size_t size, size_t nmemb, HTTPClient::HTTPClientImpl * impl)->size_t {
       
   126 		size_t r = size * nmemb;
       
   127 		impl->responseHeaders.write(buffer, r);
       
   128 		return r;
       
   129 	});
       
   130 
   132 
   131 	// do HTTP call
   133 	// do HTTP call
   132 	CURLcode result = curl_easy_perform(impl->curl);
   134 	CURLcode result = curl_easy_perform(impl->curl);
   133 
   135 
   134 	if (result == CURLE_OK) {
   136 	if (result == CURLE_OK) {