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)
res += c;
else
res += fmt("%%%02X", (unsigned int) c);
res += fmt("%%%02X", 0xff & (unsigned int) c);
return res;
}

View file

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