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 |