From 3724ce765ea0fa24b11f6e57d9e0625b7fb94c62 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 9 Apr 2022 18:34:49 +0200 Subject: [PATCH] AK+LibWeb: Encode ' ' as '+' in application/x-www-form-urlencoded This matches what the URL and HTML specifications ask us to do. --- AK/URL.cpp | 7 +++++-- AK/URL.h | 6 +++++- Userland/Libraries/LibWeb/URL/URLSearchParams.cpp | 4 ++-- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/AK/URL.cpp b/AK/URL.cpp index dfc68bbd7e..7d4e1ee19e 100644 --- a/AK/URL.cpp +++ b/AK/URL.cpp @@ -403,11 +403,14 @@ void URL::append_percent_encoded_if_necessary(StringBuilder& builder, u32 code_p builder.append_code_point(code_point); } -String URL::percent_encode(StringView input, URL::PercentEncodeSet set) +String URL::percent_encode(StringView input, URL::PercentEncodeSet set, SpaceAsPlus space_as_plus) { StringBuilder builder; for (auto code_point : Utf8View(input)) { - append_percent_encoded_if_necessary(builder, code_point, set); + if (space_as_plus == SpaceAsPlus::Yes && code_point == ' ') + builder.append('+'); + else + append_percent_encoded_if_necessary(builder, code_point, set); } return builder.to_string(); } diff --git a/AK/URL.h b/AK/URL.h index 647998df64..880dadae58 100644 --- a/AK/URL.h +++ b/AK/URL.h @@ -104,7 +104,11 @@ public: static u16 default_port_for_scheme(StringView); static bool is_special_scheme(StringView); - static String percent_encode(StringView input, PercentEncodeSet set = PercentEncodeSet::Userinfo); + enum class SpaceAsPlus { + No, + Yes, + }; + static String percent_encode(StringView input, PercentEncodeSet set = PercentEncodeSet::Userinfo, SpaceAsPlus = SpaceAsPlus::No); static String percent_decode(StringView input); bool operator==(URL const& other) const { return equals(other, ExcludeFragment::No); } diff --git a/Userland/Libraries/LibWeb/URL/URLSearchParams.cpp b/Userland/Libraries/LibWeb/URL/URLSearchParams.cpp index b4ff650856..9eca8ac532 100644 --- a/Userland/Libraries/LibWeb/URL/URLSearchParams.cpp +++ b/Userland/Libraries/LibWeb/URL/URLSearchParams.cpp @@ -16,9 +16,9 @@ String url_encode(Vector const& pairs, AK::URL::PercentEncodeSet per { StringBuilder builder; for (size_t i = 0; i < pairs.size(); ++i) { - builder.append(AK::URL::percent_encode(pairs[i].name, percent_encode_set)); + builder.append(AK::URL::percent_encode(pairs[i].name, percent_encode_set, AK::URL::SpaceAsPlus::Yes)); builder.append('='); - builder.append(AK::URL::percent_encode(pairs[i].value, percent_encode_set)); + builder.append(AK::URL::percent_encode(pairs[i].value, percent_encode_set, AK::URL::SpaceAsPlus::Yes)); if (i != pairs.size() - 1) builder.append('&'); }