src/HTTPClient.cpp
branchv_0
changeset 11 6b913e82f52a
parent 10 479557122717
child 12 2f2d64333867
equal deleted inserted replaced
10:479557122717 11:6b913e82f52a
    28 namespace http {
    28 namespace http {
    29 
    29 
    30 class HTTPClient::HTTPClientImpl {
    30 class HTTPClient::HTTPClientImpl {
    31 public:
    31 public:
    32 	CURL* curl;
    32 	CURL* curl;
       
    33 	char curlErrorBuffer[CURL_ERROR_SIZE];
    33 	std::stringstream responseBody;
    34 	std::stringstream responseBody;
    34 	std::stringstream responseHeaders;
    35 	std::stringstream responseHeaders;
    35 
    36 
    36 	HTTPClientImpl(CURL* curl) : curl(curl) {
    37 	HTTPClientImpl(CURL* curl) : curl(curl) {
    37 	}
    38 	}
   107 		size_t r = size * nmemb;
   108 		size_t r = size * nmemb;
   108 		impl->responseHeaders.write(buffer, r);
   109 		impl->responseHeaders.write(buffer, r);
   109 		return r;
   110 		return r;
   110 	});
   111 	});
   111 
   112 
       
   113 	// set the error buffer
       
   114 	curl_easy_setopt(impl->curl, CURLOPT_ERRORBUFFER, impl->curlErrorBuffer);
       
   115 
   112 	return new HTTPClient(impl);
   116 	return new HTTPClient(impl);
   113 }
   117 }
   114 
   118 
   115 HTTPClient::~HTTPClient() {
   119 HTTPClient::~HTTPClient() {
   116 	curl_easy_cleanup(impl->curl);
   120 	curl_easy_cleanup(impl->curl);
   128 	// set request headers
   132 	// set request headers
   129 	CurlList requestHeders;
   133 	CurlList requestHeders;
   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...
   134 	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...
   131 	curl_easy_setopt(impl->curl, CURLOPT_HTTPHEADER, requestHeders.getList());
   135 	curl_easy_setopt(impl->curl, CURLOPT_HTTPHEADER, requestHeders.getList());
   132 
   136 
       
   137 	// clear the error buffer
       
   138 	impl->curlErrorBuffer[0] = 0;
       
   139 
   133 	// do HTTP call
   140 	// do HTTP call
   134 	CURLcode result = curl_easy_perform(impl->curl);
   141 	CURLcode result = curl_easy_perform(impl->curl);
   135 
   142 
   136 	if (result == CURLE_OK) {
   143 	if (result == CURLE_OK) {
   137 
   144 
   141 		response.body = impl->responseBody.str();
   148 		response.body = impl->responseBody.str();
   142 		impl->responseBody = std::stringstream();
   149 		impl->responseBody = std::stringstream();
   143 
   150 
   144 		return response;
   151 		return response;
   145 	} else {
   152 	} else {
   146 		throw Exception(curl_easy_strerror(result));
   153 		throw Exception(curl_easy_strerror(result), impl->curlErrorBuffer);
   147 	}
   154 	}
   148 }
   155 }
   149 
   156 
   150 
   157 
   151 }
   158 }