# HG changeset patch # User František Kučera # Date 1647382920 -3600 # Node ID 9fdbfbe24161a349d641f42d5ec306bd0b2c1a58 # Parent 3f4e609903932224bff6a07c324a2e78a5535c87 throw and report exception on error (e.g. 'Couldn't connect to server') diff -r 3f4e60990393 -r 9fdbfbe24161 src/HTTPClient.cpp --- a/src/HTTPClient.cpp Tue Mar 15 01:47:05 2022 +0100 +++ b/src/HTTPClient.cpp Tue Mar 15 23:22:00 2022 +0100 @@ -104,7 +104,7 @@ // 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... @@ -129,15 +129,20 @@ }); // do HTTP call - curl_easy_perform(impl->curl); + CURLcode result = curl_easy_perform(impl->curl); + + if (result == CURLE_OK) { - // 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(); - impl->responseBody = std::stringstream(); + // 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(); + impl->responseBody = std::stringstream(); - return response; + return response; + } else { + throw Exception(curl_easy_strerror(result)); + } } diff -r 3f4e60990393 -r 9fdbfbe24161 src/HTTPClient.h --- a/src/HTTPClient.h Tue Mar 15 01:47:05 2022 +0100 +++ b/src/HTTPClient.h Tue Mar 15 23:22:00 2022 +0100 @@ -18,6 +18,7 @@ #include #include +#include #include @@ -66,6 +67,17 @@ std::string body; }; + class Exception : public std::runtime_error { + public: + + Exception(const std::string& message) : runtime_error(message) { + } + + Exception(const char* message) : runtime_error(message) { + } + + }; + virtual ~HTTPClient(); HTTPClient(const HTTPClient&) = delete; HTTPClient& operator=(const HTTPClient&) = delete; diff -r 3f4e60990393 -r 9fdbfbe24161 src/HTTPHandler.h --- a/src/HTTPHandler.h Tue Mar 15 01:47:05 2022 +0100 +++ b/src/HTTPHandler.h Tue Mar 15 23:22:00 2022 +0100 @@ -148,18 +148,27 @@ request.headers.push_back(convertor.to_bytes(h.value)); } - HTTPClient::Response response = http->exchange(request); - relpipe::common::type::Integer responseCode = response.responseCode; + std::string body; + relpipe::common::type::Integer responseCode = -1; + + try { + HTTPClient::Response response = http->exchange(request); + responseCode = response.responseCode; + body = response.body; + + for (size_t i = 0; i < response.headers.size(); i += 2) { + responseHeaders.push_back(convertor.from_bytes(request.url)); + responseHeaders.push_back(convertor.from_bytes(response.headers[i])); + responseHeaders.push_back(convertor.from_bytes(response.headers[i + 1])); + } + } catch (const HTTPClient::Exception& e) { + body = e.what(); + // TODO: move error message into separate attribute? + } relationalWriter->writeAttribute(value); - relationalWriter->writeAttribute(convertor.from_bytes(response.body)); + relationalWriter->writeAttribute(convertor.from_bytes(body)); relationalWriter->writeAttribute(&responseCode, typeid (responseCode)); - - for (size_t i = 0; i < response.headers.size(); i += 2) { - responseHeaders.push_back(convertor.from_bytes(request.url)); - responseHeaders.push_back(convertor.from_bytes(response.headers[i])); - responseHeaders.push_back(convertor.from_bytes(response.headers[i + 1])); - } } public: