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