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