src/HTTPHandler.h
branchv_0
changeset 19 0fc76872a921
parent 18 d8efcefdf906
child 20 cad9f6d421ee
equal deleted inserted replaced
18:d8efcefdf906 19:0fc76872a921
    62 	Configuration configuration;
    62 	Configuration configuration;
    63 	relpipe::common::type::StringX currentRelationName;
    63 	relpipe::common::type::StringX currentRelationName;
    64 	std::vector<relpipe::reader::handlers::AttributeMetadata> currentReaderMetadata;
    64 	std::vector<relpipe::reader::handlers::AttributeMetadata> currentReaderMetadata;
    65 	std::vector<relpipe::writer::AttributeMetadata> currentWriterMetadata;
    65 	std::vector<relpipe::writer::AttributeMetadata> currentWriterMetadata;
    66 	HeaderDefinition requestHeader;
    66 	HeaderDefinition requestHeader;
       
    67 	relpipe::common::type::StringX requestId;
    67 	HTTPClient::Request request;
    68 	HTTPClient::Request request;
    68 	std::vector<HeaderDefinition> requestHeaders;
    69 	std::vector<HeaderDefinition> requestHeaders;
    69 	std::vector<relpipe::common::type::StringX> responseHeaders;
    70 	std::vector<relpipe::common::type::StringX> responseHeaders;
    70 	size_t currentAttributeIndex = 0;
    71 	size_t currentAttributeIndex = 0;
    71 	size_t currentRecordNumber = 1;
    72 	size_t currentRecordNumber = 1;
    72 
    73 
    73 	void writeHeaders() {
    74 	void writeHeaders() {
    74 		if (responseHeaders.size()) {
    75 		if (responseHeaders.size()) {
    75 			relationalWriter->startRelation(L"header",{
    76 			relationalWriter->startRelation(L"header",{
    76 				// TODO: request ID instead of URL (or both)
    77 				{L"request", relpipe::writer::TypeId::STRING},
    77 				{L"url", relpipe::writer::TypeId::STRING},
    78 				{L"url", relpipe::writer::TypeId::STRING},
    78 				{L"name", relpipe::writer::TypeId::STRING},
    79 				{L"name", relpipe::writer::TypeId::STRING},
    79 				{L"value", relpipe::writer::TypeId::STRING},
    80 				{L"value", relpipe::writer::TypeId::STRING},
    80 			}, true);
    81 			}, true);
    81 
    82 
   131 
   132 
   132 		if (currentRelationName == L"header") {
   133 		if (currentRelationName == L"header") {
   133 			// TODO: analyze header attributes
   134 			// TODO: analyze header attributes
   134 		} else if (currentRelationName == L"request") {
   135 		} else if (currentRelationName == L"request") {
   135 			relationalWriter->startRelation(L"response",{
   136 			relationalWriter->startRelation(L"response",{
   136 				// TODO: request ID
       
   137 				// TODO: body in hexadecimal/binary format
   137 				// TODO: body in hexadecimal/binary format
       
   138 				{L"request", relpipe::writer::TypeId::STRING},
   138 				{L"url", relpipe::writer::TypeId::STRING},
   139 				{L"url", relpipe::writer::TypeId::STRING},
   139 				{L"body", relpipe::writer::TypeId::STRING},
   140 				{L"body", relpipe::writer::TypeId::STRING},
   140 				{L"code", relpipe::writer::TypeId::INTEGER},
   141 				{L"code", relpipe::writer::TypeId::INTEGER},
   141 			}, true);
   142 			}, true);
   142 		}
   143 		}
   169 	}
   170 	}
   170 
   171 
   171 	void requestAttribute(const relpipe::common::type::StringX& value) {
   172 	void requestAttribute(const relpipe::common::type::StringX& value) {
   172 		auto attributeName = currentReaderMetadata[currentAttributeIndex].getAttributeName();
   173 		auto attributeName = currentReaderMetadata[currentAttributeIndex].getAttributeName();
   173 
   174 
   174 		if (attributeName == L"url") request.url = convertor.to_bytes(value);
   175 		if (attributeName == L"id") requestId = value;
       
   176 		else if (attributeName == L"url") request.url = convertor.to_bytes(value);
   175 		else if (attributeName == L"method") request.method = parseMethod(value);
   177 		else if (attributeName == L"method") request.method = parseMethod(value);
   176 		else if (isHeaderAttribute(attributeName)) appendRequestHeader(fetchHeaderName(attributeName), value);
   178 		else if (isHeaderAttribute(attributeName)) appendRequestHeader(fetchHeaderName(attributeName), value);
   177 		else throw std::invalid_argument("Unsupported attribute in the header relation: " + convertor.to_bytes(attributeName + L" = " + value));
   179 		else throw std::invalid_argument("Unsupported attribute in the header relation: " + convertor.to_bytes(attributeName + L" = " + value));
   178 
   180 
   179 		currentAttributeIndex++;
   181 		currentAttributeIndex++;
   191 				HTTPClient::Response response = http->exchange(request);
   193 				HTTPClient::Response response = http->exchange(request);
   192 				responseCode = response.responseCode;
   194 				responseCode = response.responseCode;
   193 				body = response.body;
   195 				body = response.body;
   194 
   196 
   195 				for (size_t i = 0; i < response.headers.size(); i += 2) {
   197 				for (size_t i = 0; i < response.headers.size(); i += 2) {
       
   198 					responseHeaders.push_back(requestId);
   196 					responseHeaders.push_back(convertor.from_bytes(request.url));
   199 					responseHeaders.push_back(convertor.from_bytes(request.url));
   197 					responseHeaders.push_back(convertor.from_bytes(response.headers[i]));
   200 					responseHeaders.push_back(convertor.from_bytes(response.headers[i]));
   198 					responseHeaders.push_back(convertor.from_bytes(response.headers[i + 1]));
   201 					responseHeaders.push_back(convertor.from_bytes(response.headers[i + 1]));
   199 				}
   202 				}
   200 			} catch (const HTTPClient::Exception& e) {
   203 			} catch (const HTTPClient::Exception& e) {
   201 				body = e.getFullMessage();
   204 				body = e.getFullMessage();
   202 				// TODO: move error message into separate attribute?
   205 				// TODO: move error message into separate attribute?
   203 			}
   206 			}
   204 
   207 
       
   208 			relationalWriter->writeAttribute(requestId);
   205 			relationalWriter->writeAttribute(convertor.from_bytes(request.url));
   209 			relationalWriter->writeAttribute(convertor.from_bytes(request.url));
   206 			relationalWriter->writeAttribute(convertor.from_bytes(body));
   210 			relationalWriter->writeAttribute(convertor.from_bytes(body));
   207 			relationalWriter->writeAttribute(&responseCode, typeid (responseCode));
   211 			relationalWriter->writeAttribute(&responseCode, typeid (responseCode));
   208 
   212 
   209 			request = HTTPClient::Request();
   213 			request = HTTPClient::Request();
       
   214 			requestId.clear();
   210 		}
   215 		}
   211 	}
   216 	}
   212 
   217 
   213 public:
   218 public:
   214 
   219