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" 114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "net/tools/balsa/balsa_headers.h" 124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "net/tools/balsa/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) 25a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class HttpSM : public BalsaVisitorInterface, public SMInterface { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpSM(SMConnection* connection, 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SMInterface* sm_spdy_interface, 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MemoryCache* memory_cache, 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlipAcceptor* acceptor); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~HttpSM(); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BalsaVisitorInterface: 35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void ProcessBodyInput(const char* input, size_t size) OVERRIDE {} 36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void ProcessBodyData(const char* input, size_t size) OVERRIDE; 37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void ProcessHeaderInput(const char* input, size_t size) OVERRIDE {} 38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void ProcessTrailerInput(const char* input, size_t size) OVERRIDE {} 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ProcessHeaders(const BalsaHeaders& headers) OVERRIDE; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ProcessRequestFirstLine(const char* line_input, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t line_length, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* method_input, 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t method_length, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* request_uri_input, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t request_uri_length, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* version_input, 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t version_length) OVERRIDE {} 48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void ProcessResponseFirstLine(const char* line_input, 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t line_length, 50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const char* version_input, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t version_length, 52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const char* status_input, 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t status_length, 54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const char* reason_input, 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t reason_length) OVERRIDE {} 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ProcessChunkLength(size_t chunk_length) OVERRIDE {} 57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void ProcessChunkExtensions(const char* input, size_t size) OVERRIDE { 58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void HeaderDone() OVERRIDE {} 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void MessageDone() OVERRIDE; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void HandleHeaderError(BalsaFrame* framer) OVERRIDE; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void HandleHeaderWarning(BalsaFrame* framer) OVERRIDE {} 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void HandleChunkingError(BalsaFrame* framer) OVERRIDE; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void HandleBodyError(BalsaFrame* framer) OVERRIDE; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void HandleError(); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddToOutputOrder(const MemCacheIter& mci); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BalsaFrame* spdy_framer() { return http_framer_; } 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void set_is_request() OVERRIDE {} 723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const OutputOrdering& output_ordering() const { return output_ordering_; } 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SMInterface: 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void InitSMInterface(SMInterface* sm_spdy_interface, 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 server_idx) OVERRIDE; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void InitSMConnection(SMConnectionPoolInterface* connection_pool, 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SMInterface* sm_interface, 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EpollServer* epoll_server, 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int fd, 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string server_ip, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string server_port, 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string remote_ip, 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool use_ssl) OVERRIDE; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual size_t ProcessReadInput(const char* data, size_t len) OVERRIDE; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual size_t ProcessWriteInput(const char* data, size_t len) OVERRIDE; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool MessageFullyRead() const OVERRIDE; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetStreamID(uint32 stream_id) OVERRIDE; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Error() const OVERRIDE; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual const char* ErrorAsString() const OVERRIDE; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Reset() OVERRIDE; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ResetForNewInterface(int32 server_idx) OVERRIDE {} 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ResetForNewConnection() OVERRIDE; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Cleanup() OVERRIDE; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int PostAcceptHook() OVERRIDE; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 97a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void NewStream(uint32 stream_id, 98a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 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; 106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void SendDataFrame(uint32 stream_id, 107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const char* data, 108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int64 len, 109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) uint32 flags, 110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool compress) OVERRIDE; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SendEOFImpl(uint32 stream_id); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SendErrorNotFoundImpl(uint32 stream_id); 1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void SendOKResponseImpl(uint32 stream_id, const std::string& output); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t SendSynReplyImpl(uint32 stream_id, const BalsaHeaders& headers); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t SendSynStreamImpl(uint32 stream_id, const BalsaHeaders& headers); 118a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void SendDataFrameImpl(uint32 stream_id, 119a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const char* data, 120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int64 len, 121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) uint32 flags, 122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool compress); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void EnqueueDataFrame(DataFrame* df); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void GetOutput() OVERRIDE; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BalsaFrame* http_framer_; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BalsaHeaders headers_; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 stream_id_; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 server_idx_; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SMConnection* connection_; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SMInterface* sm_spdy_interface_; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OutputList* output_list_; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OutputOrdering output_ordering_; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MemoryCache* memory_cache_; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlipAcceptor* acceptor_; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} // namespace net 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#endif // NET_TOOLS_FLIP_SERVER_HTTP_INTERFACE_H_ 143