src/HTTPClient.cpp
branchv_0
changeset 7 0b0374746e48
parent 6 59c9ca066322
child 9 9fdbfbe24161
--- 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();