1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file. 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This file declares a HttpTransactionFactory implementation that can be 6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// layered on top of another HttpTransactionFactory to add HTTP caching. The 7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// caching logic follows RFC 2616 (any exceptions are called out in the code). 8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The HttpCache takes a disk_cache::Backend as a parameter, and uses that for 10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// the cache storage. 11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// See HttpTransactionFactory and HttpTransaction for more details. 13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef NET_HTTP_HTTP_CACHE_H_ 15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define NET_HTTP_HTTP_CACHE_H_ 163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once 17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <list> 19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <set> 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string> 21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/basictypes.h" 23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/file_path.h" 24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/hash_tables.h" 25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h" 26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/weak_ptr.h" 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/message_loop_proxy.h" 28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/task.h" 293f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/threading/non_thread_safe.h" 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/base/cache_type.h" 31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/base/completion_callback.h" 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/load_states.h" 332557749644f9d25af9721533322db19197c49b49Kristian Monsen#include "net/base/net_export.h" 34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/http/http_transaction_factory.h" 35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass GURL; 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace disk_cache { 39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass Backend; 40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass Entry; 41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace net { 44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 4521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenclass CertVerifier; 46201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochclass DnsCertProvenanceChecker; 47731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass DnsRRResolver; 48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass HostResolver; 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass HttpAuthHandlerFactory; 50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass HttpNetworkSession; 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct HttpRequestInfo; 52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass HttpResponseInfo; 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass IOBuffer; 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass NetLog; 55dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass NetworkDelegate; 56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass ProxyService; 57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass SSLConfigService; 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ViewCacheHelper; 59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 602557749644f9d25af9721533322db19197c49b49Kristian Monsenclass NET_EXPORT HttpCache : public HttpTransactionFactory, 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public base::SupportsWeakPtr<HttpCache>, 623f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen public base::NonThreadSafe { 63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public: 64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The cache mode of operation. 65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott enum Mode { 66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Normal mode just behaves like a standard web cache. 67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott NORMAL = 0, 68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Record mode caches everything for purposes of offline playback. 69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott RECORD, 70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Playback mode replays from a cache without considering any 71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // standard invalidations. 72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott PLAYBACK, 73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Disables reads and writes from the cache. 74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Equivalent to setting LOAD_DISABLE_CACHE on every request. 75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DISABLE 76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // A BackendFactory creates a backend object to be used by the HttpCache. 792557749644f9d25af9721533322db19197c49b49Kristian Monsen class NET_EXPORT BackendFactory { 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual ~BackendFactory() {} 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The actual method to build the backend. Returns a net error code. If 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // ERR_IO_PENDING is returned, the |callback| will be notified when the 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // operation completes, and |backend| must remain valid until the 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // notification arrives. 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The implementation must not access the factory object after invoking the 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // |callback| because the object can be deleted from within the callback. 893f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen virtual int CreateBackend(NetLog* net_log, 903f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen disk_cache::Backend** backend, 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CompletionCallback* callback) = 0; 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // A default backend factory for the common use cases. 952557749644f9d25af9721533322db19197c49b49Kristian Monsen class NET_EXPORT DefaultBackend : public BackendFactory { 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // |path| is the destination for any files used by the backend, and 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // |cache_thread| is the thread where disk operations should take place. If 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // |max_bytes| is zero, a default value will be calculated automatically. 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DefaultBackend(CacheType type, const FilePath& path, int max_bytes, 101731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick base::MessageLoopProxy* thread); 102731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick virtual ~DefaultBackend(); 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns a factory for an in-memory cache. 105731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick static BackendFactory* InMemory(int max_bytes); 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // BackendFactory implementation. 1083f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen virtual int CreateBackend(NetLog* net_log, 1093f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen disk_cache::Backend** backend, 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CompletionCallback* callback); 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CacheType type_; 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const FilePath path_; 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int max_bytes_; 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<base::MessageLoopProxy> thread_; 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The disk cache is initialized lazily (by CreateTransaction) in this case. 120731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // The HttpCache takes ownership of the |backend_factory|. 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HttpCache(HostResolver* host_resolver, 12221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen CertVerifier* cert_verifier, 123731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DnsRRResolver* dnsrr_resolver, 124201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch DnsCertProvenanceChecker* dns_cert_checker, 125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ProxyService* proxy_service, 126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SSLConfigService* ssl_config_service, 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HttpAuthHandlerFactory* http_auth_handler_factory, 128dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen NetworkDelegate* network_delegate, 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NetLog* net_log, 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BackendFactory* backend_factory); 131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The disk cache is initialized lazily (by CreateTransaction) in this case. 133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Provide an existing HttpNetworkSession, the cache can construct a 134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // network layer with a shared HttpNetworkSession in order for multiple 13572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // network layers to share information (e.g. authentication data). The 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // HttpCache takes ownership of the |backend_factory|. 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HttpCache(HttpNetworkSession* session, BackendFactory* backend_factory); 138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Initialize the cache from its component parts, which is useful for 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // testing. The lifetime of the network_layer and backend_factory are managed 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // by the HttpCache and will be destroyed using |delete| when the HttpCache is 142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // destroyed. 143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HttpCache(HttpTransactionFactory* network_layer, 1443f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen NetLog* net_log, 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BackendFactory* backend_factory); 146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 14772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ~HttpCache(); 14872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HttpTransactionFactory* network_layer() { return network_layer_.get(); } 150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Retrieves the cache backend for this HttpCache instance. If the backend 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // is not initialized yet, this method will initialize it. The return value is 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // a network error code, and it could be ERR_IO_PENDING, in which case the 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // |callback| will be notified when the operation completes. The pointer that 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // receives the |backend| must remain valid until the operation completes. 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int GetBackend(disk_cache::Backend** backend, CompletionCallback* callback); 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns the current backend (can be NULL). 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch disk_cache::Backend* GetCurrentBackend(); 160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Given a header data blob, convert it to a response info object. 162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static bool ParseResponseInfo(const char* data, int len, 163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HttpResponseInfo* response_info, 164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool* response_truncated); 165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Writes |buf_len| bytes of metadata stored in |buf| to the cache entry 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // referenced by |url|, as long as the entry's |expected_response_time| has 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // not changed. This method returns without blocking, and the operation will 169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // be performed asynchronously without any completion notification. 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void WriteMetadata(const GURL& url, base::Time expected_response_time, 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IOBuffer* buf, int buf_len); 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Get/Set the cache's mode. 174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void set_mode(Mode value) { mode_ = value; } 175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Mode mode() { return mode_; } 176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Close currently active sockets so that fresh page loads will not use any 178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // recycled connections. For sockets currently in use, they may not close 179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // immediately, but they will not be reusable. This is for debugging. 180dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void CloseAllConnections(); 181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 18206a415ae34c4542ee5d53da5162fa48ec332bfaaKristian Monsen // Close all idle connections. Will close all sockets not in active use. 18306a415ae34c4542ee5d53da5162fa48ec332bfaaKristian Monsen void CloseIdleConnections(); 18406a415ae34c4542ee5d53da5162fa48ec332bfaaKristian Monsen 18572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // HttpTransactionFactory implementation: 18672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual int CreateTransaction(scoped_ptr<HttpTransaction>* trans); 18772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual HttpCache* GetCache(); 18872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual HttpNetworkSession* GetSession(); 18972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual void Suspend(bool suspend); 19072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected: 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Disk cache entry data indices. 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch enum { 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kResponseInfoIndex = 0, 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kResponseContentIndex, 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kMetadataIndex, 197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Must remain at the end of the enum. 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kNumCacheEntryDataIndices 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch friend class ViewCacheHelper; 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Types -------------------------------------------------------------------- 205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott class BackendCallback; 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch class MetadataWriter; 208731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick class SSLHostInfoFactoryAdaptor; 209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott class Transaction; 210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott class WorkItem; 211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott friend class Transaction; 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch struct PendingOp; // Info for an entry under construction. 213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott typedef std::list<Transaction*> TransactionList; 215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott typedef std::list<WorkItem*> WorkItemList; 216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct ActiveEntry { 21872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen explicit ActiveEntry(disk_cache::Entry* entry); 21972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ~ActiveEntry(); 22072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott disk_cache::Entry* disk_entry; 222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Transaction* writer; 223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TransactionList readers; 224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TransactionList pending_queue; 225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool will_process_pending_queue; 226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool doomed; 227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott typedef base::hash_map<std::string, ActiveEntry*> ActiveEntriesMap; 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch typedef base::hash_map<std::string, PendingOp*> PendingOpsMap; 231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott typedef std::set<ActiveEntry*> ActiveEntriesSet; 23272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen typedef base::hash_map<std::string, int> PlaybackCacheMap; 233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Methods ------------------------------------------------------------------ 235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Creates the |backend| object and notifies the |callback| when the operation 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // completes. Returns an error code. 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int CreateBackend(disk_cache::Backend** backend, 239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CompletionCallback* callback); 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Makes sure that the backend creation is complete before allowing the 242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // provided transaction to use the object. Returns an error code. |trans| 243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // will be notified via its IO callback if this method returns ERR_IO_PENDING. 244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The transaction is free to use the backend directly at any time after 245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // receiving the notification. 246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int GetBackendForTransaction(Transaction* trans); 247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Generates the cache key for this request. 249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string GenerateCacheKey(const HttpRequestInfo*); 250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Dooms the entry selected by |key|. |trans| will be notified via its IO 252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // callback if this method returns ERR_IO_PENDING. The entry can be 253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // currently in use or not. 254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int DoomEntry(const std::string& key, Transaction* trans); 255c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Dooms the entry selected by |key|. |trans| will be notified via its IO 257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // callback if this method returns ERR_IO_PENDING. The entry should not 258c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // be currently in use. 259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int AsyncDoomEntry(const std::string& key, Transaction* trans); 260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Closes a previously doomed entry. 262c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void FinalizeDoomedEntry(ActiveEntry* entry); 263c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 264c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Returns an entry that is currently in use and not doomed, or NULL. 265c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ActiveEntry* FindActiveEntry(const std::string& key); 266c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 267c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Creates a new ActiveEntry and starts tracking it. |disk_entry| is the disk 268513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // cache entry. 269513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ActiveEntry* ActivateEntry(disk_cache::Entry* disk_entry); 270c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 271c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Deletes an ActiveEntry. 272c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void DeactivateEntry(ActiveEntry* entry); 273c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 274c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Deletes an ActiveEntry using an exhaustive search. 275c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void SlowDeactivateEntry(ActiveEntry* entry); 276c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns the PendingOp for the desired |key|. If an entry is not under 278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // construction already, a new PendingOp structure is created. 279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PendingOp* GetPendingOp(const std::string& key); 280c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Deletes a PendingOp. 282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void DeletePendingOp(PendingOp* pending_op); 283c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 284c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Opens the disk cache entry associated with |key|, returning an ActiveEntry 285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // in |*entry|. |trans| will be notified via its IO callback if this method 286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // returns ERR_IO_PENDING. 287c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int OpenEntry(const std::string& key, ActiveEntry** entry, 288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Transaction* trans); 289c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 290c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Creates the disk cache entry associated with |key|, returning an 291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // ActiveEntry in |*entry|. |trans| will be notified via its IO callback if 292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // this method returns ERR_IO_PENDING. 293c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int CreateEntry(const std::string& key, ActiveEntry** entry, 294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Transaction* trans); 295c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 296c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Destroys an ActiveEntry (active or doomed). 297c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void DestroyEntry(ActiveEntry* entry); 298c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Adds a transaction to an ActiveEntry. If this method returns ERR_IO_PENDING 300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // the transaction will be notified about completion via its IO callback. This 301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // method returns ERR_CACHE_RACE to signal the transaction that it cannot be 302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // added to the provided entry, and it should retry the process with another 303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // one (in this case, the entry is no longer valid). 304c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int AddTransactionToEntry(ActiveEntry* entry, Transaction* trans); 305c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 306c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Called when the transaction has finished working with this entry. |cancel| 307c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // is true if the operation was cancelled by the caller instead of running 308c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // to completion. 309c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void DoneWithEntry(ActiveEntry* entry, Transaction* trans, bool cancel); 310c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 311c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Called when the transaction has finished writting to this entry. |success| 312c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // is false if the cache entry should be deleted. 313c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void DoneWritingToEntry(ActiveEntry* entry, bool success); 314c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 315c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Called when the transaction has finished reading from this entry. 316c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void DoneReadingFromEntry(ActiveEntry* entry, Transaction* trans); 317c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 318c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Convers the active writter transaction to a reader so that other 319c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // transactions can start reading from this entry. 320c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void ConvertWriterToReader(ActiveEntry* entry); 321c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns the LoadState of the provided pending transaction. 323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LoadState GetLoadStateForPendingTransaction(const Transaction* trans); 324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Removes the transaction |trans|, from the pending list of an entry 326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // (PendingOp, active or doomed entry). 327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void RemovePendingTransaction(Transaction* trans); 328c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 329c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Removes the transaction |trans|, from the pending list of |entry|. 330c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool RemovePendingTransactionFromEntry(ActiveEntry* entry, 331c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Transaction* trans); 332c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Removes the transaction |trans|, from the pending list of |pending_op|. 334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool RemovePendingTransactionFromPendingOp(PendingOp* pending_op, 335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Transaction* trans); 336c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 337c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Resumes processing the pending list of |entry|. 338c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void ProcessPendingQueue(ActiveEntry* entry); 339c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 340c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Events (called via PostTask) --------------------------------------------- 341c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 342c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void OnProcessPendingQueue(ActiveEntry* entry); 343c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 344c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Callbacks ---------------------------------------------------------------- 345c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 346c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Processes BackendCallback notifications. 347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void OnIOComplete(int result, PendingOp* entry); 348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Processes the backend creation notification. 350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void OnBackendCreated(int result, PendingOp* pending_op); 351c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 352c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 353c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Variables ---------------------------------------------------------------- 354c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3553f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen NetLog* net_log_; 3563f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 357c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Used when lazily constructing the disk_cache_. 358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<BackendFactory> backend_factory_; 359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool building_backend_; 360c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 361c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Mode mode_; 362c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 36372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const scoped_ptr<SSLHostInfoFactoryAdaptor> ssl_host_info_factory_; 364731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 36572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const scoped_ptr<HttpTransactionFactory> network_layer_; 366c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott scoped_ptr<disk_cache::Backend> disk_cache_; 367c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 368c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The set of active entries indexed by cache key. 369c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ActiveEntriesMap active_entries_; 370c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 371c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The set of doomed entries. 372c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ActiveEntriesSet doomed_entries_; 373c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 374c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The set of entries "under construction". 375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PendingOpsMap pending_ops_; 376c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 377c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ScopedRunnableMethodFactory<HttpCache> task_factory_; 378c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 379c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott scoped_ptr<PlaybackCacheMap> playback_cache_map_; 380c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 381c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DISALLOW_COPY_AND_ASSIGN(HttpCache); 382c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 383c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 384c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace net 385c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 386c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // NET_HTTP_HTTP_CACHE_H_ 387