From 91be41599112b9388d798987591a4105e5e2738f Mon Sep 17 00:00:00 2001 From: Minh Vu Date: Sun, 14 Jun 2026 13:13:56 +0200 Subject: [PATCH] fix: encode high-bit URL bytes as unsigned --- src/iceberg/test/url_encoder_test.cc | 2 ++ src/iceberg/util/url_encoder.cc | 7 ++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/iceberg/test/url_encoder_test.cc b/src/iceberg/test/url_encoder_test.cc index fe22a9bb0..59f75a8e4 100644 --- a/src/iceberg/test/url_encoder_test.cc +++ b/src/iceberg/test/url_encoder_test.cc @@ -40,6 +40,7 @@ TEST(UrlEncoderTest, Encode) { ::testing::Eq("key%3Dvalue%26foo%3Dbar")); EXPECT_THAT(UrlEncoder::Encode("100%"), ::testing::Eq("100%25")); EXPECT_THAT(UrlEncoder::Encode("hello\x1fworld"), ::testing::Eq("hello%1Fworld")); + EXPECT_THAT(UrlEncoder::Encode("caf\xC3\xA9"), ::testing::Eq("caf%C3%A9")); EXPECT_THAT(UrlEncoder::Encode(""), ::testing::Eq("")); } @@ -69,6 +70,7 @@ TEST(UrlEncoderTest, EncodeDecodeRoundTrip) { "key=value&foo=bar", "100%", "hello\x1Fworld", + "caf\xC3\xA9", "special!@#$%^&*()chars", "mixed-123_test.file~ok", ""}; diff --git a/src/iceberg/util/url_encoder.cc b/src/iceberg/util/url_encoder.cc index a6ae4fd86..5f2469f07 100644 --- a/src/iceberg/util/url_encoder.cc +++ b/src/iceberg/util/url_encoder.cc @@ -46,12 +46,13 @@ std::string UrlEncoder::Encode(std::string_view str_to_encode) { result.reserve(str_to_encode.size() * 3 / 2 /* Heuristic reservation */); for (char c : str_to_encode) { - if (IsUnreserved(c)) { + auto b = static_cast(c); + if (IsUnreserved(b)) { result += c; } else { result += '%'; - result += kHexChars[c >> 4]; - result += kHexChars[c & 0xF]; + result += kHexChars[b >> 4]; + result += kHexChars[b & 0xF]; } }