mirror of
https://github.com/yhirose/cpp-httplib.git
synced 2026-10-24 12:04:40 +00:00
Add tests for Unicode path component decoding in decode_path_component function
This commit is contained in:
1 parent
83e98a28dd
commit
43a54a3e3d
2 files changed
+15
-1
No files matched your search
@@ -9292,7 +9292,8 @@ inline std::string decode_path_component(const std::string &component) {
|
|||||||
// Unicode %uXXXX encoding
|
// Unicode %uXXXX encoding
|
||||||
auto val = 0;
|
auto val = 0;
|
||||||
if (detail::from_hex_to_i(component, i + 2, 4, val)) {
|
if (detail::from_hex_to_i(component, i + 2, 4, val)) {
|
||||||
// 4 digits Unicode codes
|
// 4 digits Unicode codes: val is 0x0000-0xFFFF (from 4 hex digits),
|
||||||
|
// so to_utf8 writes at most 3 bytes. buff[4] is safe.
|
||||||
char buff[4];
|
char buff[4];
|
||||||
size_t len = detail::to_utf8(val, buff);
|
size_t len = detail::to_utf8(val, buff);
|
||||||
if (len > 0) { result.append(buff, len); }
|
if (len > 0) { result.append(buff, len); }
|
||||||
|
|||||||
@@ -413,6 +413,19 @@ TEST(DecodePathTest, PercentCharacterNUL) {
|
|||||||
EXPECT_EQ(decode_path_component("x%00x"), expected);
|
EXPECT_EQ(decode_path_component("x%00x"), expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(DecodePathTest, UnicodeEncoding) {
|
||||||
|
// %u0041 = 'A' (1-byte UTF-8)
|
||||||
|
EXPECT_EQ("A", decode_path_component("%u0041"));
|
||||||
|
// %u00E9 = 'é' (2-byte UTF-8)
|
||||||
|
EXPECT_EQ(U8("é"), decode_path_component("%u00E9"));
|
||||||
|
// %u3042 = 'あ' (3-byte UTF-8)
|
||||||
|
EXPECT_EQ(U8("あ"), decode_path_component("%u3042"));
|
||||||
|
// %uFFFF = max 4-digit hex (3-byte UTF-8, must not overflow buff[4])
|
||||||
|
EXPECT_FALSE(decode_path_component("%uFFFF").empty());
|
||||||
|
// %uD800 = surrogate (invalid, silently dropped)
|
||||||
|
EXPECT_EQ("", decode_path_component("%uD800"));
|
||||||
|
}
|
||||||
|
|
||||||
TEST(SanitizeFilenameTest, VariousPatterns) {
|
TEST(SanitizeFilenameTest, VariousPatterns) {
|
||||||
// Path traversal
|
// Path traversal
|
||||||
EXPECT_EQ("passwd", httplib::sanitize_filename("../../../etc/passwd"));
|
EXPECT_EQ("passwd", httplib::sanitize_filename("../../../etc/passwd"));
|
||||||
|
|||||||
Reference in new issue
Block a user