src/HTTPHandler.h
branchv_0
changeset 6 59c9ca066322
parent 5 165f6162524d
child 7 0b0374746e48
--- a/src/HTTPHandler.h	Sat Mar 12 20:48:25 2022 +0100
+++ b/src/HTTPHandler.h	Sun Mar 13 01:17:59 2022 +0100
@@ -49,9 +49,25 @@
 	Configuration configuration;
 	std::vector<relpipe::reader::handlers::AttributeMetadata> currentReaderMetadata;
 	std::vector<relpipe::writer::AttributeMetadata> currentWriterMetadata;
+	std::vector<relpipe::common::type::StringX> responseHeaders;
 	size_t currentAttributeIndex = 0;
 	size_t currentRecordNumber = 1;
 
+	void writeHeaders() {
+		if (responseHeaders.size()) {
+			relationalWriter->startRelation(L"response_header",{
+				// TODO: request ID instead of URL (or both)
+				{L"url", relpipe::writer::TypeId::STRING},
+				{L"name", relpipe::writer::TypeId::STRING},
+				{L"value", relpipe::writer::TypeId::STRING},
+			}, true);
+
+			for (auto s : responseHeaders) relationalWriter->writeAttribute(s);
+
+			responseHeaders.clear();
+		}
+	}
+
 public:
 
 	HTTPHandler(shared_ptr<relpipe::writer::RelationalWriter> relationalWriter, Configuration configuration) : relationalWriter(relationalWriter), configuration(configuration) {
@@ -62,6 +78,7 @@
 
 	void startRelation(relpipe::common::type::StringX name, std::vector<relpipe::reader::handlers::AttributeMetadata> attributes) override {
 
+		writeHeaders(); // from previous relation
 
 		relationalWriter->startRelation(name + L"_curl_info",{
 			{L"name", relpipe::writer::TypeId::STRING},
@@ -72,10 +89,11 @@
 		relationalWriter->writeAttribute(convertor.from_bytes(curl_version()));
 
 		relationalWriter->startRelation(name + L"_curl_response",{
+			// TODO: request ID
+			// TODO: body in hexadecimal/binary format
 			{L"url", relpipe::writer::TypeId::STRING},
 			{L"body", relpipe::writer::TypeId::STRING},
 			{L"response_code", relpipe::writer::TypeId::INTEGER},
-			// {L"success", relpipe::writer::TypeId::BOOLEAN},
 		}, true);
 
 	}
@@ -91,17 +109,19 @@
 		HTTPClient::Response response = http->exchange(request);
 		relpipe::common::type::Integer responseCode = response.responseCode;
 
-		// std::cerr << "url = >>>" << convertor.to_bytes(value) << "<<<" << std::endl;
-		// std::cerr << "body = >>>" << response.body << "<<<" << std::endl;
-
 		relationalWriter->writeAttribute(value);
 		relationalWriter->writeAttribute(convertor.from_bytes(response.body));
 		relationalWriter->writeAttribute(&responseCode, typeid (responseCode));
-		// relationalWriter->writeAttribute(&response.success, typeid (response.success));
+
+		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]));
+		}
 	}
 
 	void endOfPipe() {
-
+		writeHeaders(); // from last relation
 	}
 
 };