src/HTTPClient.cpp
branchv_0
changeset 7 0b0374746e48
parent 6 59c9ca066322
child 9 9fdbfbe24161
equal deleted inserted replaced
6:59c9ca066322 7:0b0374746e48
    65 		return heathers;
    65 		return heathers;
    66 	}
    66 	}
    67 
    67 
    68 };
    68 };
    69 
    69 
       
    70 class CurlList {
       
    71 private:
       
    72 	curl_slist* list = nullptr;
       
    73 public:
       
    74 	CurlList() = default;
       
    75 	CurlList(const HTTPClient&) = delete;
       
    76 	CurlList& operator=(const CurlList&) = delete;
       
    77 
       
    78 	virtual ~CurlList() {
       
    79 		curl_slist_free_all(list);
       
    80 	}
       
    81 
       
    82 	void append(std::string item) {
       
    83 		list = curl_slist_append(list, item.c_str());
       
    84 	}
       
    85 
       
    86 	curl_slist* getList() {
       
    87 		return list;
       
    88 	}
       
    89 };
       
    90 
    70 HTTPClient* HTTPClient::open() {
    91 HTTPClient* HTTPClient::open() {
    71 	return new HTTPClient(new HTTPClient::HTTPClientImpl(curl_easy_init()));
    92 	return new HTTPClient(new HTTPClient::HTTPClientImpl(curl_easy_init()));
    72 }
    93 }
    73 
    94 
    74 HTTPClient::~HTTPClient() {
    95 HTTPClient::~HTTPClient() {
    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