throw and report exception on error (e.g. 'Couldn't connect to server')
--- 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));
+ }
}
--- 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 <string>
#include <vector>
+#include <stdexcept>
#include <relpipe/common/type/typedefs.h>
@@ -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;
--- 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: