12c4085b2006233b5e3a3fe507d62642377b5dc2eSelim Gurun// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Use of this source code is governed by a BSD-style license that can be
3dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// found in the LICENSE file.
4dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
5dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#ifndef NET_TOOLS_FLIP_SERVER_SPDY_INTERFACE_
6dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#define NET_TOOLS_FLIP_SERVER_SPDY_INTERFACE_
7dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
8dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include <map>
9dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include <string>
10dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include <vector>
11dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/spdy/spdy_framer.h"
13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/spdy/spdy_protocol.h"
14dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/tools/flip_server/balsa_headers.h"
15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/tools/flip_server/balsa_visitor_interface.h"
16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/tools/flip_server/output_ordering.h"
17dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/tools/flip_server/sm_connection.h"
18dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/tools/flip_server/sm_interface.h"
19dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
20dc0f95d653279beabeb9817299e2902918ba123eKristian Monsennamespace net {
21dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
22dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass BalsaFrame;
23dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass FlipAcceptor;
24dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass MemoryCache;
25dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
26dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass SpdySM : public spdy::SpdyFramerVisitorInterface,
27dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen               public SMInterface {
28dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen public:
29dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  SpdySM(SMConnection* connection,
30dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen         SMInterface* sm_http_interface,
31dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen         EpollServer* epoll_server,
32dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen         MemoryCache* memory_cache,
33dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen         FlipAcceptor* acceptor);
34dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual ~SpdySM();
35dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
36dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void InitSMInterface(SMInterface* sm_http_interface,
37dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                               int32 server_idx) {}
38dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
39dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void InitSMConnection(SMConnectionPoolInterface* connection_pool,
40dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                SMInterface* sm_interface,
41dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                EpollServer* epoll_server,
42dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                int fd,
43dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                std::string server_ip,
44dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                std::string server_port,
45dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                std::string remote_ip,
46dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                bool use_ssl);
47dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
48dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  static bool disable_data_compression() { return disable_data_compression_; }
49dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  static void set_disable_data_compression(bool value) {
50dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    disable_data_compression_ = value;
51dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
52dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
53dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen private:
54dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void set_is_request() {}
55dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void OnError(spdy::SpdyFramer* framer) {}
56dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  SMInterface* NewConnectionInterface();
57dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  SMInterface* FindOrMakeNewSMConnectionInterface(std::string server_ip,
58dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                                  std::string server_port);
59dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int SpdyHandleNewStream(const spdy::SpdyControlFrame* frame,
60dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                          std::string &http_data,
61dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                          bool *is_https_scheme);
62dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
63dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // SpdyFramerVisitor interface.
64dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void OnControl(const spdy::SpdyControlFrame* frame);
652c4085b2006233b5e3a3fe507d62642377b5dc2eSelim Gurun  virtual bool OnControlFrameHeaderData(spdy::SpdyStreamId stream_id,
662c4085b2006233b5e3a3fe507d62642377b5dc2eSelim Gurun                                        const char* header_data,
672c4085b2006233b5e3a3fe507d62642377b5dc2eSelim Gurun                                        size_t len);
682c4085b2006233b5e3a3fe507d62642377b5dc2eSelim Gurun  virtual void OnDataFrameHeader(const spdy::SpdyDataFrame* frame);
69dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void OnStreamFrameData(spdy::SpdyStreamId stream_id,
70dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                 const char* data, size_t len);
71dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
72dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen public:
73dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual size_t ProcessReadInput(const char* data, size_t len);
74dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual size_t ProcessWriteInput(const char* data, size_t len);
75dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual bool MessageFullyRead() const;
76dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void SetStreamID(uint32 stream_id) {}
77dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual bool Error() const;
78dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual const char* ErrorAsString() const;
79dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void Reset() {}
80dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void ResetForNewInterface(int32 server_idx);
81dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void ResetForNewConnection();
82dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // SMInterface's Cleanup is currently only called by SMConnection after a
83dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // protocol message as been fully read. Spdy's SMInterface does not need
84dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // to do any cleanup at this time.
85dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // TODO (klindsay) This method is probably not being used properly and
86dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // some logic review and method renaming is probably in order.
87dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void Cleanup() {}
88dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Send a settings frame
89dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual int PostAcceptHook();
90dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void NewStream(uint32 stream_id,
91dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                         uint32 priority,
92dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                         const std::string& filename);
93dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void AddToOutputOrder(const MemCacheIter& mci);
94dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void SendEOF(uint32 stream_id);
95dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void SendErrorNotFound(uint32 stream_id);
96dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void SendOKResponse(uint32 stream_id, std::string* output);
97dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual size_t SendSynStream(uint32 stream_id, const BalsaHeaders& headers);
98dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual size_t SendSynReply(uint32 stream_id, const BalsaHeaders& headers);
99dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void SendDataFrame(uint32 stream_id, const char* data, int64 len,
100dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                             uint32 flags, bool compress);
101dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  spdy::SpdyFramer* spdy_framer() { return spdy_framer_; }
102dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
103dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  static std::string forward_ip_header() { return forward_ip_header_; }
104dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  static void set_forward_ip_header(std::string value) {
105dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    forward_ip_header_ = value;
106dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
107dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
108dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen private:
109dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void SendEOFImpl(uint32 stream_id);
110dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void SendErrorNotFoundImpl(uint32 stream_id);
111dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void SendOKResponseImpl(uint32 stream_id, std::string* output);
112dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void KillStream(uint32 stream_id);
113dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void CopyHeaders(spdy::SpdyHeaderBlock& dest, const BalsaHeaders& headers);
114dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  size_t SendSynStreamImpl(uint32 stream_id, const BalsaHeaders& headers);
115dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  size_t SendSynReplyImpl(uint32 stream_id, const BalsaHeaders& headers);
116dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void SendDataFrameImpl(uint32 stream_id, const char* data, int64 len,
117dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                         spdy::SpdyDataFlags flags, bool compress);
118dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void EnqueueDataFrame(DataFrame* df);
119dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void GetOutput();
120dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen private:
121dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  uint64 seq_num_;
122dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  spdy::SpdyFramer* spdy_framer_;
123dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool valid_spdy_session_;  // True if we have seen valid data on this session.
124dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                             // Use this to fail fast when junk is sent to our
125dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                             // port.
126dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
127dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  SMConnection* connection_;
128dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  OutputList* client_output_list_;
129dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  OutputOrdering client_output_ordering_;
130dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  uint32 next_outgoing_stream_id_;
131dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  EpollServer* epoll_server_;
132dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  FlipAcceptor* acceptor_;
133dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  MemoryCache* memory_cache_;
134dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::vector<SMInterface*> server_interface_list;
135dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::vector<int32> unused_server_interface_list;
136dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  typedef std::map<uint32, SMInterface*> StreamToSmif;
137dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  StreamToSmif stream_to_smif_;
138dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool close_on_error_;
139dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
140dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  static bool disable_data_compression_;
141dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  static std::string forward_ip_header_;
142dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
143dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
144dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}  // namespace net
145dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
146dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif  // NET_TOOLS_FLIP_SERVER_SPDY_INTERFACE_
147dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
148