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