| 4663 | } |
| 4664 | |
| 4665 | inline void parse_query_text(const char *data, std::size_t size, |
| 4666 | Params ¶ms) { |
| 4667 | std::set<std::string> cache; |
| 4668 | split(data, data + size, '&', [&](const char *b, const char *e) { |
| 4669 | std::string kv(b, e); |
| 4670 | if (cache.find(kv) != cache.end()) { return; } |
| 4671 | cache.insert(std::move(kv)); |
| 4672 | |
| 4673 | std::string key; |
| 4674 | std::string val; |
| 4675 | divide(b, static_cast<std::size_t>(e - b), '=', |
| 4676 | [&](const char *lhs_data, std::size_t lhs_size, const char *rhs_data, |
| 4677 | std::size_t rhs_size) { |
| 4678 | key.assign(lhs_data, lhs_size); |
| 4679 | val.assign(rhs_data, rhs_size); |
| 4680 | }); |
| 4681 | |
| 4682 | if (!key.empty()) { |
| 4683 | params.emplace(decode_url(key, true), decode_url(val, true)); |
| 4684 | } |
| 4685 | }); |
| 4686 | } |
| 4687 | |
| 4688 | inline void parse_query_text(const std::string &s, Params ¶ms) { |
| 4689 | parse_query_text(s.data(), s.size(), params); |