15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NET_TOOLS_FLIP_SERVER_MEM_CACHE_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NET_TOOLS_FLIP_SERVER_MEM_CACHE_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 12ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/memory/scoped_ptr.h" 134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "net/tools/balsa/balsa_headers.h" 144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "net/tools/balsa/balsa_visitor_interface.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/tools/flip_server/constants.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class StoreBodyAndHeadersVisitor : public BalsaVisitorInterface { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void HandleError() { error_ = true; } 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BalsaVisitorInterface: 24a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void ProcessBodyInput(const char* input, size_t size) OVERRIDE {} 25a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void ProcessBodyData(const char* input, size_t size) OVERRIDE; 26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void ProcessHeaderInput(const char* input, size_t size) OVERRIDE {} 27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void ProcessTrailerInput(const char* input, size_t size) OVERRIDE {} 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ProcessHeaders(const BalsaHeaders& headers) OVERRIDE { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // nothing to do here-- we're assuming that the BalsaFrame has 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // been handed our headers. 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ProcessRequestFirstLine(const char* line_input, 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t line_length, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* method_input, 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t method_length, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* request_uri_input, 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t request_uri_length, 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* version_input, 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t version_length) OVERRIDE {} 40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void ProcessResponseFirstLine(const char* line_input, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t line_length, 42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const char* version_input, 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t version_length, 44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const char* status_input, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t status_length, 46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const char* reason_input, 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t reason_length) OVERRIDE {} 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ProcessChunkLength(size_t chunk_length) OVERRIDE {} 49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void ProcessChunkExtensions(const char* input, size_t size) OVERRIDE { 50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void HeaderDone() OVERRIDE {} 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void MessageDone() OVERRIDE {} 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void HandleHeaderError(BalsaFrame* framer) OVERRIDE; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void HandleHeaderWarning(BalsaFrame* framer) OVERRIDE; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void HandleChunkingError(BalsaFrame* framer) OVERRIDE; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void HandleBodyError(BalsaFrame* framer) OVERRIDE; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BalsaHeaders headers; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string body; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool error_; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass FileData { 64ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch public: 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileData(); 66ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch FileData(const BalsaHeaders* headers, 67ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string& filename, 68ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string& body); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~FileData(); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 71ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch BalsaHeaders* headers() { return headers_.get(); } 72ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const BalsaHeaders* headers() const { return headers_.get(); } 73ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 74ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string& filename() { return filename_; } 75ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string& body() { return body_; } 76ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 77ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch private: 78ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch scoped_ptr<BalsaHeaders> headers_; 79ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::string filename_; 80ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::string body_; 81ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 82ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DISALLOW_COPY_AND_ASSIGN(FileData); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MemCacheIter { 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 87a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) MemCacheIter() 88a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) : file_data(NULL), 89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) priority(0), 90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) transformed_header(false), 91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) body_bytes_consumed(0), 92a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) stream_id(0), 93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) max_segment_size(kInitialDataSendersThreshold), 94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bytes_sent(0) {} 95a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) explicit MemCacheIter(FileData* fd) 96a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) : file_data(fd), 97a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) priority(0), 98a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) transformed_header(false), 99a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) body_bytes_consumed(0), 100a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) stream_id(0), 101a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) max_segment_size(kInitialDataSendersThreshold), 102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bytes_sent(0) {} 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileData* file_data; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int priority; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool transformed_header; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t body_bytes_consumed; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 stream_id; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 max_segment_size; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t bytes_sent; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MemoryCache { 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 114ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch typedef std::map<std::string, FileData*> Files; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MemoryCache(); 118ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch virtual ~MemoryCache(); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CloneFrom(const MemoryCache& mc); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddFiles(); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 124ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // virtual for unittests 125ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch virtual void ReadToString(const char* filename, std::string* output); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ReadAndStoreFileContents(const char* filename); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileData* GetFileData(const std::string& filename); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool AssignFileData(const std::string& filename, MemCacheIter* mci); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // For unittests 1343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void InsertFile(const BalsaHeaders* headers, 1353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& filename, 1363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& body); 1373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 138ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch private: 1393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void InsertFile(FileData* file_data); 140ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch void ClearFiles(); 141ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Files files_; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string cwd_; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NotifierInterface { 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~NotifierInterface() {} 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Notify() = 0; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // NET_TOOLS_FLIP_SERVER_MEM_CACHE_H_ 155