equal
deleted
inserted
replaced
46 class HTTPHandler : public relpipe::reader::handlers::RelationalReaderStringHandler { |
46 class HTTPHandler : public relpipe::reader::handlers::RelationalReaderStringHandler { |
47 private: |
47 private: |
48 |
48 |
49 class HeaderDefinition { |
49 class HeaderDefinition { |
50 public: |
50 public: |
|
51 std::wregex request = std::wregex(L".*"); |
51 std::wregex url = std::wregex(L".*"); |
52 std::wregex url = std::wregex(L".*"); |
52 relpipe::common::type::StringX name; |
53 relpipe::common::type::StringX name; |
53 relpipe::common::type::StringX value; |
54 relpipe::common::type::StringX value; |
54 |
55 |
55 bool matches(const relpipe::common::type::StringX& url) const { |
56 bool matches(const relpipe::common::type::StringX& request, const relpipe::common::type::StringX& url) const { |
56 return std::regex_match(url, this->url); |
57 bool result = false; |
|
58 result |= std::regex_match(request, this->request); |
|
59 result |= std::regex_match(url, this->url); |
|
60 return result; |
57 } |
61 } |
58 }; |
62 }; |
59 |
63 |
60 std::wstring_convert<codecvt_utf8<wchar_t>> convertor; // TODO: support also other encodings. |
64 std::wstring_convert<codecvt_utf8<wchar_t>> convertor; // TODO: support also other encodings. |
61 shared_ptr<relpipe::writer::RelationalWriter> relationalWriter; |
65 shared_ptr<relpipe::writer::RelationalWriter> relationalWriter; |
154 void headerAttribute(const relpipe::common::type::StringX& value) { |
158 void headerAttribute(const relpipe::common::type::StringX& value) { |
155 auto attributeName = currentReaderMetadata[currentAttributeIndex].getAttributeName(); |
159 auto attributeName = currentReaderMetadata[currentAttributeIndex].getAttributeName(); |
156 |
160 |
157 if (attributeName == L"name") requestHeader.name = value; |
161 if (attributeName == L"name") requestHeader.name = value; |
158 else if (attributeName == L"value") requestHeader.value = value; |
162 else if (attributeName == L"value") requestHeader.value = value; |
|
163 else if (attributeName == L"request") requestHeader.request = std::wregex(value.size() ? value : L".*"); // TODO: null instead of empty value (when supported) |
159 else if (attributeName == L"url") requestHeader.url = std::wregex(value.size() ? value : L".*"); // TODO: null instead of empty value (when supported) |
164 else if (attributeName == L"url") requestHeader.url = std::wregex(value.size() ? value : L".*"); // TODO: null instead of empty value (when supported) |
160 else throw std::invalid_argument("Unsupported attribute in the header relation: " + convertor.to_bytes(attributeName + L" = " + value)); |
165 else throw std::invalid_argument("Unsupported attribute in the header relation: " + convertor.to_bytes(attributeName + L" = " + value)); |
161 |
166 |
162 currentAttributeIndex++; |
167 currentAttributeIndex++; |
163 |
168 |
182 |
187 |
183 if (currentAttributeIndex % currentReaderMetadata.size() == 0) { |
188 if (currentAttributeIndex % currentReaderMetadata.size() == 0) { |
184 currentAttributeIndex = 0; |
189 currentAttributeIndex = 0; |
185 std::shared_ptr<HTTPClient> http(HTTPClient::open()); |
190 std::shared_ptr<HTTPClient> http(HTTPClient::open()); |
186 |
191 |
187 for (const HeaderDefinition& h : requestHeaders) if (h.matches(convertor.from_bytes(request.url))) appendRequestHeader(h.name, h.value); |
192 for (const HeaderDefinition& h : requestHeaders) if (h.matches(requestId, convertor.from_bytes(request.url))) appendRequestHeader(h.name, h.value); |
188 |
193 |
189 std::string body; |
194 std::string body; |
190 relpipe::common::type::Integer responseCode = -1; |
195 relpipe::common::type::Integer responseCode = -1; |
191 |
196 |
192 try { |
197 try { |