# HG changeset patch # User František Kučera # Date 1647722418 -3600 # Node ID 25be376736cc17c06b6d23a6acdb8482ff7906a7 # Parent e41abdd36ff1521a06bd07306f32fa353c2a4e4d request methods support in HTTPHandler diff -r e41abdd36ff1 -r 25be376736cc 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 currentReaderMetadata; std::vector currentWriterMetadata; HeaderDefinition requestHeader; + HTTPClient::Request request; std::vector requestHeaders; std::vector 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 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 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 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: