From 239b108fa77c8dca9c44fc63aeb905a41a7e924b Mon Sep 17 00:00:00 2001 From: Veloman Yunkan Date: Wed, 18 Jan 2023 16:42:59 +0400 Subject: [PATCH] / is no longer a reserved char for urlEncode() This change is a quick hack solving known issues with URI-encoding in libkiwix. This change removes the slash character from the list of URL separator symbols in URL encoding/decoding utilities, and makes it a symbol that is safe to leave unencoded. Effects: - `urlEncode()` never encodes the '/' symbol (even when it is requested to encode the URL separator symbols too). - `urlDecode(str)`/`urlDecode(..., false)` will now decode %2F to '/'; other encoded URL separator symbols are NOT decoded when the second argument of `urlDecode()` is set to false (which is the default). --- src/tools/stringTools.cpp | 2 +- test/server.cpp | 4 ++-- test/stringTools.cpp | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/tools/stringTools.cpp b/src/tools/stringTools.cpp index c0e42cb05..3477aaaee 100644 --- a/src/tools/stringTools.cpp +++ b/src/tools/stringTools.cpp @@ -172,7 +172,6 @@ bool isReservedUrlChar(char c) switch (c) { case ';': case ',': - case '/': case '?': case ':': case '@': @@ -206,6 +205,7 @@ bool isHarmlessUriChar(char c) case '\'': case '(': case ')': + case '/': return true; } return false; diff --git a/test/server.cpp b/test/server.cpp index 78f56ecdc..29f1885b1 100644 --- a/test/server.cpp +++ b/test/server.cpp @@ -1156,7 +1156,7 @@ TEST_F(ServerTest, RandomPageRedirectsToAnExistingArticle) auto g = zfs1_->GET("/ROOT/random?content=zimfile"); ASSERT_EQ(302, g->status); ASSERT_TRUE(g->has_header("Location")); - ASSERT_TRUE(kiwix::startsWith(g->get_header_value("Location"), "/ROOT/content/zimfile/A%2F")); + ASSERT_TRUE(kiwix::startsWith(g->get_header_value("Location"), "/ROOT/content/zimfile/A/")); ASSERT_EQ(getCacheControlHeader(*g), "max-age=0, must-revalidate"); ASSERT_FALSE(g->has_header("ETag")); } @@ -1224,7 +1224,7 @@ TEST_F(ServerTest, BookMainPageIsRedirectedToArticleIndex) auto g = zfs1_->GET("/ROOT/content/zimfile"); ASSERT_EQ(302, g->status); ASSERT_TRUE(g->has_header("Location")); - ASSERT_EQ("/ROOT/content/zimfile/A%2Findex", g->get_header_value("Location")); + ASSERT_EQ("/ROOT/content/zimfile/A/index", g->get_header_value("Location")); } } diff --git a/test/stringTools.cpp b/test/stringTools.cpp index 890688756..102e9bf0d 100644 --- a/test/stringTools.cpp +++ b/test/stringTools.cpp @@ -110,8 +110,8 @@ namespace URLEncoding const char letters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; const char digits[] = "0123456789"; -const char nonEncodableSymbols[] = ".-_~()*!"; -const char uriDelimSymbols[] = ":/@?=+&#$;,"; +const char nonEncodableSymbols[] = ".-_~()*!/"; +const char uriDelimSymbols[] = ":@?=+&#$;,"; const char otherSymbols[] = R"(`%^[]{}\|"<>)"; @@ -135,7 +135,7 @@ TEST(stringTools, urlEncode) EXPECT_EQ(urlEncode(nonEncodableSymbols, true), nonEncodableSymbols); EXPECT_EQ(urlEncode(uriDelimSymbols), uriDelimSymbols); - EXPECT_EQ(urlEncode(uriDelimSymbols, true), "%3A%2F%40%3F%3D%2B%26%23%24%3B%2C"); + EXPECT_EQ(urlEncode(uriDelimSymbols, true), "%3A%40%3F%3D%2B%26%23%24%3B%2C"); EXPECT_EQ(urlEncode(otherSymbols), "%60%25%5E%5B%5D%7B%7D%5C%7C%22%3C%3E"); EXPECT_EQ(urlEncode(otherSymbols), urlEncode(otherSymbols, true));