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