/ 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).
This commit is contained in:
Veloman Yunkan 2023-01-18 16:42:59 +04:00
parent c5ccbd37e2
commit 239b108fa7
3 changed files with 6 additions and 6 deletions

View File

@ -172,7 +172,6 @@ bool isReservedUrlChar(char c)
switch (c) { switch (c) {
case ';': case ';':
case ',': case ',':
case '/':
case '?': case '?':
case ':': case ':':
case '@': case '@':
@ -206,6 +205,7 @@ bool isHarmlessUriChar(char c)
case '\'': case '\'':
case '(': case '(':
case ')': case ')':
case '/':
return true; return true;
} }
return false; return false;

View File

@ -1156,7 +1156,7 @@ TEST_F(ServerTest, RandomPageRedirectsToAnExistingArticle)
auto g = zfs1_->GET("/ROOT/random?content=zimfile"); auto g = zfs1_->GET("/ROOT/random?content=zimfile");
ASSERT_EQ(302, g->status); ASSERT_EQ(302, g->status);
ASSERT_TRUE(g->has_header("Location")); 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_EQ(getCacheControlHeader(*g), "max-age=0, must-revalidate");
ASSERT_FALSE(g->has_header("ETag")); ASSERT_FALSE(g->has_header("ETag"));
} }
@ -1224,7 +1224,7 @@ TEST_F(ServerTest, BookMainPageIsRedirectedToArticleIndex)
auto g = zfs1_->GET("/ROOT/content/zimfile"); auto g = zfs1_->GET("/ROOT/content/zimfile");
ASSERT_EQ(302, g->status); ASSERT_EQ(302, g->status);
ASSERT_TRUE(g->has_header("Location")); 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"));
} }
} }

View File

@ -110,8 +110,8 @@ namespace URLEncoding
const char letters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; const char letters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
const char digits[] = "0123456789"; const char digits[] = "0123456789";
const char nonEncodableSymbols[] = ".-_~()*!"; const char nonEncodableSymbols[] = ".-_~()*!/";
const char uriDelimSymbols[] = ":/@?=+&#$;,"; const char uriDelimSymbols[] = ":@?=+&#$;,";
const char otherSymbols[] = R"(`%^[]{}\|"<>)"; const char otherSymbols[] = R"(`%^[]{}\|"<>)";
@ -135,7 +135,7 @@ TEST(stringTools, urlEncode)
EXPECT_EQ(urlEncode(nonEncodableSymbols, true), nonEncodableSymbols); EXPECT_EQ(urlEncode(nonEncodableSymbols, true), nonEncodableSymbols);
EXPECT_EQ(urlEncode(uriDelimSymbols), uriDelimSymbols); 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), "%60%25%5E%5B%5D%7B%7D%5C%7C%22%3C%3E");
EXPECT_EQ(urlEncode(otherSymbols), urlEncode(otherSymbols, true)); EXPECT_EQ(urlEncode(otherSymbols), urlEncode(otherSymbols, true));