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