1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef NET_TOOLS_FLIP_SERVER_MEM_CACHE_H_ 6 #define NET_TOOLS_FLIP_SERVER_MEM_CACHE_H_ 7 8 #include <map> 9 #include <string> 10 11 #include "base/compiler_specific.h" 12 #include "base/memory/scoped_ptr.h" 13 #include "net/tools/flip_server/balsa_headers.h" 14 #include "net/tools/flip_server/balsa_visitor_interface.h" 15 #include "net/tools/flip_server/constants.h" 16 17 namespace net { 18 19 class StoreBodyAndHeadersVisitor: public BalsaVisitorInterface { 20 public: 21 void HandleError() { error_ = true; } 22 23 // BalsaVisitorInterface: 24 virtual void ProcessBodyInput(const char *input, size_t size) OVERRIDE {} 25 virtual void ProcessBodyData(const char *input, size_t size) OVERRIDE; 26 virtual void ProcessHeaderInput(const char *input, size_t size) OVERRIDE {} 27 virtual void ProcessTrailerInput(const char *input, size_t size) OVERRIDE {} 28 virtual void ProcessHeaders(const BalsaHeaders& headers) OVERRIDE { 29 // nothing to do here-- we're assuming that the BalsaFrame has 30 // been handed our headers. 31 } 32 virtual void ProcessRequestFirstLine(const char* line_input, 33 size_t line_length, 34 const char* method_input, 35 size_t method_length, 36 const char* request_uri_input, 37 size_t request_uri_length, 38 const char* version_input, 39 size_t version_length) OVERRIDE {} 40 virtual void ProcessResponseFirstLine(const char *line_input, 41 size_t line_length, 42 const char *version_input, 43 size_t version_length, 44 const char *status_input, 45 size_t status_length, 46 const char *reason_input, 47 size_t reason_length) OVERRIDE {} 48 virtual void ProcessChunkLength(size_t chunk_length) OVERRIDE {} 49 virtual void ProcessChunkExtensions(const char *input, 50 size_t size) OVERRIDE {} 51 virtual void HeaderDone() OVERRIDE {} 52 virtual void MessageDone() OVERRIDE {} 53 virtual void HandleHeaderError(BalsaFrame* framer) OVERRIDE; 54 virtual void HandleHeaderWarning(BalsaFrame* framer) OVERRIDE; 55 virtual void HandleChunkingError(BalsaFrame* framer) OVERRIDE; 56 virtual void HandleBodyError(BalsaFrame* framer) OVERRIDE; 57 58 BalsaHeaders headers; 59 std::string body; 60 bool error_; 61 }; 62 63 //////////////////////////////////////////////////////////////////////////////// 64 class FileData { 65 public: 66 FileData(); 67 FileData(const BalsaHeaders* headers, 68 const std::string& filename, 69 const std::string& body); 70 ~FileData(); 71 72 BalsaHeaders* headers() { return headers_.get(); } 73 const BalsaHeaders* headers() const { return headers_.get(); } 74 75 const std::string& filename() { return filename_; } 76 const std::string& body() { return body_; } 77 78 private: 79 scoped_ptr<BalsaHeaders> headers_; 80 std::string filename_; 81 std::string body_; 82 83 DISALLOW_COPY_AND_ASSIGN(FileData); 84 }; 85 86 //////////////////////////////////////////////////////////////////////////////// 87 88 class MemCacheIter { 89 public: 90 MemCacheIter() : 91 file_data(NULL), 92 priority(0), 93 transformed_header(false), 94 body_bytes_consumed(0), 95 stream_id(0), 96 max_segment_size(kInitialDataSendersThreshold), 97 bytes_sent(0) {} 98 explicit MemCacheIter(FileData* fd) : 99 file_data(fd), 100 priority(0), 101 transformed_header(false), 102 body_bytes_consumed(0), 103 stream_id(0), 104 max_segment_size(kInitialDataSendersThreshold), 105 bytes_sent(0) {} 106 FileData* file_data; 107 int priority; 108 bool transformed_header; 109 size_t body_bytes_consumed; 110 uint32 stream_id; 111 uint32 max_segment_size; 112 size_t bytes_sent; 113 }; 114 115 //////////////////////////////////////////////////////////////////////////////// 116 117 class MemoryCache { 118 public: 119 typedef std::map<std::string, FileData*> Files; 120 121 public: 122 MemoryCache(); 123 virtual ~MemoryCache(); 124 125 void CloneFrom(const MemoryCache& mc); 126 127 void AddFiles(); 128 129 // virtual for unittests 130 virtual void ReadToString(const char* filename, std::string* output); 131 132 void ReadAndStoreFileContents(const char* filename); 133 134 FileData* GetFileData(const std::string& filename); 135 136 bool AssignFileData(const std::string& filename, MemCacheIter* mci); 137 138 private: 139 void ClearFiles(); 140 141 Files files_; 142 std::string cwd_; 143 }; 144 145 class NotifierInterface { 146 public: 147 virtual ~NotifierInterface() {} 148 virtual void Notify() = 0; 149 }; 150 151 } // namespace net 152 153 #endif // NET_TOOLS_FLIP_SERVER_MEM_CACHE_H_ 154