--- 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();
}
}