--- a/src/HTTPClient.cpp Sun Mar 13 01:17:59 2022 +0100
+++ b/src/HTTPClient.cpp Sun Mar 13 20:50:25 2022 +0100
@@ -67,6 +67,27 @@
};
+class CurlList {
+private:
+ curl_slist* list = nullptr;
+public:
+ CurlList() = default;
+ CurlList(const HTTPClient&) = delete;
+ CurlList& operator=(const CurlList&) = delete;
+
+ virtual ~CurlList() {
+ curl_slist_free_all(list);
+ }
+
+ void append(std::string item) {
+ list = curl_slist_append(list, item.c_str());
+ }
+
+ curl_slist* getList() {
+ return list;
+ }
+};
+
HTTPClient* HTTPClient::open() {
return new HTTPClient(new HTTPClient::HTTPClientImpl(curl_easy_init()));
}
@@ -79,14 +100,19 @@
const HTTPClient::Response HTTPClient::exchange(const Request& request) {
HTTPClient::Response response;
- // TODO: set request headers
// TODO: set request method
- // TODO: get response headers
+ // set URL
curl_easy_setopt(impl->curl, CURLOPT_URL, request.url.c_str());
+
+ // set request headers
+ CurlList requestHeders;
+ 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...
+ curl_easy_setopt(impl->curl, CURLOPT_HTTPHEADER, requestHeders.getList());
typedef size_t(*CurlWriteCallback)(char*, size_t, size_t, HTTPClient::HTTPClientImpl*);
+ // set response body callback
curl_easy_setopt(impl->curl, CURLOPT_WRITEDATA, impl);
curl_easy_setopt(impl->curl, CURLOPT_WRITEFUNCTION, (CurlWriteCallback)[](char* buffer, size_t size, size_t nmemb, HTTPClient::HTTPClientImpl * impl)->size_t {
size_t r = size * nmemb;
@@ -94,6 +120,7 @@
return r;
});
+ // set response headers callback
curl_easy_setopt(impl->curl, CURLOPT_HEADERDATA, impl);
curl_easy_setopt(impl->curl, CURLOPT_HEADERFUNCTION, (CurlWriteCallback)[](char* buffer, size_t size, size_t nmemb, HTTPClient::HTTPClientImpl * impl)->size_t {
size_t r = size * nmemb;
@@ -101,8 +128,10 @@
return r;
});
+ // do HTTP call
curl_easy_perform(impl->curl);
+ // response code and fill the result object
curl_easy_getinfo(impl->curl, CURLINFO_RESPONSE_CODE, &response.responseCode);
response.headers = impl->getResponseHeaders();
response.body = impl->responseBody.str();
--- a/src/HTTPHandler.h Sun Mar 13 01:17:59 2022 +0100
+++ b/src/HTTPHandler.h Sun Mar 13 20:50:25 2022 +0100
@@ -106,6 +106,14 @@
request.method = HTTPClient::Method::GET;
request.url = convertor.to_bytes(value);
+ // TODO: set request headers from the "header" relation
+ // request.headers.push_back("Authorization");
+ // request.headers.push_back("Basic YWhvajpoZXNsbw==");
+ // request.headers.push_back("Accept");
+ // request.headers.push_back("application/xml");
+ // request.headers.push_back("User-Agent");
+ // request.headers.push_back("curl/7.58.0");
+
HTTPClient::Response response = http->exchange(request);
relpipe::common::type::Integer responseCode = response.responseCode;