AK+LibWeb: Encode ' ' as '+' in application/x-www-form-urlencoded

This matches what the URL and HTML specifications ask us to do.
This commit is contained in:
Andreas Kling 2022-04-09 18:34:49 +02:00
parent 74241527d7
commit 3724ce765e
Notes: sideshowbarker 2024-07-17 14:12:20 +09:00
3 changed files with 12 additions and 5 deletions

View file

@ -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();
}

View file

@ -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); }

View file

@ -16,9 +16,9 @@ String url_encode(Vector<QueryParam> 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('&');
}