From b1547d467e103bcce45a7414523305d878745f55 Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Wed, 17 Jun 2026 15:41:55 +0100 Subject: [PATCH] LibHTTP+LibWebView: Share Cookie conversion Nothing about `parsed_cookie_from_devtools_cookie()` is specific to DevTools, so move it to ParsedCookie.h as `parse_cookie()` instead. --- Libraries/LibHTTP/Cookie/ParsedCookie.cpp | 23 ++++++++++++++++++++ Libraries/LibHTTP/Cookie/ParsedCookie.h | 1 + Libraries/LibWebView/CookieJar.cpp | 26 ++--------------------- 3 files changed, 26 insertions(+), 24 deletions(-) diff --git a/Libraries/LibHTTP/Cookie/ParsedCookie.cpp b/Libraries/LibHTTP/Cookie/ParsedCookie.cpp index d7cd54728b..769a016ea3 100644 --- a/Libraries/LibHTTP/Cookie/ParsedCookie.cpp +++ b/Libraries/LibHTTP/Cookie/ParsedCookie.cpp @@ -101,6 +101,29 @@ Optional parse_cookie(URL::URL const& url, StringView cookie_strin return parsed_cookie; } +ErrorOr parse_cookie(Cookie const& cookie) +{ + ParsedCookie parsed_cookie; + parsed_cookie.name = cookie.name; + parsed_cookie.value = cookie.value; + parsed_cookie.same_site_attribute = cookie.same_site; + parsed_cookie.path = cookie.path; + parsed_cookie.secure_attribute_present = cookie.secure; + parsed_cookie.http_only_attribute_present = cookie.http_only; + + if (!cookie.host_only) { + auto domain = cookie.domain.bytes_as_string_view(); + if (domain.starts_with('.')) + domain = domain.substring_view(1); + parsed_cookie.domain = domain.to_ascii_lowercase_string(); + } + + if (cookie.persistent) + parsed_cookie.expiry_time_from_expires_attribute = cookie.expiry_time; + + return parsed_cookie; +} + // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis-22#section-5.6-8 ErrorOr parse_attributes(URL::URL const& url, ParsedCookie& parsed_cookie, StringView unparsed_attributes) { diff --git a/Libraries/LibHTTP/Cookie/ParsedCookie.h b/Libraries/LibHTTP/Cookie/ParsedCookie.h index f18425a360..e4ff1d18dc 100644 --- a/Libraries/LibHTTP/Cookie/ParsedCookie.h +++ b/Libraries/LibHTTP/Cookie/ParsedCookie.h @@ -28,6 +28,7 @@ struct ParsedCookie { }; Optional parse_cookie(URL::URL const&, StringView cookie_string); +ErrorOr parse_cookie(Cookie const&); bool cookie_contains_invalid_control_character(StringView); Optional parse_cookie_date(StringView); diff --git a/Libraries/LibWebView/CookieJar.cpp b/Libraries/LibWebView/CookieJar.cpp index 2d5013dc1c..c9f563034a 100644 --- a/Libraries/LibWebView/CookieJar.cpp +++ b/Libraries/LibWebView/CookieJar.cpp @@ -30,29 +30,6 @@ static CookieStorageKey storage_key_for_cookie(HTTP::Cookie::Cookie const& cooki return { cookie.name, cookie.domain, cookie.path }; } -static HTTP::Cookie::ParsedCookie parsed_cookie_from_devtools_cookie(HTTP::Cookie::Cookie const& cookie) -{ - HTTP::Cookie::ParsedCookie parsed_cookie; - parsed_cookie.name = cookie.name; - parsed_cookie.value = cookie.value; - parsed_cookie.same_site_attribute = cookie.same_site; - parsed_cookie.path = cookie.path; - parsed_cookie.secure_attribute_present = cookie.secure; - parsed_cookie.http_only_attribute_present = cookie.http_only; - - if (!cookie.host_only) { - auto domain = cookie.domain.bytes_as_string_view(); - if (domain.starts_with('.')) - domain = domain.substring_view(1); - parsed_cookie.domain = domain.to_ascii_lowercase_string(); - } - - if (cookie.persistent) - parsed_cookie.expiry_time_from_expires_attribute = cookie.expiry_time; - - return parsed_cookie; -} - ErrorOr> CookieJar::create(Database::Database& database) { Statements statements {}; @@ -452,7 +429,8 @@ void CookieJar::update_cookie(HTTP::Cookie::Cookie cookie) ErrorOr CookieJar::set_cookie_from_devtools(URL::URL const& url, Optional old_key, HTTP::Cookie::Cookie cookie) { auto new_key = storage_key_for_cookie(cookie); - TRY(set_cookie(url, parsed_cookie_from_devtools_cookie(cookie), HTTP::Cookie::Source::Http)); + auto parsed_cookie = TRY(HTTP::Cookie::parse_cookie(cookie)); + TRY(set_cookie(url, parsed_cookie, HTTP::Cookie::Source::Http)); if (old_key.has_value() && *old_key != new_key) delete_cookie(*old_key);