blob: a3f9c528e1d3dd399987750ca194c4f5e01cf098 [file]
// Copyright 2026 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SERVICES_NETWORK_PUBLIC_CPP_SHARED_HTTP_CACHE_CLIENT_H_
#define SERVICES_NETWORK_PUBLIC_CPP_SHARED_HTTP_CACHE_CLIENT_H_
#include <stddef.h>
#include <memory>
#include <optional>
#include "base/component_export.h"
#include "base/functional/callback_forward.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_refptr.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "services/network/public/mojom/shared_http_cache_client.mojom.h"
#include "services/network/public/mojom/url_response_head.mojom.h"
namespace network {
class DataBufferList;
class DataBufferFactory;
struct ResourceRequest;
// SharedHttpCacheClient provides client-side access to the SQLite-based shared
// HTTP cache in the renderer process (Renderer-Accessible HTTP Cache).
//
// It maintains a thread-safe in-memory LRU cache set of cached URL hashes to
// quickly determine if a resource might be available without disk I/O, and
// reads response data from the isolated SQLite database directly via
// sqlite_vfs, bypassing IPC to the network service on cache hits.
class COMPONENT_EXPORT(NETWORK_CPP) SharedHttpCacheClient
: public base::RefCountedThreadSafe<SharedHttpCacheClient> {
public:
static constexpr size_t kDefaultMaxCachedUrlHashes = 10000;
// Encapsulates the cached HTTP response headers and decoded body buffers.
struct COMPONENT_EXPORT(NETWORK_CPP) Response {
Response(network::mojom::URLResponseHeadPtr head,
std::unique_ptr<DataBufferList> body);
~Response();
Response(Response&&);
Response& operator=(Response&&);
Response(const Response&) = delete;
Response& operator=(const Response&) = delete;
network::mojom::URLResponseHeadPtr head;
std::unique_ptr<DataBufferList> body;
};
// Creates and initializes a SharedHttpCacheClient instance.
// `pending_receiver`: Mojo receiver for the SharedHttpCacheClientFactory
// interface.
// `client_task_runner`: Task runner for the client and receiving cache hash
// updates.
// `database_task_runner`: Task runner for executing SQLite database
// operations and hosting the DatabaseBackend factory receiver.
// `on_db_reader_initialized_callback`: Optional callback invoked on
// `database_task_runner` when the database reader finishes initialization.
// `max_cached_url_hashes`: Maximum number of URL hashes retained in the
// in-memory LRU cache set to cap memory usage in long-lived renderers.
static scoped_refptr<SharedHttpCacheClient> CreateAndInit(
mojo::PendingReceiver<network::mojom::SharedHttpCacheClientFactory>
pending_receiver,
scoped_refptr<base::SequencedTaskRunner> client_task_runner,
scoped_refptr<base::SequencedTaskRunner> database_task_runner,
base::OnceClosure on_db_reader_initialized_callback = base::OnceClosure(),
size_t max_cached_url_hashes = kDefaultMaxCachedUrlHashes);
SharedHttpCacheClient(const SharedHttpCacheClient&) = delete;
SharedHttpCacheClient& operator=(const SharedHttpCacheClient&) = delete;
// Queries the shared HTTP cache for `request`.
//
// If the request can be early-returned (e.g. if it is a revalidation request,
// or if the URL is not present in the in-memory cache lookup set), `callback`
// is invoked synchronously on the calling sequence with `std::nullopt`.
//
// Otherwise, the query is performed asynchronously. In this case, `callback`
// is guaranteed to be posted to `callback_task_runner` with a `Response` on
// cache hit, or with `std::nullopt` on cache miss, read error, or decoding
// failure.
virtual void Find(
const network::ResourceRequest& request,
scoped_refptr<DataBufferFactory> data_buffer_factory,
base::OnceCallback<void(std::optional<Response>)> callback,
scoped_refptr<base::SequencedTaskRunner> callback_task_runner) = 0;
protected:
friend class base::RefCountedThreadSafe<SharedHttpCacheClient>;
SharedHttpCacheClient() = default;
virtual ~SharedHttpCacheClient() = default;
};
} // namespace network
#endif // SERVICES_NETWORK_PUBLIC_CPP_SHARED_HTTP_CACHE_CLIENT_H_