--- 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: