# HG changeset patch # User František Kučera # Date 1647908361 -3600 # Node ID aa43616375c61ec2d0420c646362acf55f62e6ab # Parent 60688cf1f165158b38d4f7dbc78483c2c49f8b29 support also per-request headers diff -r 60688cf1f165 -r aa43616375c6 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 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 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(); } }