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