http_interface.h revision 3551c9c881056c480085172ff9840cab31610854
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#ifndef NET_TOOLS_FLIP_SERVER_HTTP_INTERFACE_H_ 63551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#define NET_TOOLS_FLIP_SERVER_HTTP_INTERFACE_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/tools/flip_server/balsa_headers.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/tools/flip_server/balsa_visitor_interface.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/tools/flip_server/output_ordering.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/tools/flip_server/sm_connection.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/tools/flip_server/sm_interface.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BalsaFrame; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DataFrame; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class EpollServer; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FlipAcceptor; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MemoryCache; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HttpSM : public BalsaVisitorInterface, 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public SMInterface { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpSM(SMConnection* connection, 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SMInterface* sm_spdy_interface, 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MemoryCache* memory_cache, 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlipAcceptor* acceptor); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~HttpSM(); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BalsaVisitorInterface: 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ProcessBodyInput(const char *input, size_t size) OVERRIDE {} 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ProcessBodyData(const char *input, size_t size) OVERRIDE; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ProcessHeaderInput(const char *input, size_t size) OVERRIDE {} 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ProcessTrailerInput(const char *input, size_t size) OVERRIDE {} 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ProcessHeaders(const BalsaHeaders& headers) OVERRIDE; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ProcessRequestFirstLine(const char* line_input, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t line_length, 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* method_input, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t method_length, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* request_uri_input, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t request_uri_length, 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* version_input, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t version_length) OVERRIDE {} 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ProcessResponseFirstLine(const char *line_input, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t line_length, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *version_input, 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t version_length, 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *status_input, 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t status_length, 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *reason_input, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t reason_length) OVERRIDE {} 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ProcessChunkLength(size_t chunk_length) OVERRIDE {} 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ProcessChunkExtensions(const char *input, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t size) OVERRIDE {} 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void HeaderDone() OVERRIDE {} 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void MessageDone() OVERRIDE; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void HandleHeaderError(BalsaFrame* framer) OVERRIDE; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void HandleHeaderWarning(BalsaFrame* framer) OVERRIDE {} 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void HandleChunkingError(BalsaFrame* framer) OVERRIDE; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void HandleBodyError(BalsaFrame* framer) OVERRIDE; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void HandleError(); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddToOutputOrder(const MemCacheIter& mci); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BalsaFrame* spdy_framer() { return http_framer_; } 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void set_is_request() OVERRIDE {} 733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const OutputOrdering& output_ordering() const { return output_ordering_; } 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SMInterface: 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void InitSMInterface(SMInterface* sm_spdy_interface, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 server_idx) OVERRIDE; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void InitSMConnection(SMConnectionPoolInterface* connection_pool, 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SMInterface* sm_interface, 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EpollServer* epoll_server, 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int fd, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string server_ip, 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string server_port, 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string remote_ip, 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool use_ssl) OVERRIDE; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual size_t ProcessReadInput(const char* data, size_t len) OVERRIDE; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual size_t ProcessWriteInput(const char* data, size_t len) OVERRIDE; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool MessageFullyRead() const OVERRIDE; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetStreamID(uint32 stream_id) OVERRIDE; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Error() const OVERRIDE; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual const char* ErrorAsString() const OVERRIDE; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Reset() OVERRIDE; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ResetForNewInterface(int32 server_idx) OVERRIDE {} 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ResetForNewConnection() OVERRIDE; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Cleanup() OVERRIDE; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int PostAcceptHook() OVERRIDE; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void NewStream(uint32 stream_id, uint32 priority, 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& filename) OVERRIDE; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SendEOF(uint32 stream_id) OVERRIDE; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SendErrorNotFound(uint32 stream_id) OVERRIDE; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual size_t SendSynStream(uint32 stream_id, 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BalsaHeaders& headers) OVERRIDE; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual size_t SendSynReply(uint32 stream_id, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BalsaHeaders& headers) OVERRIDE; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SendDataFrame(uint32 stream_id, const char* data, int64 len, 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 flags, bool compress) OVERRIDE; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SendEOFImpl(uint32 stream_id); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SendErrorNotFoundImpl(uint32 stream_id); 1123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void SendOKResponseImpl(uint32 stream_id, const std::string& output); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t SendSynReplyImpl(uint32 stream_id, const BalsaHeaders& headers); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t SendSynStreamImpl(uint32 stream_id, const BalsaHeaders& headers); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SendDataFrameImpl(uint32 stream_id, const char* data, int64 len, 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 flags, bool compress); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void EnqueueDataFrame(DataFrame* df); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void GetOutput() OVERRIDE; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BalsaFrame* http_framer_; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BalsaHeaders headers_; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 stream_id_; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 server_idx_; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SMConnection* connection_; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SMInterface* sm_spdy_interface_; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OutputList* output_list_; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OutputOrdering output_ordering_; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MemoryCache* memory_cache_; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlipAcceptor* acceptor_; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} // namespace net 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#endif // NET_TOOLS_FLIP_SERVER_HTTP_INTERFACE_H_ 137