// Copyright (c) 2009 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_FLIP_SERVER_MEM_CACHE_H_ #define NET_TOOLS_FLIP_SERVER_MEM_CACHE_H_ #include <map> #include <string> #include <vector> #include "net/tools/flip_server/balsa_headers.h" #include "net/tools/flip_server/balsa_visitor_interface.h" #include "net/tools/flip_server/constants.h" namespace net { class StoreBodyAndHeadersVisitor: public BalsaVisitorInterface { public: void HandleError() { error_ = true; } // BalsaVisitorInterface: virtual void ProcessBodyInput(const char *input, size_t size) {} virtual void ProcessBodyData(const char *input, size_t size); virtual void ProcessHeaderInput(const char *input, size_t size) {} virtual void ProcessTrailerInput(const char *input, size_t size) {} virtual void ProcessHeaders(const BalsaHeaders& headers) { // nothing to do here-- we're assuming that the BalsaFrame has // been handed our headers. } virtual void 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) {} virtual void 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) {} virtual void ProcessChunkLength(size_t chunk_length) {} virtual void ProcessChunkExtensions(const char *input, size_t size) {} virtual void HeaderDone() {} virtual void MessageDone() {} virtual void HandleHeaderError(BalsaFrame* framer); virtual void HandleHeaderWarning(BalsaFrame* framer); virtual void HandleChunkingError(BalsaFrame* framer); virtual void HandleBodyError(BalsaFrame* framer); BalsaHeaders headers; std::string body; bool error_; }; //////////////////////////////////////////////////////////////////////////////// struct FileData { FileData(); FileData(BalsaHeaders* h, const std::string& b); ~FileData(); void CopyFrom(const FileData& file_data); BalsaHeaders* headers; std::string filename; // priority, filename std::vector< std::pair<int, std::string> > related_files; std::string body; }; //////////////////////////////////////////////////////////////////////////////// class MemCacheIter { public: MemCacheIter() : file_data(NULL), priority(0), transformed_header(false), body_bytes_consumed(0), stream_id(0), max_segment_size(kInitialDataSendersThreshold), bytes_sent(0) {} explicit MemCacheIter(FileData* fd) : file_data(fd), priority(0), transformed_header(false), body_bytes_consumed(0), stream_id(0), max_segment_size(kInitialDataSendersThreshold), bytes_sent(0) {} FileData* file_data; int priority; bool transformed_header; size_t body_bytes_consumed; uint32 stream_id; uint32 max_segment_size; size_t bytes_sent; }; //////////////////////////////////////////////////////////////////////////////// class MemoryCache { public: typedef std::map<std::string, FileData> Files; public: MemoryCache(); ~MemoryCache(); void CloneFrom(const MemoryCache& mc); void AddFiles(); void ReadToString(const char* filename, std::string* output); void ReadAndStoreFileContents(const char* filename); FileData* GetFileData(const std::string& filename); bool AssignFileData(const std::string& filename, MemCacheIter* mci); Files files_; std::string cwd_; }; class NotifierInterface { public: virtual ~NotifierInterface() {} virtual void Notify() = 0; }; } // namespace net #endif // NET_TOOLS_FLIP_SERVER_MEM_CACHE_H_