request methods support in HTTPHandler v_0
authorFrantišek Kučera <franta-hg@frantovo.cz>
Sat, 19 Mar 2022 21:40:18 +0100
branchv_0
changeset 15 25be376736cc
parent 14 e41abdd36ff1
child 16 60688cf1f165
request methods support in HTTPHandler
src/HTTPHandler.h
--- a/src/HTTPHandler.h	Sat Mar 19 00:49:47 2022 +0100
+++ b/src/HTTPHandler.h	Sat Mar 19 21:40:18 2022 +0100
@@ -59,6 +59,7 @@
 	std::vector<relpipe::reader::handlers::AttributeMetadata> currentReaderMetadata;
 	std::vector<relpipe::writer::AttributeMetadata> currentWriterMetadata;
 	HeaderDefinition requestHeader;
+	HTTPClient::Request request;
 	std::vector<HeaderDefinition> requestHeaders;
 	std::vector<relpipe::common::type::StringX> responseHeaders;
 	size_t currentAttributeIndex = 0;
@@ -79,6 +80,17 @@
 		}
 	}
 
+	HTTPClient::Method parseMethod(const relpipe::common::type::StringX& value) {
+		if (value.size() == 0) return HTTPClient::Method::GET;
+		else if (value == L"GET") return HTTPClient::Method::GET;
+		else if (value == L"HEAD") return HTTPClient::Method::HEAD;
+		else if (value == L"POST") return HTTPClient::Method::POST;
+		else if (value == L"PUT") return HTTPClient::Method::PUT;
+		else if (value == L"DELETE") return HTTPClient::Method::DELETE;
+		else if (value == L"PATCH") return HTTPClient::Method::PATCH;
+		else throw std::invalid_argument("Unsupported HTTP method: " + convertor.to_bytes(value));
+	}
+
 public:
 
 	HTTPHandler(shared_ptr<relpipe::writer::RelationalWriter> relationalWriter, Configuration configuration) : relationalWriter(relationalWriter), configuration(configuration) {
@@ -92,6 +104,7 @@
 
 		currentRelationName = name;
 		currentReaderMetadata = attributes;
+		currentAttributeIndex = 0;
 
 		if (currentRelationName == L"header") {
 			// TODO: analyze header attributes
@@ -130,45 +143,45 @@
 	}
 
 	void requestAttribute(const relpipe::common::type::StringX& value) {
-		std::shared_ptr<HTTPClient> http(HTTPClient::open());
+		if (currentReaderMetadata[currentAttributeIndex].getAttributeName() == L"url") request.url = convertor.to_bytes(value);
+		else if (currentReaderMetadata[currentAttributeIndex].getAttributeName() == L"method") request.method = parseMethod(value);
+		else throw std::invalid_argument("Unsupported attribute in the header relation: " + convertor.to_bytes(currentReaderMetadata[currentAttributeIndex].getAttributeName() + L" = " + value));
 
-		HTTPClient::Request request;
-		request.method = HTTPClient::Method::GET;
-		request.url = convertor.to_bytes(value);
+		currentAttributeIndex++;
 
-		// TODO: set request headers from the "header" relation
-		// request.headers.push_back("Authorization");
-		// request.headers.push_back("Basic YWhvajpoZXNsbw==");
-		// request.headers.push_back("Accept");
-		// request.headers.push_back("application/xml");
-		// request.headers.push_back("User-Agent");
-		// request.headers.push_back("curl/7.58.0");
-		for (const HeaderDefinition& h : requestHeaders) {
-			request.headers.push_back(convertor.to_bytes(h.name));
-			request.headers.push_back(convertor.to_bytes(h.value));
-		}
+		if (currentAttributeIndex % currentReaderMetadata.size() == 0) {
+			currentAttributeIndex = 0;
+			std::shared_ptr<HTTPClient> http(HTTPClient::open());
+
+			for (const HeaderDefinition& h : requestHeaders) {
+				request.headers.push_back(convertor.to_bytes(h.name));
+				request.headers.push_back(convertor.to_bytes(h.value));
+			}
+
+			std::string body;
+			relpipe::common::type::Integer responseCode = -1;
 
-		std::string body;
-		relpipe::common::type::Integer responseCode = -1;
-
-		try {
-			HTTPClient::Response response = http->exchange(request);
-			responseCode = response.responseCode;
-			body = response.body;
+			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]));
+				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.getFullMessage();
+				// TODO: move error message into separate attribute?
 			}
-		} catch (const HTTPClient::Exception& e) {
-			body = e.getFullMessage();
-			// TODO: move error message into separate attribute?
+
+			relationalWriter->writeAttribute(convertor.from_bytes(request.url));
+			relationalWriter->writeAttribute(convertor.from_bytes(body));
+			relationalWriter->writeAttribute(&responseCode, typeid (responseCode));
+			
+			request = HTTPClient::Request();
 		}
-
-		relationalWriter->writeAttribute(value);
-		relationalWriter->writeAttribute(convertor.from_bytes(body));
-		relationalWriter->writeAttribute(&responseCode, typeid (responseCode));
 	}
 
 public: