Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(211)

Side by Side Diff: net/tools/quic/quic_client.h

Issue 1297853002: QUIC - reorganize common code between quic_client and quic_simple_client (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
11 #include <string> 11 #include <string>
12 12
13 #include "base/basictypes.h" 13 #include "base/basictypes.h"
14 #include "base/command_line.h" 14 #include "base/command_line.h"
15 #include "base/memory/scoped_ptr.h" 15 #include "base/memory/scoped_ptr.h"
16 #include "base/strings/string_piece.h" 16 #include "base/strings/string_piece.h"
17 #include "net/base/ip_endpoint.h" 17 #include "net/base/ip_endpoint.h"
18 #include "net/quic/crypto/crypto_handshake.h"
19 #include "net/quic/quic_config.h" 18 #include "net/quic/quic_config.h"
20 #include "net/quic/quic_framer.h" 19 #include "net/quic/quic_data_stream.h"
21 #include "net/quic/quic_packet_creator.h"
22 #include "net/tools/balsa/balsa_headers.h" 20 #include "net/tools/balsa/balsa_headers.h"
23 #include "net/tools/epoll_server/epoll_server.h" 21 #include "net/tools/epoll_server/epoll_server.h"
24 #include "net/tools/quic/quic_client_session.h" 22 #include "net/tools/quic/quic_client_base.h"
25 #include "net/tools/quic/quic_spdy_client_stream.h"
26 23
27 namespace net { 24 namespace net {
28 25
29 class ProofVerifier;
30 class QuicServerId; 26 class QuicServerId;
31 27
32 namespace tools { 28 namespace tools {
33 29
34 class QuicEpollConnectionHelper; 30 class QuicEpollConnectionHelper;
35 31
36 namespace test { 32 namespace test {
37 class QuicClientPeer; 33 class QuicClientPeer;
38 } // namespace test 34 } // namespace test
39 35
40 class QuicClient : public EpollCallbackInterface, 36 class QuicClient : public QuicClientBase,
37 public EpollCallbackInterface,
41 public QuicDataStream::Visitor { 38 public QuicDataStream::Visitor {
42 public: 39 public:
43 class ResponseListener { 40 class ResponseListener {
44 public: 41 public:
45 ResponseListener() {} 42 ResponseListener() {}
46 virtual ~ResponseListener() {} 43 virtual ~ResponseListener() {}
47 virtual void OnCompleteResponse(QuicStreamId id, 44 virtual void OnCompleteResponse(QuicStreamId id,
48 const BalsaHeaders& response_headers, 45 const BalsaHeaders& response_headers,
49 const std::string& response_body) = 0; 46 const std::string& response_body) = 0;
50 }; 47 };
51 48
52 // A packet writer factory that always returns the same writer.
53 class DummyPacketWriterFactory : public QuicConnection::PacketWriterFactory {
54 public:
55 explicit DummyPacketWriterFactory(QuicPacketWriter* writer);
56 ~DummyPacketWriterFactory() override;
57
58 QuicPacketWriter* Create(QuicConnection* connection) const override;
59
60 private:
61 QuicPacketWriter* writer_;
62 };
63
64 // The client uses these objects to keep track of any data to resend upon 49 // The client uses these objects to keep track of any data to resend upon
65 // receipt of a stateless reject. Recall that the client API allows callers 50 // receipt of a stateless reject. Recall that the client API allows callers
66 // to optimistically send data to the server prior to handshake-confirmation. 51 // to optimistically send data to the server prior to handshake-confirmation.
67 // If the client subsequently receives a stateless reject, it must tear down 52 // If the client subsequently receives a stateless reject, it must tear down
68 // its existing session, create a new session, and resend all previously sent 53 // its existing session, create a new session, and resend all previously sent
69 // data. It uses these objects to keep track of all the sent data, and to 54 // data. It uses these objects to keep track of all the sent data, and to
70 // resend the data upon a subsequent connection. 55 // resend the data upon a subsequent connection.
71 class QuicDataToResend { 56 class QuicDataToResend {
72 public: 57 public:
73 // Takes ownership of |headers|. |headers| may be null, since it's possible 58 // Takes ownership of |headers|. |headers| may be null, since it's possible
(...skipping 22 matching lines...) Expand all
96 const QuicVersionVector& supported_versions, 81 const QuicVersionVector& supported_versions,
97 EpollServer* epoll_server); 82 EpollServer* epoll_server);
98 QuicClient(IPEndPoint server_address, 83 QuicClient(IPEndPoint server_address,
99 const QuicServerId& server_id, 84 const QuicServerId& server_id,
100 const QuicVersionVector& supported_versions, 85 const QuicVersionVector& supported_versions,
101 const QuicConfig& config, 86 const QuicConfig& config,
102 EpollServer* epoll_server); 87 EpollServer* epoll_server);
103 88
104 ~QuicClient() override; 89 ~QuicClient() override;
105 90
106 // Initializes the client to create a connection. Should be called exactly 91 // From QuicClientBase
107 // once before calling StartConnect or Connect. Returns true if the 92 bool Initialize() override;
108 // initialization succeeds, false otherwise. 93 bool WaitForEvents() override;
109 bool Initialize();
110 94
111 // "Connect" to the QUIC server, including performing synchronous crypto 95 // "Connect" to the QUIC server, including performing synchronous crypto
112 // handshake. 96 // handshake.
113 bool Connect(); 97 bool Connect();
114 98
115 // Start the crypto handshake. This can be done in place of the synchronous 99 // Start the crypto handshake. This can be done in place of the synchronous
116 // Connect(), but callers are responsible for making sure the crypto handshake 100 // Connect(), but callers are responsible for making sure the crypto handshake
117 // completes. 101 // completes.
118 void StartConnect(); 102 void StartConnect();
119 103
120 // Returns true if the crypto handshake has yet to establish encryption.
121 // Returns false if encryption is active (even if the server hasn't confirmed
122 // the handshake) or if the connection has been closed.
123 bool EncryptionBeingEstablished();
124
125 // Disconnects from the QUIC server. 104 // Disconnects from the QUIC server.
126 void Disconnect(); 105 void Disconnect();
127 106
128 // Sends an HTTP request and does not wait for response before returning. 107 // Sends an HTTP request and does not wait for response before returning.
129 void SendRequest(const BalsaHeaders& headers, 108 void SendRequest(const BalsaHeaders& headers,
130 base::StringPiece body, 109 base::StringPiece body,
131 bool fin); 110 bool fin);
132 111
133 // Sends an HTTP request and waits for response before returning. 112 // Sends an HTTP request and waits for response before returning.
134 void SendRequestAndWaitForResponse(const BalsaHeaders& headers, 113 void SendRequestAndWaitForResponse(const BalsaHeaders& headers,
135 base::StringPiece body, 114 base::StringPiece body,
136 bool fin); 115 bool fin);
137 116
138 // Sends a request simple GET for each URL in |args|, and then waits for 117 // Sends a request simple GET for each URL in |args|, and then waits for
139 // each to complete. 118 // each to complete.
140 void SendRequestsAndWaitForResponse( 119 void SendRequestsAndWaitForResponse(
141 const std::vector<std::string>& url_list); 120 const std::vector<std::string>& url_list);
142 121
143 // Returns a newly created QuicSpdyClientStream, owned by the
144 // QuicClient.
145 QuicSpdyClientStream* CreateReliableClientStream();
146
147 // Wait for events until the stream with the given ID is closed.
148 void WaitForStreamToClose(QuicStreamId id);
149
150 // Wait for events until the handshake is confirmed.
151 void WaitForCryptoHandshakeConfirmed();
152
153 // Wait up to 50ms, and handle any events which occur.
154 // Returns true if there are any outstanding requests.
155 bool WaitForEvents();
156
157 // Migrate to a new socket during an active connection. 122 // Migrate to a new socket during an active connection.
158 bool MigrateSocket(const IPAddressNumber& new_host); 123 bool MigrateSocket(const IPAddressNumber& new_host);
159 124
160 // From EpollCallbackInterface 125 // From EpollCallbackInterface
161 void OnRegistration(EpollServer* eps, int fd, int event_mask) override {} 126 void OnRegistration(EpollServer* eps, int fd, int event_mask) override {}
162 void OnModification(int fd, int event_mask) override {} 127 void OnModification(int fd, int event_mask) override {}
163 void OnEvent(int fd, EpollEvent* event) override; 128 void OnEvent(int fd, EpollEvent* event) override;
164 // |fd_| can be unregistered without the client being disconnected. This 129 // |fd_| can be unregistered without the client being disconnected. This
165 // happens in b3m QuicProber where we unregister |fd_| to feed in events to 130 // happens in b3m QuicProber where we unregister |fd_| to feed in events to
166 // the client from the SelectServer. 131 // the client from the SelectServer.
167 void OnUnregistration(int fd, bool replaced) override {} 132 void OnUnregistration(int fd, bool replaced) override {}
168 void OnShutdown(EpollServer* eps, int fd) override {} 133 void OnShutdown(EpollServer* eps, int fd) override {}
169 134
170 // QuicDataStream::Visitor 135 // QuicDataStream::Visitor
171 void OnClose(QuicDataStream* stream) override; 136 void OnClose(QuicDataStream* stream) override;
172 137
173 // If the crypto handshake has not yet been confirmed, adds the data to the 138 // If the crypto handshake has not yet been confirmed, adds the data to the
174 // queue of data to resend if the client receives a stateless reject. 139 // queue of data to resend if the client receives a stateless reject.
175 // Otherwise, deletes the data. Takes ownerership of |data_to_resend|. 140 // Otherwise, deletes the data. Takes ownerership of |data_to_resend|.
176 void MaybeAddQuicDataToResend(QuicDataToResend* data_to_resend); 141 void MaybeAddQuicDataToResend(QuicDataToResend* data_to_resend);
177 142
178 QuicClientSession* session() { return session_.get(); }
179
180 bool connected() const;
181 bool goaway_received() const;
182
183 void set_bind_to_address(IPAddressNumber address) { 143 void set_bind_to_address(IPAddressNumber address) {
184 bind_to_address_ = address; 144 bind_to_address_ = address;
185 } 145 }
186 146
187 IPAddressNumber bind_to_address() const { return bind_to_address_; } 147 IPAddressNumber bind_to_address() const { return bind_to_address_; }
188 148
189 void set_local_port(int local_port) { local_port_ = local_port; } 149 void set_local_port(int local_port) { local_port_ = local_port; }
190 150
191 const IPEndPoint& server_address() const { return server_address_; } 151 const IPEndPoint& server_address() const { return server_address_; }
192 152
193 const IPEndPoint& client_address() const { return client_address_; } 153 const IPEndPoint& client_address() const { return client_address_; }
194 154
195 int fd() { return fd_; } 155 int fd() { return fd_; }
196 156
197 const QuicServerId& server_id() const { return server_id_; }
198
199 // This should only be set before the initial Connect()
200 void set_server_id(const QuicServerId& server_id) {
201 server_id_ = server_id;
202 }
203
204 void SetUserAgentID(const std::string& user_agent_id) {
205 crypto_config_.set_user_agent_id(user_agent_id);
206 }
207
208 // SetProofVerifier sets the ProofVerifier that will be used to verify the
209 // server's certificate and takes ownership of |verifier|.
210 void SetProofVerifier(ProofVerifier* verifier) {
211 // TODO(rtenneti): We should set ProofVerifier in QuicClientSession.
212 crypto_config_.SetProofVerifier(verifier);
213 }
214
215 // SetChannelIDSource sets a ChannelIDSource that will be called, when the
216 // server supports channel IDs, to obtain a channel ID for signing a message
217 // proving possession of the channel ID. This object takes ownership of
218 // |source|.
219 void SetChannelIDSource(ChannelIDSource* source) {
220 crypto_config_.SetChannelIDSource(source);
221 }
222
223 void SetSupportedVersions(const QuicVersionVector& versions) {
224 supported_versions_ = versions;
225 }
226
227 // Takes ownership of the listener. 157 // Takes ownership of the listener.
228 void set_response_listener(ResponseListener* listener) { 158 void set_response_listener(ResponseListener* listener) {
229 response_listener_.reset(listener); 159 response_listener_.reset(listener);
230 } 160 }
231 161
232 QuicConfig* config() { return &config_; }
233
234 void set_store_response(bool val) { store_response_ = val; } 162 void set_store_response(bool val) { store_response_ = val; }
235 163
236 size_t latest_response_code() const; 164 size_t latest_response_code() const;
237 const std::string& latest_response_headers() const; 165 const std::string& latest_response_headers() const;
238 const std::string& latest_response_body() const; 166 const std::string& latest_response_body() const;
239 167
240 // Change the initial maximum packet size of the connection. Has to be called
241 // before Connect()/StartConnect() in order to have any effect.
242 void set_initial_max_packet_length(QuicByteCount initial_max_packet_length) {
243 initial_max_packet_length_ = initial_max_packet_length;
244 }
245
246 int num_stateless_rejects_received() const {
247 return num_stateless_rejects_received_;
248 }
249
250 // The number of client hellos sent, taking stateless rejects into
251 // account. In the case of a stateless reject, the initial
252 // connection object may be torn down and a new one created. The
253 // user cannot rely upon the latest connection object to get the
254 // total number of client hellos sent, and should use this function
255 // instead.
256 int GetNumSentClientHellos();
257
258 // Returns any errors that occurred at the connection-level (as
259 // opposed to the session-level). When a stateless reject occurs,
260 // the error of the last session may not reflect the overall state
261 // of the connection.
262 QuicErrorCode connection_error() const;
263
264 protected: 168 protected:
265 // Generates the next ConnectionId for |server_id_|. By default, if the
266 // cached server config contains a server-designated ID, that ID will be
267 // returned. Otherwise, the next random ID will be returned.
268 QuicConnectionId GetNextConnectionId();
269
270 // Returns the next server-designated ConnectionId from the cached config for
271 // |server_id_|, if it exists. Otherwise, returns 0.
272 QuicConnectionId GetNextServerDesignatedConnectionId();
273
274 // Generates a new, random connection ID (as opposed to a server-designated
275 // connection ID).
276 virtual QuicConnectionId GenerateNewConnectionId();
277
278 virtual QuicEpollConnectionHelper* CreateQuicConnectionHelper(); 169 virtual QuicEpollConnectionHelper* CreateQuicConnectionHelper();
279 virtual QuicPacketWriter* CreateQuicPacketWriter(); 170 virtual QuicPacketWriter* CreateQuicPacketWriter();
280 171
281 virtual int ReadPacket(char* buffer, 172 virtual int ReadPacket(char* buffer,
282 int buffer_len, 173 int buffer_len,
283 IPEndPoint* server_address, 174 IPEndPoint* server_address,
284 IPAddressNumber* client_ip); 175 IPAddressNumber* client_ip);
285 176
286 virtual QuicClientSession* CreateQuicClientSession(
287 const QuicConfig& config,
288 QuicConnection* connection,
289 const QuicServerId& server_id,
290 QuicCryptoClientConfig* crypto_config);
291
292 EpollServer* epoll_server() { return epoll_server_; } 177 EpollServer* epoll_server() { return epoll_server_; }
293 178
294 // If the socket has been created, then unregister and close() the FD. 179 // If the socket has been created, then unregister and close() the FD.
295 virtual void CleanUpUDPSocket(); 180 virtual void CleanUpUDPSocket();
296 181
297 private: 182 private:
298 friend class net::tools::test::QuicClientPeer; 183 friend class net::tools::test::QuicClientPeer;
299 184
300 // Specific QuicClient class for storing data to resend. 185 // Specific QuicClient class for storing data to resend.
301 class ClientQuicDataToResend : public QuicDataToResend { 186 class ClientQuicDataToResend : public QuicDataToResend {
(...skipping 24 matching lines...) Expand all
326 211
327 // Actually clean up the socket. 212 // Actually clean up the socket.
328 void CleanUpUDPSocketImpl(); 213 void CleanUpUDPSocketImpl();
329 214
330 // Read a UDP packet and hand it to the framer. 215 // Read a UDP packet and hand it to the framer.
331 bool ReadAndProcessPacket(); 216 bool ReadAndProcessPacket();
332 217
333 // Address of the server. 218 // Address of the server.
334 const IPEndPoint server_address_; 219 const IPEndPoint server_address_;
335 220
336 // |server_id_| is a tuple (hostname, port, is_https) of the server.
337 QuicServerId server_id_;
338
339 // config_ and crypto_config_ contain configuration and cached state about
340 // servers.
341 QuicConfig config_;
342 QuicCryptoClientConfig crypto_config_;
343
344 // Address of the client if the client is connected to the server. 221 // Address of the client if the client is connected to the server.
345 IPEndPoint client_address_; 222 IPEndPoint client_address_;
346 223
347 // If initialized, the address to bind to. 224 // If initialized, the address to bind to.
348 IPAddressNumber bind_to_address_; 225 IPAddressNumber bind_to_address_;
349 // Local port to bind to. Initialize to 0. 226 // Local port to bind to. Initialize to 0.
350 int local_port_; 227 int local_port_;
351 228
352 // Writer used to actually send packets to the wire. Needs to outlive
353 // |session_|.
354 scoped_ptr<QuicPacketWriter> writer_;
355
356 // Session which manages streams.
357 scoped_ptr<QuicClientSession> session_;
358 // Listens for events on the client socket. 229 // Listens for events on the client socket.
359 EpollServer* epoll_server_; 230 EpollServer* epoll_server_;
360 // UDP socket. 231 // UDP socket.
361 int fd_; 232 int fd_;
362 233
363 // Helper to be used by created connections. 234 // Helper to be used by created connections.
364 scoped_ptr<QuicEpollConnectionHelper> helper_; 235 scoped_ptr<QuicEpollConnectionHelper> helper_;
365 236
366 // Listens for full responses. 237 // Listens for full responses.
367 scoped_ptr<ResponseListener> response_listener_; 238 scoped_ptr<ResponseListener> response_listener_;
368 239
369 // Tracks if the client is initialized to connect. 240 // Tracks if the client is initialized to connect.
370 bool initialized_; 241 bool initialized_;
371 242
372 // If overflow_supported_ is true, this will be the number of packets dropped 243 // If overflow_supported_ is true, this will be the number of packets dropped
373 // during the lifetime of the server. 244 // during the lifetime of the server.
374 QuicPacketCount packets_dropped_; 245 QuicPacketCount packets_dropped_;
375 246
376 // True if the kernel supports SO_RXQ_OVFL, the number of packets dropped 247 // True if the kernel supports SO_RXQ_OVFL, the number of packets dropped
377 // because the socket would otherwise overflow. 248 // because the socket would otherwise overflow.
378 bool overflow_supported_; 249 bool overflow_supported_;
379 250
380 // This vector contains QUIC versions which we currently support.
381 // This should be ordered such that the highest supported version is the first
382 // element, with subsequent elements in descending order (versions can be
383 // skipped as necessary). We will always pick supported_versions_[0] as the
384 // initial version to use.
385 QuicVersionVector supported_versions_;
386
387 // If true, store the latest response code, headers, and body. 251 // If true, store the latest response code, headers, and body.
388 bool store_response_; 252 bool store_response_;
389 // HTTP response code from most recent response. 253 // HTTP response code from most recent response.
390 size_t latest_response_code_; 254 size_t latest_response_code_;
391 // HTTP headers from most recent response. 255 // HTTP headers from most recent response.
392 std::string latest_response_headers_; 256 std::string latest_response_headers_;
393 // Body of most recent response. 257 // Body of most recent response.
394 std::string latest_response_body_; 258 std::string latest_response_body_;
395 259
396 // The initial value of maximum packet size of the connection. If set to
397 // zero, the default is used.
398 QuicByteCount initial_max_packet_length_;
399
400 // The number of stateless rejects received during the current/latest
401 // connection.
402 // TODO(jokulik): Consider some consistent naming scheme (or other) for member
403 // variables that are kept per-request, per-connection, and over the client's
404 // lifetime.
405 int num_stateless_rejects_received_;
406
407 // The number of hellos sent during the current/latest connection.
408 int num_sent_client_hellos_;
409
410 // Used to store any errors that occurred with the overall connection (as
411 // opposed to that associated with the last session object).
412 QuicErrorCode connection_error_;
413
414 // True when the client is attempting to connect or re-connect the session (in
415 // the case of a stateless reject). Set to false between a call to
416 // Disconnect() and the subsequent call to StartConnect(). When
417 // connected_or_attempting_connect_ is false, the session object corresponds
418 // to the previous client-level connection.
419 bool connected_or_attempting_connect_;
420
421 // Keeps track of any data sent before the handshake. 260 // Keeps track of any data sent before the handshake.
422 std::vector<QuicDataToResend*> data_sent_before_handshake_; 261 std::vector<QuicDataToResend*> data_sent_before_handshake_;
423 262
424 // Once the client receives a stateless reject, keeps track of any data that 263 // Once the client receives a stateless reject, keeps track of any data that
425 // must be resent upon a subsequent successful connection. 264 // must be resent upon a subsequent successful connection.
426 std::vector<QuicDataToResend*> data_to_resend_on_connect_; 265 std::vector<QuicDataToResend*> data_to_resend_on_connect_;
427 266
428 DISALLOW_COPY_AND_ASSIGN(QuicClient); 267 DISALLOW_COPY_AND_ASSIGN(QuicClient);
429 }; 268 };
430 269
431 } // namespace tools 270 } // namespace tools
432 } // namespace net 271 } // namespace net
433 272
434 #endif // NET_TOOLS_QUIC_QUIC_CLIENT_H_ 273 #endif // NET_TOOLS_QUIC_QUIC_CLIENT_H_
OLDNEW
« no previous file with comments | « net/net.gyp ('k') | net/tools/quic/quic_client.cc » ('j') | net/tools/quic/quic_client_base.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698