/* * Copyright (c) 2021, Tim Flynn * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include namespace Browser { struct CookieStorageKey { bool operator==(CookieStorageKey const&) const = default; String name; String domain; String path; }; class CookieJar { public: String get_cookie(const URL& url, Web::Cookie::Source source); void set_cookie(const URL& url, Web::Cookie::ParsedCookie const& parsed_cookie, Web::Cookie::Source source); void dump_cookies() const; Vector get_all_cookies() const; private: static Optional canonicalize_domain(const URL& url); static bool domain_matches(String const& string, String const& domain_string); static bool path_matches(String const& request_path, String const& cookie_path); static String default_path(const URL& url); void store_cookie(Web::Cookie::ParsedCookie const& parsed_cookie, const URL& url, String canonicalized_domain, Web::Cookie::Source source); Vector get_matching_cookies(const URL& url, String const& canonicalized_domain, Web::Cookie::Source source); void purge_expired_cookies(); HashMap m_cookies; }; } namespace AK { template<> struct Traits : public GenericTraits { static unsigned hash(Browser::CookieStorageKey const& key) { unsigned hash = 0; hash = pair_int_hash(hash, string_hash(key.name.characters(), key.name.length())); hash = pair_int_hash(hash, string_hash(key.domain.characters(), key.domain.length())); hash = pair_int_hash(hash, string_hash(key.path.characters(), key.path.length())); return hash; } }; }