diff --git a/tests/parse_test.cpp b/tests/parse_test.cpp index 2c74356..ddff80e 100644 --- a/tests/parse_test.cpp +++ b/tests/parse_test.cpp @@ -119,6 +119,11 @@ int main() { assert(hash("tesT")==hash("test")); assert(hash("test")!=hash("tset")); + auto percent_decoded="testing æøå !#$&'()*+,/:;=?@[]"; + auto percent_encoded="testing+æøå+%21%23%24%26%27%28%29%2A%2B%2C%2F%3A%3B%3D%3F%40%5B%5D"; + assert(Percent::encode(percent_decoded)==percent_encoded); + assert(Percent::decode(Percent::encode(percent_decoded))==percent_decoded); + ServerTest serverTest; serverTest.io_service=std::make_shared(); diff --git a/utility.hpp b/utility.hpp index ef2346c..e0605a2 100644 --- a/utility.hpp +++ b/utility.hpp @@ -50,8 +50,27 @@ typedef std::unordered_multimap= '&' && chr <= ',') || (chr >= '/' && chr <= ';') || chr == '=' || chr=='?' || chr == '@' || chr == '[' || chr == ']') + result += std::string("%") + hex_chars[chr >> 4] + hex_chars[chr & 15]; + else + result += chr; + } + + return result; + } + static std::string decode(const std::string &value) { std::string result; + result.reserve((value.size() + 2) / 3); // minimum size of result for(size_t i = 0; i < value.size(); ++i) { auto &chr = value[i];