1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 04:07:44 +00:00

LibWeb: Make extract_header_list_values differentiate parsing failures

Previously, parsing failures and the header not existing made
extract_header_list_values return an empty Optional, making it
impossible to differentiate between the two.

Required for implementing CORS-preflight, where parsing failures for
the headers makes it fail, but not having them doesn't make it fail in
all cases.
This commit is contained in:
Luke Wilde 2023-02-08 23:32:44 +00:00 committed by Linus Groh
parent bf2895365b
commit 237df9df5c
3 changed files with 14 additions and 9 deletions

View file

@ -104,13 +104,17 @@ ErrorOr<Optional<AK::URL>> Response::location_url(Optional<DeprecatedString> con
return Optional<AK::URL> {};
// 2. Let location be the result of extracting header list values given `Location` and responses header list.
auto location_values = TRY(extract_header_list_values("Location"sv.bytes(), m_header_list));
if (!location_values.has_value() || location_values->size() != 1)
auto location_values_or_failure = TRY(extract_header_list_values("Location"sv.bytes(), m_header_list));
if (location_values_or_failure.has<Infrastructure::ExtractHeaderParseFailure>() || location_values_or_failure.has<Empty>())
return Optional<AK::URL> {};
auto const& location_values = location_values_or_failure.get<Vector<ByteBuffer>>();
if (location_values.size() != 1)
return Optional<AK::URL> {};
// 3. If location is a header value, then set location to the result of parsing location with responses URL.
auto base_url = *url();
auto location = AK::URLParser::parse(location_values->first(), &base_url);
auto location = AK::URLParser::parse(location_values.first(), &base_url);
if (!location.is_valid())
return Error::from_string_view("Invalid 'Location' header URL"sv);