src/HTTPHandler.h
branchv_0
changeset 17 aa43616375c6
parent 15 25be376736cc
child 18 d8efcefdf906
equal deleted inserted replaced
16:60688cf1f165 17:aa43616375c6
    89 		else if (value == L"DELETE") return HTTPClient::Method::DELETE;
    89 		else if (value == L"DELETE") return HTTPClient::Method::DELETE;
    90 		else if (value == L"PATCH") return HTTPClient::Method::PATCH;
    90 		else if (value == L"PATCH") return HTTPClient::Method::PATCH;
    91 		else throw std::invalid_argument("Unsupported HTTP method: " + convertor.to_bytes(value));
    91 		else throw std::invalid_argument("Unsupported HTTP method: " + convertor.to_bytes(value));
    92 	}
    92 	}
    93 
    93 
       
    94 	relpipe::common::type::StringX getHeaderAttributePrefix() {
       
    95 		// might be configurable - parametrized
       
    96 		return L"header.";
       
    97 	}
       
    98 
       
    99 	bool isHeaderAttribute(const relpipe::common::type::StringX& attributeName) {
       
   100 		return attributeName.rfind(getHeaderAttributePrefix(), 0) == 0;
       
   101 	}
       
   102 
       
   103 	relpipe::common::type::StringX fetchHeaderName(const relpipe::common::type::StringX& attributeName) {
       
   104 		return attributeName.substr(getHeaderAttributePrefix().size());
       
   105 	}
       
   106 
       
   107 	void appendRequestHeader(const relpipe::common::type::StringX& name, const relpipe::common::type::StringX& value) {
       
   108 		request.headers.push_back(convertor.to_bytes(name));
       
   109 		request.headers.push_back(convertor.to_bytes(value));
       
   110 	}
       
   111 
    94 public:
   112 public:
    95 
   113 
    96 	HTTPHandler(shared_ptr<relpipe::writer::RelationalWriter> relationalWriter, Configuration configuration) : relationalWriter(relationalWriter), configuration(configuration) {
   114 	HTTPHandler(shared_ptr<relpipe::writer::RelationalWriter> relationalWriter, Configuration configuration) : relationalWriter(relationalWriter), configuration(configuration) {
    97 	}
   115 	}
    98 
   116 
   126 	}
   144 	}
   127 
   145 
   128 private:
   146 private:
   129 
   147 
   130 	void headerAttribute(const relpipe::common::type::StringX& value) {
   148 	void headerAttribute(const relpipe::common::type::StringX& value) {
   131 		if (currentReaderMetadata[currentAttributeIndex].getAttributeName() == L"name") requestHeader.name = value;
   149 		auto attributeName = currentReaderMetadata[currentAttributeIndex].getAttributeName();
   132 		else if (currentReaderMetadata[currentAttributeIndex].getAttributeName() == L"value") requestHeader.value = value;
   150 
   133 		else throw std::invalid_argument("Unsupported attribute in the header relation: " + convertor.to_bytes(currentReaderMetadata[currentAttributeIndex].getAttributeName() + L" = " + value));
   151 		if (attributeName == L"name") requestHeader.name = value;
       
   152 		else if (attributeName == L"value") requestHeader.value = value;
       
   153 		else throw std::invalid_argument("Unsupported attribute in the header relation: " + convertor.to_bytes(attributeName + L" = " + value));
   134 
   154 
   135 		currentAttributeIndex++;
   155 		currentAttributeIndex++;
   136 
   156 
   137 		if (currentAttributeIndex % currentReaderMetadata.size() == 0) {
   157 		if (currentAttributeIndex % currentReaderMetadata.size() == 0) {
   138 			currentAttributeIndex = 0;
   158 			currentAttributeIndex = 0;
   141 		}
   161 		}
   142 
   162 
   143 	}
   163 	}
   144 
   164 
   145 	void requestAttribute(const relpipe::common::type::StringX& value) {
   165 	void requestAttribute(const relpipe::common::type::StringX& value) {
   146 		if (currentReaderMetadata[currentAttributeIndex].getAttributeName() == L"url") request.url = convertor.to_bytes(value);
   166 		auto attributeName = currentReaderMetadata[currentAttributeIndex].getAttributeName();
   147 		else if (currentReaderMetadata[currentAttributeIndex].getAttributeName() == L"method") request.method = parseMethod(value);
   167 
   148 		else throw std::invalid_argument("Unsupported attribute in the header relation: " + convertor.to_bytes(currentReaderMetadata[currentAttributeIndex].getAttributeName() + L" = " + value));
   168 		if (attributeName == L"url") request.url = convertor.to_bytes(value);
       
   169 		else if (attributeName == L"method") request.method = parseMethod(value);
       
   170 		else if (isHeaderAttribute(attributeName)) appendRequestHeader(fetchHeaderName(attributeName), value);
       
   171 		else throw std::invalid_argument("Unsupported attribute in the header relation: " + convertor.to_bytes(attributeName + L" = " + value));
   149 
   172 
   150 		currentAttributeIndex++;
   173 		currentAttributeIndex++;
   151 
   174 
   152 		if (currentAttributeIndex % currentReaderMetadata.size() == 0) {
   175 		if (currentAttributeIndex % currentReaderMetadata.size() == 0) {
   153 			currentAttributeIndex = 0;
   176 			currentAttributeIndex = 0;
   154 			std::shared_ptr<HTTPClient> http(HTTPClient::open());
   177 			std::shared_ptr<HTTPClient> http(HTTPClient::open());
   155 
   178 
   156 			for (const HeaderDefinition& h : requestHeaders) {
   179 			for (const HeaderDefinition& h : requestHeaders) appendRequestHeader(h.name, h.value);
   157 				request.headers.push_back(convertor.to_bytes(h.name));
       
   158 				request.headers.push_back(convertor.to_bytes(h.value));
       
   159 			}
       
   160 
   180 
   161 			std::string body;
   181 			std::string body;
   162 			relpipe::common::type::Integer responseCode = -1;
   182 			relpipe::common::type::Integer responseCode = -1;
   163 
   183 
   164 			try {
   184 			try {
   177 			}
   197 			}
   178 
   198 
   179 			relationalWriter->writeAttribute(convertor.from_bytes(request.url));
   199 			relationalWriter->writeAttribute(convertor.from_bytes(request.url));
   180 			relationalWriter->writeAttribute(convertor.from_bytes(body));
   200 			relationalWriter->writeAttribute(convertor.from_bytes(body));
   181 			relationalWriter->writeAttribute(&responseCode, typeid (responseCode));
   201 			relationalWriter->writeAttribute(&responseCode, typeid (responseCode));
   182 			
   202 
   183 			request = HTTPClient::Request();
   203 			request = HTTPClient::Request();
   184 		}
   204 		}
   185 	}
   205 	}
   186 
   206 
   187 public:
   207 public: