1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// found in the LICENSE file.
4f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#ifndef NET_QUIC_QUIC_IN_MEMORY_CACHE_H_
6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#define NET_QUIC_QUIC_IN_MEMORY_CACHE_H_
7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <string>
9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/containers/hash_tables.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/memory/singleton.h"
13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/strings/string_piece.h"
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/http/http_response_headers.h"
15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)template <typename T> struct DefaultSingletonTraits;
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass GURL;
18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace net {
20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdochextern base::FilePath::StringType g_quic_in_memory_cache_dir;
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace test {
24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class QuicInMemoryCachePeer;
25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}  // namespace
26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class QuicServer;
28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// In-memory cache for HTTP responses.
30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Reads from disk cache generated by:
31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// `wget -p --save_headers <url>`
32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class QuicInMemoryCache {
33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public:
34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  enum SpecialResponseType {
35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    REGULAR_RESPONSE,  // Send the headers and body like a server should.
36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    CLOSE_CONNECTION,  // Close the connection (sending the close packet).
37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    IGNORE_REQUEST,    // Do nothing, expect the client to time out.
38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  };
39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Container for response header/body pairs.
41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  class Response {
42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)   public:
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    Response();
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ~Response();
45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    SpecialResponseType response_type() const { return response_type_; }
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const HttpResponseHeaders& headers() const { return *headers_.get(); }
48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const base::StringPiece body() const { return base::StringPiece(body_); }
49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)   private:
51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    friend class QuicInMemoryCache;
52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    void set_headers(scoped_refptr<HttpResponseHeaders> headers) {
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      headers_ = headers;
55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    }
56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    void set_body(base::StringPiece body) {
57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      body.CopyToString(&body_);
58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    }
59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    SpecialResponseType response_type_;
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    scoped_refptr<HttpResponseHeaders> headers_;
62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    std::string body_;
63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(Response);
65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  };
66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Returns the singleton instance of the cache.
68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  static QuicInMemoryCache* GetInstance();
69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Retrieve a response from this cache for a given request.
71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // If no appropriate response exists, NULL is returned.
72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Currently, responses are selected based on request URI only.
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const Response* GetResponse(const GURL& url) const;
74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Adds a simple response to the cache.  The response headers will
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // only contain the "content-length" header with the length of |body|.
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void AddSimpleResponse(base::StringPiece path,
78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                         base::StringPiece version,
79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                         base::StringPiece response_code,
80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                         base::StringPiece response_detail,
81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                         base::StringPiece body);
82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Add a response to the cache.
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void AddResponse(const GURL& url,
85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                   scoped_refptr<HttpResponseHeaders> response_headers,
86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                   base::StringPiece response_body);
87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Simulate a special behavior at a particular path.
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void AddSpecialResponse(base::StringPiece path,
90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                          SpecialResponseType response_type);
91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private:
93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  typedef base::hash_map<std::string, Response*> ResponseMap;
94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  friend struct DefaultSingletonTraits<QuicInMemoryCache>;
95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  friend class test::QuicInMemoryCachePeer;
96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  QuicInMemoryCache();
98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ~QuicInMemoryCache();
99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void ResetForTests();
101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void Initialize();
103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::string GetKey(const GURL& url) const;
105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Cached responses.
107f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ResponseMap responses_;
108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(QuicInMemoryCache);
110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)};
111f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
112f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}  // namespace net
113f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif  // NET_QUIC_QUIC_IN_MEMORY_CACHE_H_
115