15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file declares a HttpTransactionFactory implementation that can be 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// layered on top of another HttpTransactionFactory to add HTTP caching. The 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// caching logic follows RFC 2616 (any exceptions are called out in the code). 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The HttpCache takes a disk_cache::Backend as a parameter, and uses that for 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the cache storage. 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See HttpTransactionFactory and HttpTransaction for more details. 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NET_HTTP_HTTP_CACHE_H_ 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NET_HTTP_HTTP_CACHE_H_ 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <list> 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/non_thread_safe.h" 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/cache_type.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/completion_callback.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/load_states.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_export.h" 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/request_priority.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_network_session.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_transaction_factory.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GURL; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace base { 3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class SingleThreadTaskRunner; 4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} // namespace base 4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace disk_cache { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Backend; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Entry; 4503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} // namespace disk_cache 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CertVerifier; 505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class ChannelIDService; 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass DiskBasedCertCache; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HostResolver; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HttpAuthHandlerFactory; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HttpNetworkSession; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HttpResponseInfo; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HttpServerProperties; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IOBuffer; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NetLog; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NetworkDelegate; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProxyService; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SSLConfigService; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TransportSecurityState; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ViewCacheHelper; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct HttpRequestInfo; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT HttpCache : public HttpTransactionFactory, 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NON_EXPORTED_BASE(public base::NonThreadSafe) { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The cache mode of operation. 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum Mode { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Normal mode just behaves like a standard web cache. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NORMAL = 0, 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Record mode caches everything for purposes of offline playback. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RECORD, 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Playback mode replays from a cache without considering any 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // standard invalidations. 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PLAYBACK, 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disables reads and writes from the cache. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Equivalent to setting LOAD_DISABLE_CACHE on every request. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISABLE 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A BackendFactory creates a backend object to be used by the HttpCache. 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class NET_EXPORT BackendFactory { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~BackendFactory() {} 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The actual method to build the backend. Returns a net error code. If 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ERR_IO_PENDING is returned, the |callback| will be notified when the 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // operation completes, and |backend| must remain valid until the 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // notification arrives. 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The implementation must not access the factory object after invoking the 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |callback| because the object can be deleted from within the callback. 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int CreateBackend(NetLog* net_log, 95a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<disk_cache::Backend>* backend, 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompletionCallback& callback) = 0; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A default backend factory for the common use cases. 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class NET_EXPORT DefaultBackend : public BackendFactory { 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |path| is the destination for any files used by the backend, and 10303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // |thread| is the thread where disk operations should take place. If 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |max_bytes| is zero, a default value will be calculated automatically. 10503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DefaultBackend(CacheType type, 10603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) BackendType backend_type, 10703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const base::FilePath& path, 10803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) int max_bytes, 10903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const scoped_refptr<base::SingleThreadTaskRunner>& thread); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~DefaultBackend(); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a factory for an in-memory cache. 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static BackendFactory* InMemory(int max_bytes); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BackendFactory implementation. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int CreateBackend(NetLog* net_log, 117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<disk_cache::Backend>* backend, 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompletionCallback& callback) OVERRIDE; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CacheType type_; 122a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) BackendType backend_type_; 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath path_; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int max_bytes_; 12503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> thread_; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The disk cache is initialized lazily (by CreateTransaction) in this case. 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The HttpCache takes ownership of the |backend_factory|. 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpCache(const net::HttpNetworkSession::Params& params, 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendFactory* backend_factory); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // The disk cache is initialized lazily (by CreateTransaction) in this case. 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Provide an existing HttpNetworkSession, the cache can construct a 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // network layer with a shared HttpNetworkSession in order for multiple 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // network layers to share information (e.g. authentication data). The 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // HttpCache takes ownership of the |backend_factory|. 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpCache(HttpNetworkSession* session, BackendFactory* backend_factory); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Initialize the cache from its component parts. The lifetime of the 14146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // |network_layer| and |backend_factory| are managed by the HttpCache and 14246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // will be destroyed using |delete| when the HttpCache is destroyed. 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpCache(HttpTransactionFactory* network_layer, 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetLog* net_log, 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendFactory* backend_factory); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~HttpCache(); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpTransactionFactory* network_layer() { return network_layer_.get(); } 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DiskBasedCertCache* cert_cache() const { return cert_cache_.get(); } 152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Retrieves the cache backend for this HttpCache instance. If the backend 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is not initialized yet, this method will initialize it. The return value is 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a network error code, and it could be ERR_IO_PENDING, in which case the 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |callback| will be notified when the operation completes. The pointer that 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // receives the |backend| must remain valid until the operation completes. 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int GetBackend(disk_cache::Backend** backend, 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CompletionCallback& callback); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the current backend (can be NULL). 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Backend* GetCurrentBackend() const; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Given a header data blob, convert it to a response info object. 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool ParseResponseInfo(const char* data, int len, 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpResponseInfo* response_info, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* response_truncated); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Writes |buf_len| bytes of metadata stored in |buf| to the cache entry 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // referenced by |url|, as long as the entry's |expected_response_time| has 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // not changed. This method returns without blocking, and the operation will 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be performed asynchronously without any completion notification. 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void WriteMetadata(const GURL& url, 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RequestPriority priority, 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time expected_response_time, 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IOBuffer* buf, 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int buf_len); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get/Set the cache's mode. 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_mode(Mode value) { mode_ = value; } 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Mode mode() { return mode_; } 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close currently active sockets so that fresh page loads will not use any 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // recycled connections. For sockets currently in use, they may not close 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // immediately, but they will not be reusable. This is for debugging. 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CloseAllConnections(); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close all idle connections. Will close all sockets not in active use. 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CloseIdleConnections(); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called whenever an external cache in the system reuses the resource 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // referred to by |url| and |http_method|. 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnExternalCacheHit(const GURL& url, const std::string& http_method); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initializes the Infinite Cache, if selected by the field trial. 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void InitializeInfiniteCache(const base::FilePath& path); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Causes all transactions created after this point to effectively bypass 199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // the cache lock whenever there is lock contention. 200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void BypassLockForTest() { 201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bypass_lock_for_test_ = true; 202116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // HttpTransactionFactory implementation: 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual int CreateTransaction(RequestPriority priority, 2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<HttpTransaction>* trans) OVERRIDE; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual HttpCache* GetCache() OVERRIDE; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual HttpNetworkSession* GetSession() OVERRIDE; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 210010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::WeakPtr<HttpCache> GetWeakPtr() { return weak_factory_.GetWeakPtr(); } 211010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Resets the network layer to allow for tests that probe 2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // network changes (e.g. host unreachable). The old network layer is 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // returned to allow for filter patterns that only intercept 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // some creation requests. Note ownership exchange. 2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<HttpTransactionFactory> 2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetHttpNetworkTransactionFactoryForTesting( 2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<HttpTransactionFactory> new_network_layer); 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private: 221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Types -------------------------------------------------------------------- 222a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disk cache entry data indices. 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum { 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kResponseInfoIndex = 0, 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kResponseContentIndex, 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kMetadataIndex, 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Must remain at the end of the enum. 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kNumCacheEntryDataIndices 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class MetadataWriter; 2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) class QuicServerInfoFactoryAdaptor; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class Transaction; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class WorkItem; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class Transaction; 238a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) friend class ViewCacheHelper; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct PendingOp; // Info for an entry under construction. 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::list<Transaction*> TransactionList; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::list<WorkItem*> WorkItemList; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct ActiveEntry { 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit ActiveEntry(disk_cache::Entry* entry); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ActiveEntry(); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_cache::Entry* disk_entry; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Transaction* writer; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TransactionList readers; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TransactionList pending_queue; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool will_process_pending_queue; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool doomed; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef base::hash_map<std::string, ActiveEntry*> ActiveEntriesMap; 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef base::hash_map<std::string, PendingOp*> PendingOpsMap; 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::set<ActiveEntry*> ActiveEntriesSet; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef base::hash_map<std::string, int> PlaybackCacheMap; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Methods ------------------------------------------------------------------ 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates the |backend| object and notifies the |callback| when the operation 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // completes. Returns an error code. 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int CreateBackend(disk_cache::Backend** backend, 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CompletionCallback& callback); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Makes sure that the backend creation is complete before allowing the 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // provided transaction to use the object. Returns an error code. |trans| 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will be notified via its IO callback if this method returns ERR_IO_PENDING. 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The transaction is free to use the backend directly at any time after 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // receiving the notification. 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int GetBackendForTransaction(Transaction* trans); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Generates the cache key for this request. 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string GenerateCacheKey(const HttpRequestInfo*); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Dooms the entry selected by |key|, if it is currently in the list of active 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // entries. 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DoomActiveEntry(const std::string& key); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Dooms the entry selected by |key|. |trans| will be notified via its IO 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // callback if this method returns ERR_IO_PENDING. The entry can be 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // currently in use or not. 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int DoomEntry(const std::string& key, Transaction* trans); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Dooms the entry selected by |key|. |trans| will be notified via its IO 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // callback if this method returns ERR_IO_PENDING. The entry should not 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be currently in use. 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int AsyncDoomEntry(const std::string& key, Transaction* trans); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Dooms the entry associated with a GET for a given |url|. 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void DoomMainEntryForUrl(const GURL& url); 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Closes a previously doomed entry. 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void FinalizeDoomedEntry(ActiveEntry* entry); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns an entry that is currently in use and not doomed, or NULL. 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ActiveEntry* FindActiveEntry(const std::string& key); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a new ActiveEntry and starts tracking it. |disk_entry| is the disk 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // cache entry. 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ActiveEntry* ActivateEntry(disk_cache::Entry* disk_entry); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Deletes an ActiveEntry. 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DeactivateEntry(ActiveEntry* entry); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Deletes an ActiveEntry using an exhaustive search. 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SlowDeactivateEntry(ActiveEntry* entry); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the PendingOp for the desired |key|. If an entry is not under 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // construction already, a new PendingOp structure is created. 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingOp* GetPendingOp(const std::string& key); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Deletes a PendingOp. 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DeletePendingOp(PendingOp* pending_op); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Opens the disk cache entry associated with |key|, returning an ActiveEntry 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in |*entry|. |trans| will be notified via its IO callback if this method 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // returns ERR_IO_PENDING. 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int OpenEntry(const std::string& key, ActiveEntry** entry, 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Transaction* trans); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates the disk cache entry associated with |key|, returning an 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ActiveEntry in |*entry|. |trans| will be notified via its IO callback if 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this method returns ERR_IO_PENDING. 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int CreateEntry(const std::string& key, ActiveEntry** entry, 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Transaction* trans); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Destroys an ActiveEntry (active or doomed). 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DestroyEntry(ActiveEntry* entry); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds a transaction to an ActiveEntry. If this method returns ERR_IO_PENDING 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the transaction will be notified about completion via its IO callback. This 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // method returns ERR_CACHE_RACE to signal the transaction that it cannot be 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // added to the provided entry, and it should retry the process with another 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // one (in this case, the entry is no longer valid). 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int AddTransactionToEntry(ActiveEntry* entry, Transaction* trans); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when the transaction has finished working with this entry. |cancel| 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is true if the operation was cancelled by the caller instead of running 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to completion. 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DoneWithEntry(ActiveEntry* entry, Transaction* trans, bool cancel); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when the transaction has finished writing to this entry. |success| 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is false if the cache entry should be deleted. 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DoneWritingToEntry(ActiveEntry* entry, bool success); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when the transaction has finished reading from this entry. 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DoneReadingFromEntry(ActiveEntry* entry, Transaction* trans); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Converts the active writer transaction to a reader so that other 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // transactions can start reading from this entry. 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ConvertWriterToReader(ActiveEntry* entry); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the LoadState of the provided pending transaction. 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadState GetLoadStateForPendingTransaction(const Transaction* trans); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Removes the transaction |trans|, from the pending list of an entry 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (PendingOp, active or doomed entry). 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RemovePendingTransaction(Transaction* trans); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Removes the transaction |trans|, from the pending list of |entry|. 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool RemovePendingTransactionFromEntry(ActiveEntry* entry, 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Transaction* trans); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Removes the transaction |trans|, from the pending list of |pending_op|. 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool RemovePendingTransactionFromPendingOp(PendingOp* pending_op, 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Transaction* trans); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Instantiates and sets QUIC server info factory. 37246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void SetupQuicServerInfoFactory(HttpNetworkSession* session); 37346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Resumes processing the pending list of |entry|. 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ProcessPendingQueue(ActiveEntry* entry); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Events (called via PostTask) --------------------------------------------- 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnProcessPendingQueue(ActiveEntry* entry); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callbacks ---------------------------------------------------------------- 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Processes BackendCallback notifications. 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnIOComplete(int result, PendingOp* entry); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper to conditionally delete |pending_op| if the HttpCache object it 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is meant for has been deleted. 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(ajwong): The PendingOp lifetime management is very tricky. It might 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be possible to simplify it using either base::Owned() or base::Passed() 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with the callback. 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void OnPendingOpComplete(const base::WeakPtr<HttpCache>& cache, 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingOp* pending_op, 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Processes the backend creation notification. 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnBackendCreated(int result, PendingOp* pending_op); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Variables ---------------------------------------------------------------- 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetLog* net_log_; 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used when lazily constructing the disk_cache_. 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<BackendFactory> backend_factory_; 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool building_backend_; 406116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool bypass_lock_for_test_; 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Mode mode_; 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<QuicServerInfoFactoryAdaptor> quic_server_info_factory_; 4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<HttpTransactionFactory> network_layer_; 4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<disk_cache::Backend> disk_cache_; 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 416116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<DiskBasedCertCache> cert_cache_; 417116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The set of active entries indexed by cache key. 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ActiveEntriesMap active_entries_; 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The set of doomed entries. 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ActiveEntriesSet doomed_entries_; 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The set of entries "under construction". 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingOpsMap pending_ops_; 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<PlaybackCacheMap> playback_cache_map_; 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 429010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::WeakPtrFactory<HttpCache> weak_factory_; 430010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(HttpCache); 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // NET_HTTP_HTTP_CACHE_H_ 437