| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 // | 4 // |
| 5 // A toy client, which connects to a specified port and sends QUIC | 5 // A toy client, which connects to a specified port and sends QUIC |
| 6 // request to that endpoint. | 6 // request to that endpoint. |
| 7 | 7 |
| 8 #ifndef NET_TOOLS_QUIC_QUIC_CLIENT_H_ | 8 #ifndef NET_TOOLS_QUIC_QUIC_CLIENT_H_ |
| 9 #define NET_TOOLS_QUIC_QUIC_CLIENT_H_ | 9 #define NET_TOOLS_QUIC_QUIC_CLIENT_H_ |
| 10 | 10 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 33 class QuicEpollConnectionHelper; | 33 class QuicEpollConnectionHelper; |
| 34 | 34 |
| 35 namespace test { | 35 namespace test { |
| 36 class QuicClientPeer; | 36 class QuicClientPeer; |
| 37 } // namespace test | 37 } // namespace test |
| 38 | 38 |
| 39 class QuicClient : public QuicClientBase, | 39 class QuicClient : public QuicClientBase, |
| 40 public EpollCallbackInterface, | 40 public EpollCallbackInterface, |
| 41 public ProcessPacketInterface { | 41 public ProcessPacketInterface { |
| 42 public: | 42 public: |
| 43 class ResponseListener { | |
| 44 public: | |
| 45 ResponseListener() {} | |
| 46 virtual ~ResponseListener() {} | |
| 47 virtual void OnCompleteResponse(QuicStreamId id, | |
| 48 const SpdyHeaderBlock& response_headers, | |
| 49 const std::string& response_body) = 0; | |
| 50 }; | |
| 51 | |
| 52 // Create a quic client, which will have events managed by an externally owned | 43 // Create a quic client, which will have events managed by an externally owned |
| 53 // EpollServer. | 44 // EpollServer. |
| 54 QuicClient(IPEndPoint server_address, | 45 QuicClient(IPEndPoint server_address, |
| 55 const QuicServerId& server_id, | 46 const QuicServerId& server_id, |
| 56 const QuicVersionVector& supported_versions, | 47 const QuicVersionVector& supported_versions, |
| 57 EpollServer* epoll_server, | 48 EpollServer* epoll_server, |
| 58 std::unique_ptr<ProofVerifier> proof_verifier); | 49 std::unique_ptr<ProofVerifier> proof_verifier); |
| 59 QuicClient(IPEndPoint server_address, | 50 QuicClient(IPEndPoint server_address, |
| 60 const QuicServerId& server_id, | 51 const QuicServerId& server_id, |
| 61 const QuicVersionVector& supported_versions, | 52 const QuicVersionVector& supported_versions, |
| 62 const QuicConfig& config, | 53 const QuicConfig& config, |
| 63 EpollServer* epoll_server, | 54 EpollServer* epoll_server, |
| 64 std::unique_ptr<ProofVerifier> proof_verifier); | 55 std::unique_ptr<ProofVerifier> proof_verifier); |
| 65 | 56 |
| 66 ~QuicClient() override; | 57 ~QuicClient() override; |
| 67 | 58 |
| 68 // From QuicClientBase | 59 // From QuicClientBase |
| 69 bool Initialize() override; | 60 bool Initialize() override; |
| 70 bool WaitForEvents() override; | 61 bool WaitForEvents() override; |
| 71 QuicSpdyClientStream* CreateReliableClientStream() override; | |
| 72 | 62 |
| 73 // "Connect" to the QUIC server, including performing synchronous crypto | 63 // "Connect" to the QUIC server, including performing synchronous crypto |
| 74 // handshake. | 64 // handshake. |
| 75 bool Connect(); | 65 bool Connect(); |
| 76 | 66 |
| 77 // Start the crypto handshake. This can be done in place of the synchronous | 67 // Start the crypto handshake. This can be done in place of the synchronous |
| 78 // Connect(), but callers are responsible for making sure the crypto handshake | 68 // Connect(), but callers are responsible for making sure the crypto handshake |
| 79 // completes. | 69 // completes. |
| 80 void StartConnect(); | 70 void StartConnect(); |
| 81 | 71 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 102 // From EpollCallbackInterface | 92 // From EpollCallbackInterface |
| 103 void OnRegistration(EpollServer* eps, int fd, int event_mask) override {} | 93 void OnRegistration(EpollServer* eps, int fd, int event_mask) override {} |
| 104 void OnModification(int fd, int event_mask) override {} | 94 void OnModification(int fd, int event_mask) override {} |
| 105 void OnEvent(int fd, EpollEvent* event) override; | 95 void OnEvent(int fd, EpollEvent* event) override; |
| 106 // |fd_| can be unregistered without the client being disconnected. This | 96 // |fd_| can be unregistered without the client being disconnected. This |
| 107 // happens in b3m QuicProber where we unregister |fd_| to feed in events to | 97 // happens in b3m QuicProber where we unregister |fd_| to feed in events to |
| 108 // the client from the SelectServer. | 98 // the client from the SelectServer. |
| 109 void OnUnregistration(int fd, bool replaced) override {} | 99 void OnUnregistration(int fd, bool replaced) override {} |
| 110 void OnShutdown(EpollServer* eps, int fd) override {} | 100 void OnShutdown(EpollServer* eps, int fd) override {} |
| 111 | 101 |
| 112 // QuicSpdyStream::Visitor | |
| 113 void OnClose(QuicSpdyStream* stream) override; | |
| 114 | |
| 115 // If the client has at least one UDP socket, return address of the latest | 102 // If the client has at least one UDP socket, return address of the latest |
| 116 // created one. Otherwise, return an empty socket address. | 103 // created one. Otherwise, return an empty socket address. |
| 117 const IPEndPoint GetLatestClientAddress() const; | 104 const IPEndPoint GetLatestClientAddress() const; |
| 118 | 105 |
| 119 // If the client has at least one UDP socket, return the latest created one. | 106 // If the client has at least one UDP socket, return the latest created one. |
| 120 // Otherwise, return -1. | 107 // Otherwise, return -1. |
| 121 int GetLatestFD() const; | 108 int GetLatestFD() const; |
| 122 | 109 |
| 123 void set_bind_to_address(const IPAddress& address) { | |
| 124 bind_to_address_ = address; | |
| 125 } | |
| 126 | |
| 127 const IPAddress& bind_to_address() const { return bind_to_address_; } | |
| 128 | |
| 129 void set_local_port(int local_port) { local_port_ = local_port; } | |
| 130 | |
| 131 const IPEndPoint& server_address() const { return server_address_; } | |
| 132 | |
| 133 void set_server_address(const IPEndPoint& server_address) { | |
| 134 server_address_ = server_address; | |
| 135 } | |
| 136 | |
| 137 // Takes ownership of the std::listener. | |
| 138 void set_response_listener(ResponseListener* listener) { | |
| 139 response_listener_.reset(listener); | |
| 140 } | |
| 141 | |
| 142 void set_store_response(bool val) { store_response_ = val; } | |
| 143 | |
| 144 size_t latest_response_code() const; | |
| 145 const std::string& latest_response_headers() const; | |
| 146 const SpdyHeaderBlock& latest_response_header_block() const; | |
| 147 const std::string& latest_response_body() const; | |
| 148 const std::string& latest_response_trailers() const; | |
| 149 | |
| 150 protected: | 110 protected: |
| 151 // Implements ProcessPacketInterface. This will be called for each received | 111 // Implements ProcessPacketInterface. This will be called for each received |
| 152 // packet. | 112 // packet. |
| 153 void ProcessPacket(const IPEndPoint& self_address, | 113 void ProcessPacket(const IPEndPoint& self_address, |
| 154 const IPEndPoint& peer_address, | 114 const IPEndPoint& peer_address, |
| 155 const QuicReceivedPacket& packet) override; | 115 const QuicReceivedPacket& packet) override; |
| 156 | 116 |
| 157 virtual QuicPacketWriter* CreateQuicPacketWriter(); | 117 virtual QuicPacketWriter* CreateQuicPacketWriter(); |
| 158 | 118 |
| 159 // If |fd| is an open UDP socket, unregister and close it. Otherwise, do | 119 // If |fd| is an open UDP socket, unregister and close it. Otherwise, do |
| (...skipping 12 matching lines...) Expand all Loading... |
| 172 private: | 132 private: |
| 173 friend class net::test::QuicClientPeer; | 133 friend class net::test::QuicClientPeer; |
| 174 | 134 |
| 175 // Used during initialization: creates the UDP socket FD, sets socket options, | 135 // Used during initialization: creates the UDP socket FD, sets socket options, |
| 176 // and binds the socket to our address. | 136 // and binds the socket to our address. |
| 177 bool CreateUDPSocketAndBind(); | 137 bool CreateUDPSocketAndBind(); |
| 178 | 138 |
| 179 // Actually clean up |fd|. | 139 // Actually clean up |fd|. |
| 180 void CleanUpUDPSocketImpl(int fd); | 140 void CleanUpUDPSocketImpl(int fd); |
| 181 | 141 |
| 182 // Address of the server. | |
| 183 IPEndPoint server_address_; | |
| 184 | |
| 185 // If initialized, the address to bind to. | |
| 186 IPAddress bind_to_address_; | |
| 187 | |
| 188 // Local port to bind to. Initialize to 0. | |
| 189 int local_port_; | |
| 190 | |
| 191 // Listens for events on the client socket. | 142 // Listens for events on the client socket. |
| 192 EpollServer* epoll_server_; | 143 EpollServer* epoll_server_; |
| 193 | 144 |
| 194 // Map mapping created UDP sockets to their addresses. By using linked hash | 145 // Map mapping created UDP sockets to their addresses. By using linked hash |
| 195 // map, the order of socket creation can be recorded. | 146 // map, the order of socket creation can be recorded. |
| 196 linked_hash_map<int, IPEndPoint> fd_address_map_; | 147 linked_hash_map<int, IPEndPoint> fd_address_map_; |
| 197 | 148 |
| 198 // Listens for full responses. | |
| 199 std::unique_ptr<ResponseListener> response_listener_; | |
| 200 | |
| 201 // Tracks if the client is initialized to connect. | 149 // Tracks if the client is initialized to connect. |
| 202 bool initialized_; | 150 bool initialized_; |
| 203 | 151 |
| 204 // If overflow_supported_ is true, this will be the number of packets dropped | 152 // If overflow_supported_ is true, this will be the number of packets dropped |
| 205 // during the lifetime of the server. | 153 // during the lifetime of the server. |
| 206 QuicPacketCount packets_dropped_; | 154 QuicPacketCount packets_dropped_; |
| 207 | 155 |
| 208 // True if the kernel supports SO_RXQ_OVFL, the number of packets dropped | 156 // True if the kernel supports SO_RXQ_OVFL, the number of packets dropped |
| 209 // because the socket would otherwise overflow. | 157 // because the socket would otherwise overflow. |
| 210 bool overflow_supported_; | 158 bool overflow_supported_; |
| 211 | 159 |
| 212 // If true, store the latest response code, headers, and body. | |
| 213 bool store_response_; | |
| 214 // HTTP response code from most recent response. | |
| 215 int latest_response_code_; | |
| 216 // HTTP/2 headers from most recent response. | |
| 217 std::string latest_response_headers_; | |
| 218 // HTTP/2 header black from most recent response. | |
| 219 SpdyHeaderBlock latest_response_header_block_; | |
| 220 // Body of most recent response. | |
| 221 std::string latest_response_body_; | |
| 222 // HTTP/2 trailers from most recent response. | |
| 223 std::string latest_response_trailers_; | |
| 224 | |
| 225 // Point to a QuicPacketReader object on the heap. The reader allocates more | 160 // Point to a QuicPacketReader object on the heap. The reader allocates more |
| 226 // space than allowed on the stack. | 161 // space than allowed on the stack. |
| 227 // | 162 // |
| 228 // TODO(rtenneti): Chromium code doesn't use |packet_reader_|. Add support for | 163 // TODO(rtenneti): Chromium code doesn't use |packet_reader_|. Add support for |
| 229 // QuicPacketReader | 164 // QuicPacketReader |
| 230 std::unique_ptr<QuicPacketReader> packet_reader_; | 165 std::unique_ptr<QuicPacketReader> packet_reader_; |
| 231 | 166 |
| 232 DISALLOW_COPY_AND_ASSIGN(QuicClient); | 167 DISALLOW_COPY_AND_ASSIGN(QuicClient); |
| 233 }; | 168 }; |
| 234 | 169 |
| 235 } // namespace net | 170 } // namespace net |
| 236 | 171 |
| 237 #endif // NET_TOOLS_QUIC_QUIC_CLIENT_H_ | 172 #endif // NET_TOOLS_QUIC_QUIC_CLIENT_H_ |
| OLD | NEW |