support also per-request headers v_0
authorFrantišek Kučera <franta-hg@frantovo.cz>
Tue, 22 Mar 2022 01:19:21 +0100
branchv_0
changeset 17 aa43616375c6
parent 16 60688cf1f165
child 18 d8efcefdf906
support also per-request headers
src/HTTPHandler.h
--- a/src/HTTPHandler.h	Sun Mar 20 02:27:57 2022 +0100
+++ b/src/HTTPHandler.h	Tue Mar 22 01:19:21 2022 +0100
@@ -91,6 +91,24 @@
 		else throw std::invalid_argument("Unsupported HTTP method: " + convertor.to_bytes(value));
 	}
 
+	relpipe::common::type::StringX getHeaderAttributePrefix() {
+		// might be configurable - parametrized
+		return L"header.";
+	}
+
+	bool isHeaderAttribute(const relpipe::common::type::StringX& attributeName) {
+		return attributeName.rfind(getHeaderAttributePrefix(), 0) == 0;
+	}
+
+	relpipe::common::type::StringX fetchHeaderName(const relpipe::common::type::StringX& attributeName) {
+		return attributeName.substr(getHeaderAttributePrefix().size());
+	}
+
+	void appendRequestHeader(const relpipe::common::type::StringX& name, const relpipe::common::type::StringX& value) {
+		request.headers.push_back(convertor.to_bytes(name));
+		request.headers.push_back(convertor.to_bytes(value));
+	}
+
 public:
 
 	HTTPHandler(shared_ptr<relpipe::writer::RelationalWriter> relationalWriter, Configuration configuration) : relationalWriter(relationalWriter), configuration(configuration) {
@@ -128,9 +146,11 @@
 private:
 
 	void headerAttribute(const relpipe::common::type::StringX& value) {
-		if (currentReaderMetadata[currentAttributeIndex].getAttributeName() == L"name") requestHeader.name = value;
-		else if (currentReaderMetadata[currentAttributeIndex].getAttributeName() == L"value") requestHeader.value = value;
-		else throw std::invalid_argument("Unsupported attribute in the header relation: " + convertor.to_bytes(currentReaderMetadata[currentAttributeIndex].getAttributeName() + L" = " + value));
+		auto attributeName = currentReaderMetadata[currentAttributeIndex].getAttributeName();
+
+		if (attributeName == L"name") requestHeader.name = value;
+		else if (attributeName == L"value") requestHeader.value = value;
+		else throw std::invalid_argument("Unsupported attribute in the header relation: " + convertor.to_bytes(attributeName + L" = " + value));
 
 		currentAttributeIndex++;
 
@@ -143,9 +163,12 @@
 	}
 
 	void requestAttribute(const relpipe::common::type::StringX& value) {
-		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));
+		auto attributeName = currentReaderMetadata[currentAttributeIndex].getAttributeName();
+
+		if (attributeName == L"url") request.url = convertor.to_bytes(value);
+		else if (attributeName == L"method") request.method = parseMethod(value);
+		else if (isHeaderAttribute(attributeName)) appendRequestHeader(fetchHeaderName(attributeName), value);
+		else throw std::invalid_argument("Unsupported attribute in the header relation: " + convertor.to_bytes(attributeName + L" = " + value));
 
 		currentAttributeIndex++;
 
@@ -153,10 +176,7 @@
 			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));
-			}
+			for (const HeaderDefinition& h : requestHeaders) appendRequestHeader(h.name, h.value);
 
 			std::string body;
 			relpipe::common::type::Integer responseCode = -1;
@@ -179,7 +199,7 @@
 			relationalWriter->writeAttribute(convertor.from_bytes(request.url));
 			relationalWriter->writeAttribute(convertor.from_bytes(body));
 			relationalWriter->writeAttribute(&responseCode, typeid (responseCode));
-			
+
 			request = HTTPClient::Request();
 		}
 	}