1 // Copyright (c) 2009 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 #include <vector> 11 12 #include "net/tools/flip_server/balsa_headers.h" 13 #include "net/tools/flip_server/balsa_visitor_interface.h" 14 #include "net/tools/flip_server/constants.h" 15 16 namespace net { 17 18 class StoreBodyAndHeadersVisitor: public BalsaVisitorInterface { 19 public: HandleError()20 void HandleError() { error_ = true; } 21 22 // BalsaVisitorInterface: ProcessBodyInput(const char * input,size_t size)23 virtual void ProcessBodyInput(const char *input, size_t size) {} 24 virtual void ProcessBodyData(const char *input, size_t size); ProcessHeaderInput(const char * input,size_t size)25 virtual void ProcessHeaderInput(const char *input, size_t size) {} ProcessTrailerInput(const char * input,size_t size)26 virtual void ProcessTrailerInput(const char *input, size_t size) {} ProcessHeaders(const BalsaHeaders & headers)27 virtual void ProcessHeaders(const BalsaHeaders& headers) { 28 // nothing to do here-- we're assuming that the BalsaFrame has 29 // been handed our headers. 30 } ProcessRequestFirstLine(const char * line_input,size_t line_length,const char * method_input,size_t method_length,const char * request_uri_input,size_t request_uri_length,const char * version_input,size_t version_length)31 virtual void ProcessRequestFirstLine(const char* line_input, 32 size_t line_length, 33 const char* method_input, 34 size_t method_length, 35 const char* request_uri_input, 36 size_t request_uri_length, 37 const char* version_input, 38 size_t version_length) {} ProcessResponseFirstLine(const char * line_input,size_t line_length,const char * version_input,size_t version_length,const char * status_input,size_t status_length,const char * reason_input,size_t reason_length)39 virtual void ProcessResponseFirstLine(const char *line_input, 40 size_t line_length, 41 const char *version_input, 42 size_t version_length, 43 const char *status_input, 44 size_t status_length, 45 const char *reason_input, 46 size_t reason_length) {} ProcessChunkLength(size_t chunk_length)47 virtual void ProcessChunkLength(size_t chunk_length) {} ProcessChunkExtensions(const char * input,size_t size)48 virtual void ProcessChunkExtensions(const char *input, size_t size) {} HeaderDone()49 virtual void HeaderDone() {} MessageDone()50 virtual void MessageDone() {} 51 virtual void HandleHeaderError(BalsaFrame* framer); 52 virtual void HandleHeaderWarning(BalsaFrame* framer); 53 virtual void HandleChunkingError(BalsaFrame* framer); 54 virtual void HandleBodyError(BalsaFrame* framer); 55 56 BalsaHeaders headers; 57 std::string body; 58 bool error_; 59 }; 60 61 //////////////////////////////////////////////////////////////////////////////// 62 63 struct FileData { 64 FileData(); 65 FileData(BalsaHeaders* h, const std::string& b); 66 ~FileData(); 67 void CopyFrom(const FileData& file_data); 68 69 BalsaHeaders* headers; 70 std::string filename; 71 // priority, filename 72 std::vector< std::pair<int, std::string> > related_files; 73 std::string body; 74 }; 75 76 //////////////////////////////////////////////////////////////////////////////// 77 78 class MemCacheIter { 79 public: MemCacheIter()80 MemCacheIter() : 81 file_data(NULL), 82 priority(0), 83 transformed_header(false), 84 body_bytes_consumed(0), 85 stream_id(0), 86 max_segment_size(kInitialDataSendersThreshold), 87 bytes_sent(0) {} MemCacheIter(FileData * fd)88 explicit MemCacheIter(FileData* fd) : 89 file_data(fd), 90 priority(0), 91 transformed_header(false), 92 body_bytes_consumed(0), 93 stream_id(0), 94 max_segment_size(kInitialDataSendersThreshold), 95 bytes_sent(0) {} 96 FileData* file_data; 97 int priority; 98 bool transformed_header; 99 size_t body_bytes_consumed; 100 uint32 stream_id; 101 uint32 max_segment_size; 102 size_t bytes_sent; 103 }; 104 105 //////////////////////////////////////////////////////////////////////////////// 106 107 class MemoryCache { 108 public: 109 typedef std::map<std::string, FileData> Files; 110 111 public: 112 MemoryCache(); 113 ~MemoryCache(); 114 115 void CloneFrom(const MemoryCache& mc); 116 117 void AddFiles(); 118 119 void ReadToString(const char* filename, std::string* output); 120 121 void ReadAndStoreFileContents(const char* filename); 122 123 FileData* GetFileData(const std::string& filename); 124 125 bool AssignFileData(const std::string& filename, MemCacheIter* mci); 126 127 Files files_; 128 std::string cwd_; 129 }; 130 131 class NotifierInterface { 132 public: ~NotifierInterface()133 virtual ~NotifierInterface() {} 134 virtual void Notify() = 0; 135 }; 136 137 } // namespace net 138 139 #endif // NET_TOOLS_FLIP_SERVER_MEM_CACHE_H_ 140 141