| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef NET_TOOLS_QUIC_QUIC_IN_MEMORY_CACHE_H_ |
| #define NET_TOOLS_QUIC_QUIC_IN_MEMORY_CACHE_H_ |
| |
| #include <string> |
| |
| #include "base/containers/hash_tables.h" |
| #include "base/memory/singleton.h" |
| #include "base/strings/string_piece.h" |
| #include "net/spdy/spdy_framer.h" |
| |
| namespace base { |
| |
| template <typename Type> struct DefaultSingletonTraits; |
| |
| } // namespace base |
| |
| namespace net { |
| namespace tools { |
| |
| namespace test { |
| class QuicInMemoryCachePeer; |
| } // namespace test |
| |
| class QuicServer; |
| |
| // In-memory cache for HTTP responses. |
| // Reads from disk cache generated by: |
| // `wget -p --save_headers <url>` |
| class QuicInMemoryCache { |
| public: |
| enum SpecialResponseType { |
| REGULAR_RESPONSE, // Send the headers and body like a server should. |
| CLOSE_CONNECTION, // Close the connection (sending the close packet). |
| IGNORE_REQUEST, // Do nothing, expect the client to time out. |
| }; |
| |
| // Container for response header/body pairs. |
| class Response { |
| public: |
| Response(); |
| ~Response(); |
| |
| SpecialResponseType response_type() const { return response_type_; } |
| const SpdyHeaderBlock& headers() const { return headers_; } |
| const StringPiece body() const { return StringPiece(body_); } |
| |
| void set_response_type(SpecialResponseType response_type) { |
| response_type_ = response_type; |
| } |
| void set_headers(const SpdyHeaderBlock& headers) { |
| headers_ = headers; |
| } |
| void set_body(base::StringPiece body) { |
| body.CopyToString(&body_); |
| } |
| |
| private: |
| SpecialResponseType response_type_; |
| SpdyHeaderBlock headers_; |
| std::string body_; |
| |
| DISALLOW_COPY_AND_ASSIGN(Response); |
| }; |
| |
| // Returns the singleton instance of the cache. |
| static QuicInMemoryCache* GetInstance(); |
| |
| // Retrieve a response from this cache for a given host and path.. |
| // If no appropriate response exists, nullptr is returned. |
| const Response* GetResponse(base::StringPiece host, |
| base::StringPiece path) const; |
| |
| // Adds a simple response to the cache. The response headers will |
| // only contain the "content-length" header with the length of |body|. |
| void AddSimpleResponse(base::StringPiece host, |
| base::StringPiece path, |
| int response_code, |
| base::StringPiece response_detail, |
| base::StringPiece body); |
| |
| // Add a response to the cache. |
| void AddResponse(base::StringPiece host, |
| base::StringPiece path, |
| const SpdyHeaderBlock& response_headers, |
| base::StringPiece response_body); |
| |
| // Simulate a special behavior at a particular path. |
| void AddSpecialResponse(base::StringPiece host, |
| base::StringPiece path, |
| SpecialResponseType response_type); |
| |
| // Sets a default response in case of cache misses. Takes ownership of |
| // 'response'. |
| void AddDefaultResponse(Response* response); |
| |
| // |cache_cirectory| can be generated using `wget -p --save-headers <url>`. |
| void InitializeFromDirectory(const std::string& cache_directory); |
| |
| private: |
| typedef base::hash_map<std::string, Response*> ResponseMap; |
| |
| friend struct base::DefaultSingletonTraits<QuicInMemoryCache>; |
| friend class test::QuicInMemoryCachePeer; |
| |
| QuicInMemoryCache(); |
| ~QuicInMemoryCache(); |
| |
| void ResetForTests(); |
| |
| void AddResponseImpl(base::StringPiece host, |
| base::StringPiece path, |
| SpecialResponseType response_type, |
| const SpdyHeaderBlock& response_headers, |
| base::StringPiece response_body); |
| |
| std::string GetKey(base::StringPiece host, base::StringPiece path) const; |
| |
| // Cached responses. |
| ResponseMap responses_; |
| |
| // The default response for cache misses, if set. |
| scoped_ptr<Response> default_response_; |
| |
| DISALLOW_COPY_AND_ASSIGN(QuicInMemoryCache); |
| }; |
| |
| } // namespace tools |
| } // namespace net |
| |
| #endif // NET_TOOLS_QUIC_QUIC_IN_MEMORY_CACHE_H_ |