/* * 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==(const CookieStorageKey&) 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, const Web::Cookie::ParsedCookie& 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(const String& string, const String& domain_string); static bool path_matches(const String& request_path, const String& cookie_path); static String default_path(const URL& url); void store_cookie(const Web::Cookie::ParsedCookie& parsed_cookie, const URL& url, String canonicalized_domain, Web::Cookie::Source source); Vector get_matching_cookies(const URL& url, const String& canonicalized_domain, Web::Cookie::Source source); void purge_expired_cookies(); HashMap m_cookies; }; } namespace AK { template<> struct Traits : public GenericTraits { static unsigned hash(const Browser::CookieStorageKey& 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; } }; }