libutil: fix non-ASCII chars in URL encoding

Due to the cast to (unsigned int), the encoding appended broken
bytes padding. This is fixed here with a bitmask.

Fixes: #562
Change-Id: I0c93bd2b8c2f82df208d4693b7254544e3121dc3
This commit is contained in:
Emilia Bopp 2024-11-10 14:39:21 +01:00
parent d1d96cc4c8
commit a378c61948
2 changed files with 7 additions and 2 deletions

View file

@ -104,7 +104,7 @@ std::string percentEncode(std::string_view s, std::string_view keep)
|| keep.find(c) != std::string::npos) || keep.find(c) != std::string::npos)
res += c; res += c;
else else
res += fmt("%%%02X", (unsigned int) c); res += fmt("%%%02X", 0xff & (unsigned int) c);
return res; return res;
} }

View file

@ -303,7 +303,6 @@ namespace nix {
ASSERT_EQ(d, s); ASSERT_EQ(d, s);
} }
/* ---------------------------------------------------------------------------- /* ----------------------------------------------------------------------------
* percentEncode * percentEncode
* --------------------------------------------------------------------------*/ * --------------------------------------------------------------------------*/
@ -336,4 +335,10 @@ namespace nix {
ASSERT_EQ(d, s); ASSERT_EQ(d, s);
} }
TEST(percentEncode, utf8Input) {
std::string s = percentEncode("ä");
std::string d = "%C3%A4";
ASSERT_EQ(d, s);
}
} }