throw and report exception on error (e.g. 'Couldn't connect to server') v_0
authorFrantišek Kučera <franta-hg@frantovo.cz>
Tue, 15 Mar 2022 23:22:00 +0100
branchv_0
changeset 9 9fdbfbe24161
parent 8 3f4e60990393
child 10 479557122717
throw and report exception on error (e.g. 'Couldn't connect to server')
src/HTTPClient.cpp
src/HTTPClient.h
src/HTTPHandler.h
--- 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: