mirror of
https://github.com/yhirose/cpp-httplib.git
synced 2026-10-11 17:12:49 +07:00
Make decode_uri the inverse of encode_uri (#2540)
decode_uri was a byte-for-byte copy of decode_uri_component: it decoded every
%XX, including escapes of the reserved characters that encode_uri leaves
literal. So decode_uri was not the inverse of encode_uri and promoted an
escaped delimiter into a real one -- decode_uri("http://h/a%2Fb") returned
"http://h/a/b". Keep escapes of the reserved set encode_uri preserves, matching
JS decodeURI; non-reserved escapes still decode.
This commit is contained in:
@@ -719,6 +719,22 @@ TEST(DecodeUriTest, TestRoundTripWithEncodeUri) {
|
||||
EXPECT_EQ(decoded, original);
|
||||
}
|
||||
|
||||
TEST(DecodeUriTest, KeepsReservedCharacterEscapes) {
|
||||
// decode_uri is the inverse of encode_uri: an escaped reserved character
|
||||
// stays encoded so it is not promoted into a real delimiter, while
|
||||
// non-reserved escapes still decode (like JS decodeURI).
|
||||
EXPECT_EQ(httplib::decode_uri("%2F"), "%2F");
|
||||
EXPECT_EQ(httplib::decode_uri("%23"), "%23");
|
||||
EXPECT_EQ(httplib::decode_uri("%3F%3A%40%26%3D%2B%24%2C%3B"),
|
||||
"%3F%3A%40%26%3D%2B%24%2C%3B");
|
||||
EXPECT_EQ(httplib::decode_uri("%2D"), "-");
|
||||
EXPECT_EQ(httplib::decode_uri("%20"), " ");
|
||||
EXPECT_EQ(httplib::decode_uri("http://example.com/a%2Fb"),
|
||||
"http://example.com/a%2Fb");
|
||||
// decode_uri_component still decodes the reserved character.
|
||||
EXPECT_EQ(httplib::decode_uri_component("%2F"), "/");
|
||||
}
|
||||
|
||||
TEST(DecodeUriComponentTest, TestRoundTripWithEncodeUriComponent) {
|
||||
string original = "Piri Tommy Villiers - on & on";
|
||||
string encoded = httplib::encode_uri_component(original);
|
||||
|
||||
Reference in New Issue
Block a user