equal
deleted
inserted
replaced
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 } |