diff --git a/include/crow/query_string.h b/include/crow/query_string.h index 13a3d3fe0..b12a6ea59 100644 --- a/include/crow/query_string.h +++ b/include/crow/query_string.h @@ -203,7 +203,7 @@ inline char * qs_k2v(const char * key, char * const * qs_kv, size_t qs_kv_size, inline std::unique_ptr> qs_dict_name2kv(const char * dict_name, char * const * qs_kv, size_t qs_kv_size, int nth = 0) { size_t i; - size_t name_len, skip_to_eq, skip_to_brace_open, skip_to_brace_close; + size_t name_len, eq_pos, key_size; name_len = strlen(dict_name); @@ -212,29 +212,22 @@ inline std::unique_ptr> qs_dict_name2kv(cons #else // _qsSORTING for(i=0; i 0 && - skip_to_brace_close > 0 && - nth == 0 ) - { - auto key = std::string(qs_kv[i] + skip_to_brace_open, skip_to_brace_close - skip_to_brace_open); - auto value = std::string(qs_kv[i] + skip_to_eq); - return std::unique_ptr>(new std::pair(key, value)); - } - else - { - --nth; - } + auto sub_key = std::string(key.get() + name_len + 1, key_size - name_len - 2); + auto value = std::string(qs_kv[i] + eq_pos + 1); + return std::unique_ptr>(new std::pair(sub_key, value)); } } #endif // _qsSORTING diff --git a/tests/query_string_tests.cpp b/tests/query_string_tests.cpp index 94e98f863..d62ef65e3 100644 --- a/tests/query_string_tests.cpp +++ b/tests/query_string_tests.cpp @@ -42,4 +42,20 @@ TEST_CASE( "query string keys" ) return key == entry.first;}); REQUIRE(exist == true); } +} + +TEST_CASE("query string decoding in get_dict") +{ + const std::vector> params{ + {"foo%5Bkey1%5D", "bar1"}, + {"foo%5Bkey2%5D", "bar2"}, + {"foo%5B%5D", "bar3"}, + {"foo%5B%5D", "bar4"}, + {"foo%5B%5Bkey%5D", "bar%5B%1%5D"}}; + const crow::query_string query_params("params?" + buildQueryStr(params)); + auto map = query_params.get_dict("foo"); + REQUIRE(map["key1"] == "bar1"); + REQUIRE(map["key2"] == "bar2"); + REQUIRE(map[""] == "bar3"); + REQUIRE(map["[key"] == "bar["); } \ No newline at end of file