AK: Implement steps for state override in URL parser

This commit is contained in:
Shannon Booth 2023-07-14 12:58:16 +12:00 committed by Andreas Kling
parent 500097de82
commit 7ef4689383

View file

@ -320,21 +320,36 @@ URL URLParser::parse(StringView raw_input, Optional<URL> const& base_url, Option
}
// 2. Otherwise, if c is U+003A (:), then:
else if (code_point == ':') {
// FIXME: 1. If state override is given, then:
if (false) {
// FIXME: 1. If urls scheme is a special scheme and buffer is not a special scheme, then return.
// FIXME: 2. If urls scheme is a special scheme and buffer is not a special scheme, then return.
// FIXME: 3. If url includes credentials or has a non-null port, and buffer is "file", then return.
// FIXME: 4. If urls scheme is "file" and its host is an empty host, then return.
// 1. If state override is given, then:
if (state_override.has_value()) {
// 1. If urls scheme is a special scheme and buffer is not a special scheme, then return.
if (URL::is_special_scheme(url->scheme()) && !URL::is_special_scheme(buffer.string_view()))
return *url;
// 2. If urls scheme is not a special scheme and buffer is a special scheme, then return.
if (!URL::is_special_scheme(url->scheme()) && URL::is_special_scheme(buffer.string_view()))
return *url;
// 3. If url includes credentials or has a non-null port, and buffer is "file", then return.
if ((url->includes_credentials() || url->port().has_value()) && buffer.string_view() == "file"sv)
return *url;
// 4. If urls scheme is "file" and its host is an empty host, then return.
if (url->scheme() == "file"sv && url->host().is_empty())
return *url;
}
// 2. Set urls scheme to buffer.
url->m_scheme = buffer.to_deprecated_string();
// FIXME: 3. If state override is given, then:
if (false) {
// FIXME: 1. If urls port is urls schemes default port, then set urls port to null.
// FIXME: 2. Return.
// 3. If state override is given, then:
if (state_override.has_value()) {
// 1. If urls port is urls schemes default port, then set urls port to null.
if (url->port() == URL::default_port_for_scheme(url->scheme()))
url->m_port = {};
// 2. Return.
return *url;
}
// 4. Set buffer to the empty string.
@ -634,7 +649,9 @@ URL URLParser::parse(StringView raw_input, Optional<URL> const& base_url, Option
return {};
}
// FIXME: 2. If state override is given and state override is hostname state, then return.
// 2. If state override is given and state override is hostname state, then return.
if (state_override.has_value() && *state_override == State::Hostname)
return *url;
// 3. Let host be the result of host parsing buffer with url is not special.
auto host = parse_host(buffer.string_view(), !url->is_special());
@ -662,7 +679,9 @@ URL URLParser::parse(StringView raw_input, Optional<URL> const& base_url, Option
return {};
}
// FIXME: 2. Otherwise, if state override is given, buffer is the empty string, and either url includes credentials or urls port is non-null, return.
// 2. Otherwise, if state override is given, buffer is the empty string, and either url includes credentials or urls port is non-null, return.
if (state_override.has_value() && buffer.is_empty() && (url->includes_credentials() || url->port().has_value()))
return *url;
// 3. Let host be the result of host parsing buffer with url is not special.
auto host = parse_host(buffer.string_view(), !url->is_special());
@ -676,7 +695,10 @@ URL URLParser::parse(StringView raw_input, Optional<URL> const& base_url, Option
buffer.clear();
state = State::Port;
// FIXME: 6. If state override is given, then return.
// 6. If state override is given, then return.
if (state_override.has_value())
return *url;
continue;
}
@ -732,7 +754,9 @@ URL URLParser::parse(StringView raw_input, Optional<URL> const& base_url, Option
buffer.clear();
}
// FIXME: 2. If state override is given, then return.
// 2. If state override is given, then return.
if (state_override.has_value())
return *url;
// 3. Set state to path start state and decrease pointer by 1.
state = State::PathStart;
@ -855,7 +879,9 @@ URL URLParser::parse(StringView raw_input, Optional<URL> const& base_url, Option
// 1. Set urls host to the empty string.
url->m_host = "";
// FIXME: 2. If state override is given, then return.
// 2. If state override is given, then return.
if (state_override.has_value())
return *url;
// 3. Set state to path start state.
state = State::PathStart;
@ -877,7 +903,9 @@ URL URLParser::parse(StringView raw_input, Optional<URL> const& base_url, Option
// 4. Set urls host to host.
url->m_host = host.release_value();
// FIXME: 5. If state override is given, then return.
// 5. If state override is given, then return.
if (state_override.has_value())
return *url;
// 6. Set buffer to the empty string and state to path start state.
buffer.clear();