1dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Copyright (c) 2009 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_HTTP_INTERFACE_ 6dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#define NET_TOOLS_FLIP_SERVER_HTTP_INTERFACE_ 7dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 8dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include <string> 9dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 10dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/tools/flip_server/balsa_headers.h" 11dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/tools/flip_server/balsa_visitor_interface.h" 12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/tools/flip_server/output_ordering.h" 13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/tools/flip_server/sm_connection.h" 14dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/tools/flip_server/sm_interface.h" 15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsennamespace net { 17dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 18dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass BalsaFrame; 19dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass DataFrame; 20dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass EpollServer; 21dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass FlipAcceptor; 22dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass MemoryCache; 23dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 24dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass HttpSM : public BalsaVisitorInterface, 25dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen public SMInterface { 26dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen public: 27dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen HttpSM(SMConnection* connection, 28dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen SMInterface* sm_spdy_interface, 29dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EpollServer* epoll_server, 30dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen MemoryCache* memory_cache, 31dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen FlipAcceptor* acceptor); 32dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual ~HttpSM(); 33dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 34dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen private: 35dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // BalsaVisitorInterface: 36dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void ProcessBodyInput(const char *input, size_t size) {} 37dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void ProcessBodyData(const char *input, size_t size); 38dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void ProcessHeaderInput(const char *input, size_t size) {} 39dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void ProcessTrailerInput(const char *input, size_t size) {} 40dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void ProcessHeaders(const BalsaHeaders& headers); 41dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void ProcessRequestFirstLine(const char* line_input, 42dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen size_t line_length, 43dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const char* method_input, 44dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen size_t method_length, 45dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const char* request_uri_input, 46dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen size_t request_uri_length, 47dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const char* version_input, 48dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen size_t version_length) {} 49dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void ProcessResponseFirstLine(const char *line_input, 50dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen size_t line_length, 51dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const char *version_input, 52dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen size_t version_length, 53dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const char *status_input, 54dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen size_t status_length, 55dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const char *reason_input, 56dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen size_t reason_length) {} 57dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void ProcessChunkLength(size_t chunk_length) {} 58dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void ProcessChunkExtensions(const char *input, size_t size) {} 59dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void HeaderDone() {} 60dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void MessageDone(); 61dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void HandleHeaderError(BalsaFrame* framer); 62dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void HandleHeaderWarning(BalsaFrame* framer) {} 63dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void HandleChunkingError(BalsaFrame* framer); 64dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void HandleBodyError(BalsaFrame* framer); 65dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 66dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void HandleError(); 67dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 68dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen public: 69dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void AddToOutputOrder(const MemCacheIter& mci); 70dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void SendOKResponse(uint32 stream_id, std::string* output); 71dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen BalsaFrame* spdy_framer() { return http_framer_; } 72dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void set_is_request() {} 73dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 74dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // SMInterface: 75dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void InitSMInterface(SMInterface* sm_spdy_interface, 76dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen int32 server_idx); 77dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void InitSMConnection(SMConnectionPoolInterface* connection_pool, 78dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen SMInterface* sm_interface, 79dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EpollServer* epoll_server, 80dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen int fd, 81dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen std::string server_ip, 82dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen std::string server_port, 83dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen std::string remote_ip, 84dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen bool use_ssl); 85dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual size_t ProcessReadInput(const char* data, size_t len); 86dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual size_t ProcessWriteInput(const char* data, size_t len); 87dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual bool MessageFullyRead() const; 88dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void SetStreamID(uint32 stream_id); 89dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual bool Error() const; 90dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual const char* ErrorAsString() const; 91dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void Reset(); 92dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void ResetForNewInterface(int32 server_idx) {} 93dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void ResetForNewConnection(); 94dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void Cleanup(); 95dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual int PostAcceptHook(); 96dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 97dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void NewStream(uint32 stream_id, uint32 priority, 98dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const std::string& filename); 99dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void SendEOF(uint32 stream_id); 100dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void SendErrorNotFound(uint32 stream_id); 101dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual size_t SendSynStream(uint32 stream_id, const BalsaHeaders& headers); 102dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual size_t SendSynReply(uint32 stream_id, const BalsaHeaders& headers); 103dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void SendDataFrame(uint32 stream_id, const char* data, int64 len, 104dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen uint32 flags, bool compress); 105dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 106dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen private: 107dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void SendEOFImpl(uint32 stream_id); 108dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void SendErrorNotFoundImpl(uint32 stream_id); 109dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void SendOKResponseImpl(uint32 stream_id, std::string* output); 110dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen size_t SendSynReplyImpl(uint32 stream_id, const BalsaHeaders& headers); 111dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen size_t SendSynStreamImpl(uint32 stream_id, const BalsaHeaders& headers); 112dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void SendDataFrameImpl(uint32 stream_id, const char* data, int64 len, 113dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen uint32 flags, bool compress); 114dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void EnqueueDataFrame(DataFrame* df); 115dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void GetOutput(); 116dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 117dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen private: 118dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen uint64 seq_num_; 119dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen BalsaFrame* http_framer_; 120dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen BalsaHeaders headers_; 121dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen uint32 stream_id_; 122dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen int32 server_idx_; 123dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 124dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen SMConnection* connection_; 125dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen SMInterface* sm_spdy_interface_; 126dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen OutputList* output_list_; 127dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen OutputOrdering output_ordering_; 128dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen MemoryCache* memory_cache_; 129dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen FlipAcceptor* acceptor_; 130dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}; 131dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 132dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} // namespace 133dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 134dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif // NET_TOOLS_FLIP_SERVER_HTTP_INTERFACE_ 135dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 136