|
@@ -8291,6 +8291,19 @@ inline std::string params_to_query_str(const Params ¶ms) {
|
|
|
return query;
|
|
return query;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+// Splits one "key=value" span of a query string at its first '='. A span with
|
|
|
|
|
+// no '=' at all lands entirely in key, leaving val empty, which is how a bare
|
|
|
|
|
+// "?flag" keeps its name.
|
|
|
|
|
+inline void divide_query_pair(const char *b, const char *e, std::string &key,
|
|
|
|
|
+ std::string &val) {
|
|
|
|
|
+ divide(b, static_cast<std::size_t>(e - b), '=',
|
|
|
|
|
+ [&](const char *lhs_data, std::size_t lhs_size, const char *rhs_data,
|
|
|
|
|
+ std::size_t rhs_size) {
|
|
|
|
|
+ key.assign(lhs_data, lhs_size);
|
|
|
|
|
+ val.assign(rhs_data, rhs_size);
|
|
|
|
|
+ });
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
inline void parse_query_text(const char *data, std::size_t size,
|
|
inline void parse_query_text(const char *data, std::size_t size,
|
|
|
Params ¶ms) {
|
|
Params ¶ms) {
|
|
|
std::set<std::string> cache;
|
|
std::set<std::string> cache;
|
|
@@ -8301,12 +8314,7 @@ inline void parse_query_text(const char *data, std::size_t size,
|
|
|
|
|
|
|
|
std::string key;
|
|
std::string key;
|
|
|
std::string val;
|
|
std::string val;
|
|
|
- divide(b, static_cast<std::size_t>(e - b), '=',
|
|
|
|
|
- [&](const char *lhs_data, std::size_t lhs_size, const char *rhs_data,
|
|
|
|
|
- std::size_t rhs_size) {
|
|
|
|
|
- key.assign(lhs_data, lhs_size);
|
|
|
|
|
- val.assign(rhs_data, rhs_size);
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ divide_query_pair(b, e, key, val);
|
|
|
|
|
|
|
|
if (!key.empty()) {
|
|
if (!key.empty()) {
|
|
|
params.emplace(decode_query_component(key), decode_query_component(val));
|
|
params.emplace(decode_query_component(key), decode_query_component(val));
|
|
@@ -8331,12 +8339,7 @@ inline std::string normalize_query_string(const std::string &query) {
|
|
|
[&](const char *b, const char *e) {
|
|
[&](const char *b, const char *e) {
|
|
|
std::string key;
|
|
std::string key;
|
|
|
std::string val;
|
|
std::string val;
|
|
|
- divide(b, static_cast<std::size_t>(e - b), '=',
|
|
|
|
|
- [&](const char *lhs_data, std::size_t lhs_size,
|
|
|
|
|
- const char *rhs_data, std::size_t rhs_size) {
|
|
|
|
|
- key.assign(lhs_data, lhs_size);
|
|
|
|
|
- val.assign(rhs_data, rhs_size);
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ divide_query_pair(b, e, key, val);
|
|
|
|
|
|
|
|
if (!key.empty()) {
|
|
if (!key.empty()) {
|
|
|
auto dec_key = decode_query_component(key);
|
|
auto dec_key = decode_query_component(key);
|