OLD | NEW |
1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2015 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 #include "net/tools/quic/quic_client_base.h" | 5 #include "net/tools/quic/quic_client_base.h" |
6 | 6 |
7 #include "net/quic/core/crypto/quic_random.h" | 7 #include "net/quic/core/crypto/quic_random.h" |
8 #include "net/quic/core/quic_flags.h" | 8 #include "net/quic/core/quic_flags.h" |
9 #include "net/quic/core/quic_server_id.h" | 9 #include "net/quic/core/quic_server_id.h" |
10 #include "net/quic/core/spdy_utils.h" | 10 #include "net/quic/core/spdy_utils.h" |
11 #include "net/quic/platform/api/quic_logging.h" | 11 #include "net/quic/platform/api/quic_logging.h" |
12 #include "net/quic/platform/api/quic_text_utils.h" | 12 #include "net/quic/platform/api/quic_text_utils.h" |
13 | 13 |
14 using base::StringPiece; | |
15 using base::StringToInt; | 14 using base::StringToInt; |
16 using std::string; | 15 using std::string; |
17 | 16 |
18 namespace net { | 17 namespace net { |
19 | 18 |
20 void QuicClientBase::ClientQuicDataToResend::Resend() { | 19 void QuicClientBase::ClientQuicDataToResend::Resend() { |
21 client_->SendRequest(*headers_, body_, fin_); | 20 client_->SendRequest(*headers_, body_, fin_); |
22 headers_ = nullptr; | 21 headers_ = nullptr; |
23 } | 22 } |
24 | 23 |
25 QuicClientBase::QuicDataToResend::QuicDataToResend( | 24 QuicClientBase::QuicDataToResend::QuicDataToResend( |
26 std::unique_ptr<SpdyHeaderBlock> headers, | 25 std::unique_ptr<SpdyHeaderBlock> headers, |
27 StringPiece body, | 26 QuicStringPiece body, |
28 bool fin) | 27 bool fin) |
29 : headers_(std::move(headers)), body_(body), fin_(fin) {} | 28 : headers_(std::move(headers)), body_(body), fin_(fin) {} |
30 | 29 |
31 QuicClientBase::QuicDataToResend::~QuicDataToResend() {} | 30 QuicClientBase::QuicDataToResend::~QuicDataToResend() {} |
32 | 31 |
33 QuicClientBase::QuicClientBase(const QuicServerId& server_id, | 32 QuicClientBase::QuicClientBase(const QuicServerId& server_id, |
34 const QuicVersionVector& supported_versions, | 33 const QuicVersionVector& supported_versions, |
35 const QuicConfig& config, | 34 const QuicConfig& config, |
36 QuicConnectionHelperInterface* helper, | 35 QuicConnectionHelperInterface* helper, |
37 QuicAlarmFactory* alarm_factory, | 36 QuicAlarmFactory* alarm_factory, |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
200 } | 199 } |
201 return session_.get(); | 200 return session_.get(); |
202 } | 201 } |
203 | 202 |
204 bool QuicClientBase::EncryptionBeingEstablished() { | 203 bool QuicClientBase::EncryptionBeingEstablished() { |
205 return !session_->IsEncryptionEstablished() && | 204 return !session_->IsEncryptionEstablished() && |
206 session_->connection()->connected(); | 205 session_->connection()->connected(); |
207 } | 206 } |
208 | 207 |
209 void QuicClientBase::SendRequest(const SpdyHeaderBlock& headers, | 208 void QuicClientBase::SendRequest(const SpdyHeaderBlock& headers, |
210 StringPiece body, | 209 QuicStringPiece body, |
211 bool fin) { | 210 bool fin) { |
212 QuicClientPushPromiseIndex::TryHandle* handle; | 211 QuicClientPushPromiseIndex::TryHandle* handle; |
213 QuicAsyncStatus rv = push_promise_index()->Try(headers, this, &handle); | 212 QuicAsyncStatus rv = push_promise_index()->Try(headers, this, &handle); |
214 if (rv == QUIC_SUCCESS) | 213 if (rv == QUIC_SUCCESS) |
215 return; | 214 return; |
216 | 215 |
217 if (rv == QUIC_PENDING) { | 216 if (rv == QUIC_PENDING) { |
218 // May need to retry request if asynchronous rendezvous fails. | 217 // May need to retry request if asynchronous rendezvous fails. |
219 AddPromiseDataToResend(headers, body, fin); | 218 AddPromiseDataToResend(headers, body, fin); |
220 return; | 219 return; |
221 } | 220 } |
222 | 221 |
223 QuicSpdyClientStream* stream = CreateClientStream(); | 222 QuicSpdyClientStream* stream = CreateClientStream(); |
224 if (stream == nullptr) { | 223 if (stream == nullptr) { |
225 QUIC_BUG << "stream creation failed!"; | 224 QUIC_BUG << "stream creation failed!"; |
226 return; | 225 return; |
227 } | 226 } |
228 stream->SendRequest(headers.Clone(), body, fin); | 227 stream->SendRequest(headers.Clone(), body, fin); |
229 // Record this in case we need to resend. | 228 // Record this in case we need to resend. |
230 MaybeAddDataToResend(headers, body, fin); | 229 MaybeAddDataToResend(headers, body, fin); |
231 } | 230 } |
232 | 231 |
233 void QuicClientBase::SendRequestAndWaitForResponse( | 232 void QuicClientBase::SendRequestAndWaitForResponse( |
234 const SpdyHeaderBlock& headers, | 233 const SpdyHeaderBlock& headers, |
235 StringPiece body, | 234 QuicStringPiece body, |
236 bool fin) { | 235 bool fin) { |
237 SendRequest(headers, body, fin); | 236 SendRequest(headers, body, fin); |
238 while (WaitForEvents()) { | 237 while (WaitForEvents()) { |
239 } | 238 } |
240 } | 239 } |
241 | 240 |
242 void QuicClientBase::SendRequestsAndWaitForResponse( | 241 void QuicClientBase::SendRequestsAndWaitForResponse( |
243 const std::vector<string>& url_list) { | 242 const std::vector<string>& url_list) { |
244 for (size_t i = 0; i < url_list.size(); ++i) { | 243 for (size_t i = 0; i < url_list.size(); ++i) { |
245 SpdyHeaderBlock headers; | 244 SpdyHeaderBlock headers; |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
388 return cached->has_server_designated_connection_id() | 387 return cached->has_server_designated_connection_id() |
389 ? cached->GetNextServerDesignatedConnectionId() | 388 ? cached->GetNextServerDesignatedConnectionId() |
390 : 0; | 389 : 0; |
391 } | 390 } |
392 | 391 |
393 QuicConnectionId QuicClientBase::GenerateNewConnectionId() { | 392 QuicConnectionId QuicClientBase::GenerateNewConnectionId() { |
394 return QuicRandom::GetInstance()->RandUint64(); | 393 return QuicRandom::GetInstance()->RandUint64(); |
395 } | 394 } |
396 | 395 |
397 void QuicClientBase::MaybeAddDataToResend(const SpdyHeaderBlock& headers, | 396 void QuicClientBase::MaybeAddDataToResend(const SpdyHeaderBlock& headers, |
398 StringPiece body, | 397 QuicStringPiece body, |
399 bool fin) { | 398 bool fin) { |
400 if (!FLAGS_quic_reloadable_flag_enable_quic_stateless_reject_support) { | 399 if (!FLAGS_quic_reloadable_flag_enable_quic_stateless_reject_support) { |
401 return; | 400 return; |
402 } | 401 } |
403 | 402 |
404 if (session()->IsCryptoHandshakeConfirmed()) { | 403 if (session()->IsCryptoHandshakeConfirmed()) { |
405 // The handshake is confirmed. No need to continue saving requests to | 404 // The handshake is confirmed. No need to continue saving requests to |
406 // resend. | 405 // resend. |
407 data_to_resend_on_connect_.clear(); | 406 data_to_resend_on_connect_.clear(); |
408 return; | 407 return; |
(...skipping 21 matching lines...) Expand all Loading... |
430 // Calling Resend will re-enqueue the data, so swap out | 429 // Calling Resend will re-enqueue the data, so swap out |
431 // data_to_resend_on_connect_ before iterating. | 430 // data_to_resend_on_connect_ before iterating. |
432 std::vector<std::unique_ptr<QuicDataToResend>> old_data; | 431 std::vector<std::unique_ptr<QuicDataToResend>> old_data; |
433 old_data.swap(data_to_resend_on_connect_); | 432 old_data.swap(data_to_resend_on_connect_); |
434 for (const auto& data : old_data) { | 433 for (const auto& data : old_data) { |
435 data->Resend(); | 434 data->Resend(); |
436 } | 435 } |
437 } | 436 } |
438 | 437 |
439 void QuicClientBase::AddPromiseDataToResend(const SpdyHeaderBlock& headers, | 438 void QuicClientBase::AddPromiseDataToResend(const SpdyHeaderBlock& headers, |
440 StringPiece body, | 439 QuicStringPiece body, |
441 bool fin) { | 440 bool fin) { |
442 std::unique_ptr<SpdyHeaderBlock> new_headers( | 441 std::unique_ptr<SpdyHeaderBlock> new_headers( |
443 new SpdyHeaderBlock(headers.Clone())); | 442 new SpdyHeaderBlock(headers.Clone())); |
444 push_promise_data_to_resend_.reset( | 443 push_promise_data_to_resend_.reset( |
445 new ClientQuicDataToResend(std::move(new_headers), body, fin, this)); | 444 new ClientQuicDataToResend(std::move(new_headers), body, fin, this)); |
446 } | 445 } |
447 | 446 |
448 bool QuicClientBase::CheckVary(const SpdyHeaderBlock& client_request, | 447 bool QuicClientBase::CheckVary(const SpdyHeaderBlock& client_request, |
449 const SpdyHeaderBlock& promise_request, | 448 const SpdyHeaderBlock& promise_request, |
450 const SpdyHeaderBlock& promise_response) { | 449 const SpdyHeaderBlock& promise_response) { |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
486 QUIC_BUG_IF(!store_response_) << "Response not stored!"; | 485 QUIC_BUG_IF(!store_response_) << "Response not stored!"; |
487 return latest_response_body_; | 486 return latest_response_body_; |
488 } | 487 } |
489 | 488 |
490 const string& QuicClientBase::latest_response_trailers() const { | 489 const string& QuicClientBase::latest_response_trailers() const { |
491 QUIC_BUG_IF(!store_response_) << "Response not stored!"; | 490 QUIC_BUG_IF(!store_response_) << "Response not stored!"; |
492 return latest_response_trailers_; | 491 return latest_response_trailers_; |
493 } | 492 } |
494 | 493 |
495 } // namespace net | 494 } // namespace net |
OLD | NEW |