Resolves #184: further fixes to Percent::encode

This commit is contained in:
eidheim 2018-01-03 18:38:39 +01:00
commit d0a0ca2941
2 changed files with 6 additions and 8 deletions

View file

@ -121,15 +121,15 @@ int main() {
assert(hash("tesT") == hash("test")); assert(hash("tesT") == hash("test"));
assert(hash("test") != hash("tset")); assert(hash("test") != hash("tset"));
auto percent_decoded = "testing æøå !#$&'()*+,/:;=?@[]123"; auto percent_decoded = "testing æøå !#$&'()*+,/:;=?@[]123-._~\r\n";
auto percent_encoded = "testing+æøå+%21%23%24%26%27%28%29%2A%2B%2C%2F%3A%3B%3D%3F%40%5B%5D123"; auto percent_encoded = "testing%20%C3%A6%C3%B8%C3%A5%20%21%23%24%26%27%28%29%2A%2B%2C%2F%3A%3B%3D%3F%40%5B%5D123-._~%0D%0A";
assert(Percent::encode(percent_decoded) == percent_encoded); assert(Percent::encode(percent_decoded) == percent_encoded);
assert(Percent::decode(percent_encoded) == percent_decoded); assert(Percent::decode(percent_encoded) == percent_decoded);
assert(Percent::decode(Percent::encode(percent_decoded)) == percent_decoded); assert(Percent::decode(Percent::encode(percent_decoded)) == percent_decoded);
SimpleWeb::CaseInsensitiveMultimap fields = {{"test1", "æøå"}, {"test2", "!#$&'()*+,/:;=?@[]"}}; SimpleWeb::CaseInsensitiveMultimap fields = {{"test1", "æøå"}, {"test2", "!#$&'()*+,/:;=?@[]"}};
auto query_string1 = "test1=æøå&test2=%21%23%24%26%27%28%29%2A%2B%2C%2F%3A%3B%3D%3F%40%5B%5D"; auto query_string1 = "test1=%C3%A6%C3%B8%C3%A5&test2=%21%23%24%26%27%28%29%2A%2B%2C%2F%3A%3B%3D%3F%40%5B%5D";
auto query_string2 = "test2=%21%23%24%26%27%28%29%2A%2B%2C%2F%3A%3B%3D%3F%40%5B%5D&test1=æøå"; auto query_string2 = "test2=%21%23%24%26%27%28%29%2A%2B%2C%2F%3A%3B%3D%3F%40%5B%5D&test1=%C3%A6%C3%B8%C3%A5";
auto query_string_result = QueryString::create(fields); auto query_string_result = QueryString::create(fields);
assert(query_string_result == query_string1 || query_string_result == query_string2); assert(query_string_result == query_string1 || query_string_result == query_string2);
auto fields_result1 = QueryString::parse(query_string1); auto fields_result1 = QueryString::parse(query_string1);

View file

@ -46,10 +46,8 @@ namespace SimpleWeb {
result.reserve(value.size()); // Minimum size of result result.reserve(value.size()); // Minimum size of result
for(auto &chr : value) { for(auto &chr : value) {
if(chr == ' ') if(!((chr >= '0' && chr <= '9') || (chr >= 'A' && chr <= 'Z') || (chr >= 'a' && chr <= 'z') || chr == '-' || chr == '.' || chr == '_' || chr == '~'))
result += '+'; result += std::string("%") + hex_chars[static_cast<unsigned char>(chr) >> 4] + hex_chars[static_cast<unsigned char>(chr) & 15];
else if(chr == '!' || chr == '#' || chr == '$' || (chr >= '&' && chr <= ',') || chr == '/' || chr == ':' || chr == ';' || chr == '=' || chr == '?' || chr == '@' || chr == '[' || chr == ']')
result += std::string("%") + hex_chars[chr >> 4] + hex_chars[chr & 15];
else else
result += chr; result += chr;
} }