/* * Copyright (c) 2025-2026, Tim Flynn * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include #include #include #include #include namespace HTTP { class DiskCache { public: enum class Mode { Normal, // In partitioned mode, the cache is enabled as normal, but each RequestServer process operates with a unique // disk cache database. Partitioned, // In test mode, we only enable caching of responses on a per-request basis, signified by a request header. The // response headers will include some status on how the request was handled. Testing, }; static ErrorOr create(Mode); DiskCache(DiskCache&&); DiskCache& operator=(DiskCache&&); ~DiskCache(); Mode mode() const { return m_mode; } struct CacheHasOpenEntry { }; Variant, CacheHasOpenEntry> create_entry(CacheRequest&, URL::URL const&, StringView method, HeaderList const& request_headers, UnixDateTime request_start_time); enum class OpenMode { Read, Revalidate, }; Variant, CacheHasOpenEntry> open_entry(CacheRequest&, URL::URL const&, StringView method, HeaderList const& request_headers, CacheMode, OpenMode); void remove_entries_exceeding_cache_limit(); void set_maximum_disk_cache_size(u64 maximum_disk_cache_size); Requests::CacheSizes estimate_cache_size_accessed_since(UnixDateTime since); void remove_entries_accessed_since(UnixDateTime since); LexicalPath const& cache_directory() const { return m_cache_directory; } void cache_entry_closed(Badge, CacheEntry const&); private: DiskCache(Mode, NonnullRefPtr, LexicalPath cache_directory, CacheIndex); enum class CheckReaderEntries { No, Yes, }; bool check_if_cache_has_open_entry(CacheRequest&, u64 cache_key, URL::URL const&, CheckReaderEntries); void delete_entry(u64 cache_key, u64 vary_key); Mode m_mode; Optional m_partitioned_cache_key; NonnullRefPtr m_database; struct OpenCacheEntry { NonnullOwnPtr entry; WeakPtr request; }; HashMap, IdentityHashTraits> m_open_cache_entries; HashMap, 1>, IdentityHashTraits> m_requests_waiting_completion; LexicalPath m_cache_directory; CacheIndex m_index; }; }