AK+LibHTTP: Ensure plus signs are percent encoded in query string

Adds a new optional parameter 'reserved_chars' to
AK::URL::percent_encode. This new optional parameter allows the caller
to specify custom characters to be percent encoded. This is then used
to percent encode plus signs by HttpRequest::to_raw_request.
This commit is contained in:
GeekFiftyFive 2022-03-31 16:29:25 +01:00 committed by Andreas Kling
parent 58398b1e12
commit 737f5b26b7
Notes: sideshowbarker 2024-07-17 16:19:00 +09:00
3 changed files with 7 additions and 7 deletions

View file

@ -395,19 +395,19 @@ constexpr bool code_point_is_in_percent_encode_set(u32 code_point, URL::PercentE
} }
} }
void URL::append_percent_encoded_if_necessary(StringBuilder& builder, u32 code_point, URL::PercentEncodeSet set) void URL::append_percent_encoded_if_necessary(StringBuilder& builder, u32 code_point, URL::PercentEncodeSet set, StringView reserved_chars)
{ {
if (code_point_is_in_percent_encode_set(code_point, set)) if (code_point_is_in_percent_encode_set(code_point, set) || (!reserved_chars.is_null() && reserved_chars.contains(code_point)))
append_percent_encoded(builder, code_point); append_percent_encoded(builder, code_point);
else else
builder.append_code_point(code_point); builder.append_code_point(code_point);
} }
String URL::percent_encode(StringView input, URL::PercentEncodeSet set) String URL::percent_encode(StringView input, URL::PercentEncodeSet set, StringView reserved_chars)
{ {
StringBuilder builder; StringBuilder builder;
for (auto code_point : Utf8View(input)) { for (auto code_point : Utf8View(input)) {
append_percent_encoded_if_necessary(builder, code_point, set); append_percent_encoded_if_necessary(builder, code_point, set, reserved_chars);
} }
return builder.to_string(); return builder.to_string();
} }

View file

@ -104,7 +104,7 @@ public:
static u16 default_port_for_scheme(StringView); static u16 default_port_for_scheme(StringView);
static bool is_special_scheme(StringView); static bool is_special_scheme(StringView);
static String percent_encode(StringView input, PercentEncodeSet set = PercentEncodeSet::Userinfo); static String percent_encode(StringView input, PercentEncodeSet set = PercentEncodeSet::Userinfo, StringView reserved_chars = {});
static String percent_decode(StringView input); static String percent_decode(StringView input);
bool operator==(URL const& other) const { return equals(other, ExcludeFragment::No); } bool operator==(URL const& other) const { return equals(other, ExcludeFragment::No); }
@ -122,7 +122,7 @@ private:
bool compute_validity() const; bool compute_validity() const;
String serialize_data_url() const; String serialize_data_url() const;
static void append_percent_encoded_if_necessary(StringBuilder&, u32 code_point, PercentEncodeSet set = PercentEncodeSet::Userinfo); static void append_percent_encoded_if_necessary(StringBuilder&, u32 code_point, PercentEncodeSet set = PercentEncodeSet::Userinfo, StringView reserved_chars = {});
static void append_percent_encoded(StringBuilder&, u32 code_point); static void append_percent_encoded(StringBuilder&, u32 code_point);
bool m_valid { false }; bool m_valid { false };

View file

@ -37,7 +37,7 @@ ByteBuffer HttpRequest::to_raw_request() const
builder.append(URL::percent_encode(m_url.path(), URL::PercentEncodeSet::EncodeURI)); builder.append(URL::percent_encode(m_url.path(), URL::PercentEncodeSet::EncodeURI));
if (!m_url.query().is_empty()) { if (!m_url.query().is_empty()) {
builder.append('?'); builder.append('?');
builder.append(URL::percent_encode(m_url.query(), URL::PercentEncodeSet::EncodeURI)); builder.append(URL::percent_encode(m_url.query(), URL::PercentEncodeSet::EncodeURI, "+"sv));
} }
builder.append(" HTTP/1.1\r\nHost: "); builder.append(" HTTP/1.1\r\nHost: ");
builder.append(m_url.host()); builder.append(m_url.host());