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) { |