77 } |
98 } |
78 |
99 |
79 const HTTPClient::Response HTTPClient::exchange(const Request& request) { |
100 const HTTPClient::Response HTTPClient::exchange(const Request& request) { |
80 HTTPClient::Response response; |
101 HTTPClient::Response response; |
81 |
102 |
82 // TODO: set request headers |
|
83 // TODO: set request method |
103 // TODO: set request method |
84 // TODO: get response headers |
|
85 |
104 |
|
105 // set URL |
86 curl_easy_setopt(impl->curl, CURLOPT_URL, request.url.c_str()); |
106 curl_easy_setopt(impl->curl, CURLOPT_URL, request.url.c_str()); |
|
107 |
|
108 // set request headers |
|
109 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... |
|
111 curl_easy_setopt(impl->curl, CURLOPT_HTTPHEADER, requestHeders.getList()); |
87 |
112 |
88 typedef size_t(*CurlWriteCallback)(char*, size_t, size_t, HTTPClient::HTTPClientImpl*); |
113 typedef size_t(*CurlWriteCallback)(char*, size_t, size_t, HTTPClient::HTTPClientImpl*); |
89 |
114 |
|
115 // set response body callback |
90 curl_easy_setopt(impl->curl, CURLOPT_WRITEDATA, impl); |
116 curl_easy_setopt(impl->curl, CURLOPT_WRITEDATA, impl); |
91 curl_easy_setopt(impl->curl, CURLOPT_WRITEFUNCTION, (CurlWriteCallback)[](char* buffer, size_t size, size_t nmemb, HTTPClient::HTTPClientImpl * impl)->size_t { |
117 curl_easy_setopt(impl->curl, CURLOPT_WRITEFUNCTION, (CurlWriteCallback)[](char* buffer, size_t size, size_t nmemb, HTTPClient::HTTPClientImpl * impl)->size_t { |
92 size_t r = size * nmemb; |
118 size_t r = size * nmemb; |
93 impl->responseBody.write(buffer, r); |
119 impl->responseBody.write(buffer, r); |
94 return r; |
120 return r; |
95 }); |
121 }); |
96 |
122 |
|
123 // set response headers callback |
97 curl_easy_setopt(impl->curl, CURLOPT_HEADERDATA, impl); |
124 curl_easy_setopt(impl->curl, CURLOPT_HEADERDATA, impl); |
98 curl_easy_setopt(impl->curl, CURLOPT_HEADERFUNCTION, (CurlWriteCallback)[](char* buffer, size_t size, size_t nmemb, HTTPClient::HTTPClientImpl * impl)->size_t { |
125 curl_easy_setopt(impl->curl, CURLOPT_HEADERFUNCTION, (CurlWriteCallback)[](char* buffer, size_t size, size_t nmemb, HTTPClient::HTTPClientImpl * impl)->size_t { |
99 size_t r = size * nmemb; |
126 size_t r = size * nmemb; |
100 impl->responseHeaders.write(buffer, r); |
127 impl->responseHeaders.write(buffer, r); |
101 return r; |
128 return r; |
102 }); |
129 }); |
103 |
130 |
|
131 // do HTTP call |
104 curl_easy_perform(impl->curl); |
132 curl_easy_perform(impl->curl); |
105 |
133 |
|
134 // response code and fill the result object |
106 curl_easy_getinfo(impl->curl, CURLINFO_RESPONSE_CODE, &response.responseCode); |
135 curl_easy_getinfo(impl->curl, CURLINFO_RESPONSE_CODE, &response.responseCode); |
107 response.headers = impl->getResponseHeaders(); |
136 response.headers = impl->getResponseHeaders(); |
108 response.body = impl->responseBody.str(); |
137 response.body = impl->responseBody.str(); |
109 impl->responseBody = std::stringstream(); |
138 impl->responseBody = std::stringstream(); |
110 |
139 |