| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #ifndef NET_TOOLS_FLIP_SERVER_SM_CONNECTION_H_ | |
| 6 #define NET_TOOLS_FLIP_SERVER_SM_CONNECTION_H_ | |
| 7 | |
| 8 #include <arpa/inet.h> // in_addr_t | |
| 9 #include <stddef.h> | |
| 10 #include <time.h> | |
| 11 | |
| 12 #include <list> | |
| 13 #include <string> | |
| 14 | |
| 15 #include "base/compiler_specific.h" | |
| 16 #include "net/spdy/spdy_protocol.h" | |
| 17 #include "net/tools/epoll_server/epoll_server.h" | |
| 18 #include "net/tools/flip_server/mem_cache.h" | |
| 19 #include "net/tools/flip_server/ring_buffer.h" | |
| 20 #include "net/tools/flip_server/sm_interface.h" | |
| 21 #include "openssl/ssl.h" | |
| 22 | |
| 23 namespace net { | |
| 24 | |
| 25 class FlipAcceptor; | |
| 26 class MemoryCache; | |
| 27 struct SSLState; | |
| 28 class SpdySM; | |
| 29 | |
| 30 // A frame of data to be sent. | |
| 31 class DataFrame { | |
| 32 public: | |
| 33 const char* data; | |
| 34 size_t size; | |
| 35 bool delete_when_done; | |
| 36 size_t index; | |
| 37 DataFrame() : data(NULL), size(0), delete_when_done(false), index(0) {} | |
| 38 virtual ~DataFrame(); | |
| 39 }; | |
| 40 | |
| 41 typedef std::list<DataFrame*> OutputList; | |
| 42 | |
| 43 class SMConnection : public SMConnectionInterface, | |
| 44 public EpollCallbackInterface, | |
| 45 public NotifierInterface { | |
| 46 public: | |
| 47 ~SMConnection() override; | |
| 48 | |
| 49 static SMConnection* NewSMConnection(EpollServer* epoll_server, | |
| 50 SSLState* ssl_state, | |
| 51 MemoryCache* memory_cache, | |
| 52 FlipAcceptor* acceptor, | |
| 53 std::string log_prefix); | |
| 54 | |
| 55 // TODO(mbelshe): Make these private. | |
| 56 time_t last_read_time_; | |
| 57 std::string server_ip_; | |
| 58 std::string server_port_; | |
| 59 | |
| 60 EpollServer* epoll_server() override; | |
| 61 OutputList* output_list() { return &output_list_; } | |
| 62 MemoryCache* memory_cache() { return memory_cache_; } | |
| 63 void ReadyToSend() override; | |
| 64 void EnqueueDataFrame(DataFrame* df); | |
| 65 | |
| 66 int fd() const { return fd_; } | |
| 67 bool initialized() const { return initialized_; } | |
| 68 std::string client_ip() const { return client_ip_; } | |
| 69 | |
| 70 virtual void InitSMConnection(SMConnectionPoolInterface* connection_pool, | |
| 71 SMInterface* sm_interface, | |
| 72 EpollServer* epoll_server, | |
| 73 int fd, | |
| 74 std::string server_ip, | |
| 75 std::string server_port, | |
| 76 std::string remote_ip, | |
| 77 bool use_ssl); | |
| 78 | |
| 79 void CorkSocket(); | |
| 80 void UncorkSocket(); | |
| 81 | |
| 82 int Send(const char* data, int len, int flags); | |
| 83 | |
| 84 // EpollCallbackInterface interface. | |
| 85 void OnRegistration(EpollServer* eps, int fd, int event_mask) override; | |
| 86 void OnModification(int fd, int event_mask) override {} | |
| 87 void OnEvent(int fd, EpollEvent* event) override; | |
| 88 void OnUnregistration(int fd, bool replaced) override; | |
| 89 void OnShutdown(EpollServer* eps, int fd) override; | |
| 90 | |
| 91 // NotifierInterface interface. | |
| 92 void Notify() override {} | |
| 93 | |
| 94 void Cleanup(const char* cleanup); | |
| 95 | |
| 96 // Flag indicating if we should force spdy on all connections. | |
| 97 static bool force_spdy() { return force_spdy_; } | |
| 98 static void set_force_spdy(bool value) { force_spdy_ = value; } | |
| 99 | |
| 100 private: | |
| 101 // Decide if SPDY was negotiated. | |
| 102 bool WasSpdyNegotiated(); | |
| 103 | |
| 104 // Initialize the protocol interfaces we'll need for this connection. | |
| 105 // Returns true if successful, false otherwise. | |
| 106 bool SetupProtocolInterfaces(); | |
| 107 | |
| 108 bool DoRead(); | |
| 109 bool DoWrite(); | |
| 110 bool DoConsumeReadData(); | |
| 111 void Reset(); | |
| 112 | |
| 113 void HandleEvents(); | |
| 114 void HandleResponseFullyRead(); | |
| 115 | |
| 116 protected: | |
| 117 friend std::ostream& operator<<(std::ostream& os, const SMConnection& c) { | |
| 118 os << &c << "\n"; | |
| 119 return os; | |
| 120 } | |
| 121 | |
| 122 SMConnection(EpollServer* epoll_server, | |
| 123 SSLState* ssl_state, | |
| 124 MemoryCache* memory_cache, | |
| 125 FlipAcceptor* acceptor, | |
| 126 std::string log_prefix); | |
| 127 | |
| 128 private: | |
| 129 int fd_; | |
| 130 int events_; | |
| 131 | |
| 132 bool registered_in_epoll_server_; | |
| 133 bool initialized_; | |
| 134 bool protocol_detected_; | |
| 135 bool connection_complete_; | |
| 136 | |
| 137 SMConnectionPoolInterface* connection_pool_; | |
| 138 | |
| 139 EpollServer* epoll_server_; | |
| 140 SSLState* ssl_state_; | |
| 141 MemoryCache* memory_cache_; | |
| 142 FlipAcceptor* acceptor_; | |
| 143 std::string client_ip_; | |
| 144 | |
| 145 RingBuffer read_buffer_; | |
| 146 | |
| 147 OutputList output_list_; | |
| 148 SpdySM* sm_spdy_interface_; | |
| 149 SMInterface* sm_http_interface_; | |
| 150 SMInterface* sm_streamer_interface_; | |
| 151 SMInterface* sm_interface_; | |
| 152 std::string log_prefix_; | |
| 153 | |
| 154 size_t max_bytes_sent_per_dowrite_; | |
| 155 | |
| 156 SSL* ssl_; | |
| 157 | |
| 158 static bool force_spdy_; | |
| 159 }; | |
| 160 | |
| 161 } // namespace net | |
| 162 | |
| 163 #endif // NET_TOOLS_FLIP_SERVER_SM_CONNECTION_H_ | |
| OLD | NEW |