1b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru// Use of this source code is governed by a BSD-style license that can be
3b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru// found in the LICENSE file.
483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius
5b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#ifndef NET_TOOLS_FLIP_SERVER_SPDY_INTERFACE_H_
6b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#define NET_TOOLS_FLIP_SERVER_SPDY_INTERFACE_H_
7b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
8b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include <map>
9b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include <string>
10b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include <vector>
11b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
12b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "base/compiler_specific.h"
13b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "base/memory/scoped_ptr.h"
14b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "net/spdy/buffered_spdy_framer.h"
15b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "net/spdy/spdy_protocol.h"
16b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "net/tools/balsa/balsa_headers.h"
17b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "net/tools/balsa/balsa_visitor_interface.h"
18b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "net/tools/flip_server/output_ordering.h"
19b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "net/tools/flip_server/sm_connection.h"
20b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#include "net/tools/flip_server/sm_interface.h"
21b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
22b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querunamespace net {
23b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
24b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruclass FlipAcceptor;
25b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruclass MemoryCache;
2683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius
27b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruclass SpdySM : public BufferedSpdyFramerVisitorInterface, public SMInterface {
28b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru public:
29b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  SpdySM(SMConnection* connection,
30b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru         SMInterface* sm_http_interface,
31b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru         EpollServer* epoll_server,
32b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru         MemoryCache* memory_cache,
33b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru         FlipAcceptor* acceptor,
34b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru         SpdyMajorVersion spdy_version);
35b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  virtual ~SpdySM();
36b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
37b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  virtual void InitSMInterface(SMInterface* sm_http_interface,
38b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                               int32 server_idx) OVERRIDE {}
39b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
40b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  virtual void InitSMConnection(SMConnectionPoolInterface* connection_pool,
41b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                                SMInterface* sm_interface,
42b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                                EpollServer* epoll_server,
43b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                                int fd,
44b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                                std::string server_ip,
45b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                                std::string server_port,
46b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                                std::string remote_ip,
47b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                                bool use_ssl) OVERRIDE;
48b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
49b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  // Create new SPDY framer after reusing SpdySM and negotiating new version
50b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  void CreateFramer(SpdyMajorVersion spdy_version);
51b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
52b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru private:
53b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  virtual void set_is_request() OVERRIDE {}
54b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  SMInterface* NewConnectionInterface();
55b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  // virtual for tests
56b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  virtual SMInterface* FindOrMakeNewSMConnectionInterface(
57b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru      const std::string& server_ip,
58b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru      const std::string& server_port);
59b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  int SpdyHandleNewStream(SpdyStreamId stream_id,
60b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                          SpdyPriority priority,
61b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                          const SpdyHeaderBlock& headers,
62b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                          std::string& http_data,
63b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                          bool* is_https_scheme);
64b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
65b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  // BufferedSpdyFramerVisitorInterface:
66b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  virtual void OnError(SpdyFramer::SpdyError error_code) OVERRIDE {}
67b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  virtual void OnStreamError(SpdyStreamId stream_id,
68b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                             const std::string& description) OVERRIDE {}
69b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  // Called after all the header data for SYN_STREAM control frame is received.
70b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  virtual void OnSynStream(SpdyStreamId stream_id,
71b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                           SpdyStreamId associated_stream_id,
72b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                           SpdyPriority priority,
73b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                           bool fin,
74b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                           bool unidirectional,
75b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                           const SpdyHeaderBlock& headers) OVERRIDE;
76b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
77b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  // Called after all the header data for SYN_REPLY control frame is received.
78b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  virtual void OnSynReply(SpdyStreamId stream_id,
79b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                          bool fin,
80b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                          const SpdyHeaderBlock& headers) OVERRIDE;
81b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
82b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  // Called after all the header data for HEADERS control frame is received.
83b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  virtual void OnHeaders(SpdyStreamId stream_id,
84b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                         bool fin,
85b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                         const SpdyHeaderBlock& headers) OVERRIDE;
86b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
87b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  // Called when data frame header is received.
88b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  virtual void OnDataFrameHeader(SpdyStreamId stream_id,
89b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                                 size_t length,
90b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                                 bool fin) OVERRIDE {}
91b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
92b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  // Called when data is received.
93b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  // |stream_id| The stream receiving data.
94b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  // |data| A buffer containing the data received.
9583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius  // |len| The length of the data buffer.
96b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  // When the other side has finished sending data on this stream,
97b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  // this method will be called with a zero-length buffer.
9883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius  virtual void OnStreamFrameData(SpdyStreamId stream_id,
99b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                                 const char* data,
100b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                                 size_t len,
101b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                                 bool fin) OVERRIDE;
102b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
103b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  // Called when a SETTINGS frame is received.
104b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  // |clear_persisted| True if the respective flag is set on the SETTINGS frame.
105b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  virtual void OnSettings(bool clear_persisted) OVERRIDE {}
106b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
107b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  // Called when an individual setting within a SETTINGS frame has been parsed
108b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  // and validated.
109b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  virtual void OnSetting(SpdySettingsIds id,
110b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                         uint8 flags,
111b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                         uint32 value) OVERRIDE {}
112b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
113b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  // Called when a PING frame has been parsed.
114b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  virtual void OnPing(SpdyPingId unique_id, bool is_ack) OVERRIDE {}
115b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
116b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  // Called when a RST_STREAM frame has been parsed.
117b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  virtual void OnRstStream(SpdyStreamId stream_id,
118b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                           SpdyRstStreamStatus status) OVERRIDE;
119b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
120b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  // Called when a GOAWAY frame has been parsed.
121b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  virtual void OnGoAway(SpdyStreamId last_accepted_stream_id,
122b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                        SpdyGoAwayStatus status) OVERRIDE {}
123b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
124b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  // Called when a WINDOW_UPDATE frame has been parsed.
125b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  virtual void OnWindowUpdate(SpdyStreamId stream_id,
126b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                              uint32 delta_window_size) OVERRIDE {}
127b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
128b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  // Called when a PUSH_PROMISE frame has been parsed.
129b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  virtual void OnPushPromise(SpdyStreamId stream_id,
130b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                             SpdyStreamId promised_stream_id,
131b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                             const SpdyHeaderBlock& headers) OVERRIDE {}
132b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
133b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  virtual bool OnUnknownFrame(SpdyStreamId stream_id, int frame_type) OVERRIDE;
134b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
135b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru public:
136b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  virtual size_t ProcessReadInput(const char* data, size_t len) OVERRIDE;
137b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  virtual size_t ProcessWriteInput(const char* data, size_t len) OVERRIDE;
138b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  virtual bool MessageFullyRead() const OVERRIDE;
139b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  virtual void SetStreamID(uint32 stream_id) OVERRIDE {}
140b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  virtual bool Error() const OVERRIDE;
141b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  virtual const char* ErrorAsString() const OVERRIDE;
142b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  virtual void Reset() OVERRIDE {}
143b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  virtual void ResetForNewInterface(int32 server_idx) OVERRIDE;
144b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  virtual void ResetForNewConnection() OVERRIDE;
145b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  // SMInterface's Cleanup is currently only called by SMConnection after a
146b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  // protocol message as been fully read. Spdy's SMInterface does not need
147b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  // to do any cleanup at this time.
148b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  // TODO(klindsay) This method is probably not being used properly and
149b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  // some logic review and method renaming is probably in order.
150b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  virtual void Cleanup() OVERRIDE {}
151b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  // Send a settings frame
152b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  virtual int PostAcceptHook() OVERRIDE;
153b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  virtual void NewStream(uint32 stream_id,
154b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                         uint32 priority,
155b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                         const std::string& filename) OVERRIDE;
156b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  void AddToOutputOrder(const MemCacheIter& mci);
157b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  virtual void SendEOF(uint32 stream_id) OVERRIDE;
158b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  virtual void SendErrorNotFound(uint32 stream_id) OVERRIDE;
159b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  virtual size_t SendSynStream(uint32 stream_id,
160b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                               const BalsaHeaders& headers) OVERRIDE;
161b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  virtual size_t SendSynReply(uint32 stream_id,
162b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                              const BalsaHeaders& headers) OVERRIDE;
163b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  virtual void SendDataFrame(uint32 stream_id,
164b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                             const char* data,
165b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                             int64 len,
166b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                             uint32 flags,
167b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                             bool compress) OVERRIDE;
168b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  BufferedSpdyFramer* spdy_framer() { return buffered_spdy_framer_.get(); }
169b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
170b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  const OutputOrdering& output_ordering() const {
171b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    return client_output_ordering_;
172b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  }
173b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
174b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  static std::string forward_ip_header() { return forward_ip_header_; }
175b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  static void set_forward_ip_header(const std::string& value) {
176b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    forward_ip_header_ = value;
177b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  }
178b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  SpdyMajorVersion spdy_version() const {
179b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    DCHECK(buffered_spdy_framer_);
180b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    return buffered_spdy_framer_->protocol_version();
181b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  }
182b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
183b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru private:
184b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  void SendEOFImpl(uint32 stream_id);
185b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  void SendErrorNotFoundImpl(uint32 stream_id);
186b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  void KillStream(uint32 stream_id);
187b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  void CopyHeaders(SpdyHeaderBlock& dest, const BalsaHeaders& headers);
188b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  size_t SendSynStreamImpl(uint32 stream_id, const BalsaHeaders& headers);
189b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  size_t SendSynReplyImpl(uint32 stream_id, const BalsaHeaders& headers);
190b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  void SendDataFrameImpl(uint32 stream_id,
191b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                         const char* data,
192b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                         int64 len,
193b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                         SpdyDataFlags flags,
194b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                         bool compress);
195b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  void EnqueueDataFrame(DataFrame* df);
196b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  virtual void GetOutput() OVERRIDE;
197b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
198b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru private:
199b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  scoped_ptr<BufferedSpdyFramer> buffered_spdy_framer_;
200b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  bool valid_spdy_session_;  // True if we have seen valid data on this session.
201b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                             // Use this to fail fast when junk is sent to our
202b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                             // port.
203b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
204b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  SMConnection* connection_;
205b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  OutputList* client_output_list_;
206b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  OutputOrdering client_output_ordering_;
207b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  uint32 next_outgoing_stream_id_;
208b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  EpollServer* epoll_server_;
209b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  FlipAcceptor* acceptor_;
210b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  MemoryCache* memory_cache_;
211b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  std::vector<SMInterface*> server_interface_list;
212b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  std::vector<int32> unused_server_interface_list;
213b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  typedef std::map<uint32, SMInterface*> StreamToSmif;
214b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  StreamToSmif stream_to_smif_;
215b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  bool close_on_error_;
216b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
217b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru  static std::string forward_ip_header_;
218b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru};
219b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
220b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}  // namespace net
221b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
222b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#endif  // NET_TOOLS_FLIP_SERVER_SPDY_INTERFACE_H_
223b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru