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

Side by Side Diff: net/quic/chromium/quic_chromium_client_session.cc

Issue 2334943002: Add a new QuicChromiumClientSession::Handle class (Closed)
Patch Set: cleanup Created 3 years, 7 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 #include "net/quic/chromium/quic_chromium_client_session.h" 5 #include "net/quic/chromium/quic_chromium_client_session.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/callback_helpers.h" 9 #include "base/callback_helpers.h"
10 #include "base/location.h" 10 #include "base/location.h"
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
179 179
180 const GURL& GetURL() const override { return request_url_; } 180 const GURL& GetURL() const override { return request_url_; }
181 181
182 private: 182 private:
183 base::WeakPtr<QuicChromiumClientSession> session_; 183 base::WeakPtr<QuicChromiumClientSession> session_;
184 const GURL request_url_; 184 const GURL request_url_;
185 }; 185 };
186 186
187 } // namespace 187 } // namespace
188 188
189 QuicChromiumClientSession::Handle::Handle(
190 const base::WeakPtr<QuicChromiumClientSession>& session)
191 : MultiplexedSessionHandle(session),
192 session_(session),
193 net_log_(session_->net_log()),
194 was_handshake_confirmed_(session->IsCryptoHandshakeConfirmed()),
195 error_(OK),
196 port_migration_detected_(false),
197 server_id_(session_->server_id()),
198 quic_version_(session->connection()->version()) {
199 DCHECK(session_);
200 session_->AddHandle(this);
201 }
202
203 QuicChromiumClientSession::Handle::Handle(const Handle& other)
204 : MultiplexedSessionHandle(other),
205 session_(other.session_),
206 net_log_(other.net_log_),
207 was_handshake_confirmed_(other.was_handshake_confirmed_),
208 error_(other.error_),
209 port_migration_detected_(other.port_migration_detected_),
210 server_id_(other.server_id_),
211 quic_version_(other.quic_version_) {
212 if (session_)
213 session_->AddHandle(this);
214 }
215
216 QuicChromiumClientSession::Handle::~Handle() {
217 if (session_)
218 session_->RemoveHandle(this);
219 }
220
221 void QuicChromiumClientSession::Handle::OnCryptoHandshakeConfirmed() {
222 was_handshake_confirmed_ = true;
223 }
224
225 void QuicChromiumClientSession::Handle::OnSessionClosed(
226 int error,
227 bool port_migration_detected) {
228 port_migration_detected_ = port_migration_detected;
229 error_ = error;
230 quic_version_ = session_->connection()->version();
231 connect_timing_ = session_->GetConnectTiming();
232 session_ = nullptr;
233 }
234
235 bool QuicChromiumClientSession::Handle::IsConnected() const {
236 return session_ != nullptr;
237 }
238
239 bool QuicChromiumClientSession::Handle::IsCryptoHandshakeConfirmed() const {
240 return was_handshake_confirmed_;
241 }
242
243 const LoadTimingInfo::ConnectTiming&
244 QuicChromiumClientSession::Handle::GetConnectTiming() {
245 if (!session_)
246 return connect_timing_;
247
248 return session_->GetConnectTiming();
249 }
250
251 Error QuicChromiumClientSession::Handle::GetTokenBindingSignature(
252 crypto::ECPrivateKey* key,
253 TokenBindingType tb_type,
254 std::vector<uint8_t>* out) {
255 if (!session_)
256 return ERR_CONNECTION_CLOSED;
257
258 return session_->GetTokenBindingSignature(key, tb_type, out);
259 }
260
261 void QuicChromiumClientSession::Handle::PopulateNetErrorDetails(
262 NetErrorDetails* details) const {
263 if (session_) {
264 session_->PopulateNetErrorDetails(details);
265 } else {
266 details->quic_port_migration_detected = port_migration_detected_;
267 }
268 }
269
270 QuicVersion QuicChromiumClientSession::Handle::GetQuicVersion() const {
271 if (!session_)
272 return quic_version_;
273
274 return session_->connection()->version();
275 }
276
277 void QuicChromiumClientSession::Handle::ResetPromised(
278 QuicStreamId id,
279 QuicRstStreamErrorCode error_code) {
280 if (session_)
281 session_->ResetPromised(id, error_code);
282 }
283
284 std::unique_ptr<QuicConnection::ScopedPacketBundler>
285 QuicChromiumClientSession::Handle::CreatePacketBundler(
286 QuicConnection::AckBundling bundling_mode) {
287 if (!session_)
288 return nullptr;
289
290 return base::MakeUnique<QuicConnection::ScopedPacketBundler>(
291 session_->connection(), bundling_mode);
292 }
293
294 bool QuicChromiumClientSession::Handle::SharesSameSession(
295 const Handle& other) const {
296 return session_.get() == other.session_.get();
297 }
298
299 std::unique_ptr<QuicChromiumClientSession::StreamRequest>
300 QuicChromiumClientSession::Handle::CreateStreamRequest(
301 bool requires_confirmation) const {
302 // base::MakeUnique does not work because the StreamRequest constructor
303 // is private.
304 return std::unique_ptr<StreamRequest>(
305 new StreamRequest(*this, requires_confirmation));
306 }
307
308 int QuicChromiumClientSession::Handle::WaitForHandshakeConfirmation(
309 const CompletionCallback& callback) {
310 if (!session_)
311 return ERR_CONNECTION_CLOSED;
312
313 return session_->WaitForHandshakeConfirmation(callback);
314 }
315
316 void QuicChromiumClientSession::Handle::CancelRequest(StreamRequest* request) {
317 if (session_)
318 session_->CancelRequest(request);
319 }
320
321 int QuicChromiumClientSession::Handle::TryCreateStream(StreamRequest* request) {
322 if (!session_)
323 return ERR_CONNECTION_CLOSED;
324
325 return session_->TryCreateStream(request);
326 }
327
328 QuicClientPushPromiseIndex*
329 QuicChromiumClientSession::Handle::GetPushPromiseIndex() {
330 if (!session_)
331 return push_promise_index_;
332
333 return session_->push_promise_index();
334 }
335
336 int QuicChromiumClientSession::Handle::GetPeerAddress(
337 IPEndPoint* address) const {
338 if (!session_)
339 return ERR_CONNECTION_CLOSED;
340
341 *address = session_->peer_address().impl().socket_address();
342 return OK;
343 }
344
189 QuicChromiumClientSession::StreamRequest::StreamRequest( 345 QuicChromiumClientSession::StreamRequest::StreamRequest(
190 const base::WeakPtr<QuicChromiumClientSession>& session, 346 QuicChromiumClientSession::Handle session,
191 bool requires_confirmation) 347 bool requires_confirmation)
192 : session_(session), 348 : session_(session),
193 requires_confirmation_(requires_confirmation), 349 requires_confirmation_(requires_confirmation),
194 stream_(nullptr), 350 stream_(nullptr),
195 next_state_(STATE_NONE),
196 weak_factory_(this) {} 351 weak_factory_(this) {}
197 352
198 QuicChromiumClientSession::StreamRequest::~StreamRequest() { 353 QuicChromiumClientSession::StreamRequest::~StreamRequest() {
199 if (stream_) 354 if (stream_)
200 stream_->Reset(QUIC_STREAM_CANCELLED); 355 stream_->Reset(QUIC_STREAM_CANCELLED);
201 356
202 if (session_) 357 if (session_.IsConnected())
203 session_->CancelRequest(this); 358 session_.CancelRequest(this);
204 } 359 }
205 360
206 int QuicChromiumClientSession::StreamRequest::StartRequest( 361 int QuicChromiumClientSession::StreamRequest::StartRequest(
207 const CompletionCallback& callback) { 362 const CompletionCallback& callback) {
208 DCHECK(session_); 363 if (!session_.IsConnected())
364 return ERR_CONNECTION_CLOSED;
209 365
210 next_state_ = STATE_WAIT_FOR_CONFIRMATION; 366 next_state_ = STATE_WAIT_FOR_CONFIRMATION;
211 int rv = DoLoop(OK); 367 int rv = DoLoop(OK);
212 if (rv == ERR_IO_PENDING) 368 if (rv == ERR_IO_PENDING)
213 callback_ = callback; 369 callback_ = callback;
214 370
215 return rv; 371 return rv;
216 } 372 }
217 373
218 QuicChromiumClientStream* 374 QuicChromiumClientStream*
219 QuicChromiumClientSession::StreamRequest::ReleaseStream() { 375 QuicChromiumClientSession::StreamRequest::ReleaseStream() {
220 DCHECK(stream_); 376 DCHECK(stream_);
221 QuicChromiumClientStream* stream = stream_; 377 QuicChromiumClientStream* stream = stream_;
222 stream_ = nullptr; 378 stream_ = nullptr;
223 return stream; 379 return stream;
224 } 380 }
225 381
226 void QuicChromiumClientSession::StreamRequest::OnRequestCompleteSuccess( 382 void QuicChromiumClientSession::StreamRequest::OnRequestCompleteSuccess(
227 QuicChromiumClientStream* stream) { 383 QuicChromiumClientStream* stream) {
228 DCHECK_EQ(STATE_REQUEST_STREAM_COMPLETE, next_state_); 384 DCHECK_EQ(STATE_REQUEST_STREAM_COMPLETE, next_state_);
229 session_.reset(); 385
230 stream_ = stream; 386 stream_ = stream;
231 // This method is called even when the request completes synchronously. 387 // This method is called even when the request completes synchronously.
232 if (callback_) 388 if (callback_)
233 DoCallback(OK); 389 DoCallback(OK);
234 } 390 }
235 391
236 void QuicChromiumClientSession::StreamRequest::OnRequestCompleteFailure( 392 void QuicChromiumClientSession::StreamRequest::OnRequestCompleteFailure(
237 int rv) { 393 int rv) {
238 DCHECK_EQ(STATE_REQUEST_STREAM_COMPLETE, next_state_); 394 DCHECK_EQ(STATE_REQUEST_STREAM_COMPLETE, next_state_);
239 session_.reset();
240 // This method is called even when the request completes synchronously. 395 // This method is called even when the request completes synchronously.
241 if (callback_) 396 if (callback_)
242 DoCallback(rv); 397 DoCallback(rv);
243 } 398 }
244 399
245 void QuicChromiumClientSession::StreamRequest::OnIOComplete(int rv) { 400 void QuicChromiumClientSession::StreamRequest::OnIOComplete(int rv) {
246 rv = DoLoop(rv); 401 rv = DoLoop(rv);
247 402
248 if (rv != ERR_IO_PENDING && !callback_.is_null()) { 403 if (rv != ERR_IO_PENDING && !callback_.is_null()) {
249 DoCallback(rv); 404 DoCallback(rv);
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
283 break; 438 break;
284 } 439 }
285 } while (next_state_ != STATE_NONE && next_state_ && rv != ERR_IO_PENDING); 440 } while (next_state_ != STATE_NONE && next_state_ && rv != ERR_IO_PENDING);
286 441
287 return rv; 442 return rv;
288 } 443 }
289 444
290 int QuicChromiumClientSession::StreamRequest::DoWaitForConfirmation() { 445 int QuicChromiumClientSession::StreamRequest::DoWaitForConfirmation() {
291 next_state_ = STATE_WAIT_FOR_CONFIRMATION_COMPLETE; 446 next_state_ = STATE_WAIT_FOR_CONFIRMATION_COMPLETE;
292 if (requires_confirmation_) { 447 if (requires_confirmation_) {
293 return session_->WaitForHandshakeConfirmation( 448 return session_.WaitForHandshakeConfirmation(
294 base::Bind(&QuicChromiumClientSession::StreamRequest::OnIOComplete, 449 base::Bind(&QuicChromiumClientSession::StreamRequest::OnIOComplete,
295 weak_factory_.GetWeakPtr())); 450 weak_factory_.GetWeakPtr()));
296 } 451 }
297 452
298 return OK; 453 return OK;
299 } 454 }
300 455
301 int QuicChromiumClientSession::StreamRequest::DoWaitForConfirmationComplete( 456 int QuicChromiumClientSession::StreamRequest::DoWaitForConfirmationComplete(
302 int rv) { 457 int rv) {
303 DCHECK_NE(ERR_IO_PENDING, rv); 458 DCHECK_NE(ERR_IO_PENDING, rv);
304 if (rv < 0) 459 if (rv < 0)
305 return rv; 460 return rv;
306 461
307 next_state_ = STATE_REQUEST_STREAM; 462 next_state_ = STATE_REQUEST_STREAM;
308 return OK; 463 return OK;
309 } 464 }
310 465
311 int QuicChromiumClientSession::StreamRequest::DoRequestStream() { 466 int QuicChromiumClientSession::StreamRequest::DoRequestStream() {
312 next_state_ = STATE_REQUEST_STREAM_COMPLETE; 467 next_state_ = STATE_REQUEST_STREAM_COMPLETE;
313 468
314 return session_->TryCreateStream(this); 469 return session_.TryCreateStream(this);
315 } 470 }
316 471
317 int QuicChromiumClientSession::StreamRequest::DoRequestStreamComplete(int rv) { 472 int QuicChromiumClientSession::StreamRequest::DoRequestStreamComplete(int rv) {
318 DCHECK(rv == OK || !stream_); 473 DCHECK(rv == OK || !stream_);
319 session_.reset();
320 474
321 return rv; 475 return rv;
322 } 476 }
323 477
324 QuicChromiumClientSession::QuicChromiumClientSession( 478 QuicChromiumClientSession::QuicChromiumClientSession(
325 QuicConnection* connection, 479 QuicConnection* connection,
326 std::unique_ptr<DatagramClientSocket> socket, 480 std::unique_ptr<DatagramClientSocket> socket,
327 QuicStreamFactory* stream_factory, 481 QuicStreamFactory* stream_factory,
328 QuicCryptoClientStreamFactory* crypto_client_stream_factory, 482 QuicCryptoClientStreamFactory* crypto_client_stream_factory,
329 QuicClock* clock, 483 QuicClock* clock,
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
370 weak_factory_(this) { 524 weak_factory_(this) {
371 sockets_.push_back(std::move(socket)); 525 sockets_.push_back(std::move(socket));
372 packet_readers_.push_back(base::MakeUnique<QuicChromiumPacketReader>( 526 packet_readers_.push_back(base::MakeUnique<QuicChromiumPacketReader>(
373 sockets_.back().get(), clock, this, yield_after_packets, 527 sockets_.back().get(), clock, this, yield_after_packets,
374 yield_after_duration, net_log_)); 528 yield_after_duration, net_log_));
375 crypto_stream_.reset( 529 crypto_stream_.reset(
376 crypto_client_stream_factory->CreateQuicCryptoClientStream( 530 crypto_client_stream_factory->CreateQuicCryptoClientStream(
377 server_id, this, base::MakeUnique<ProofVerifyContextChromium>( 531 server_id, this, base::MakeUnique<ProofVerifyContextChromium>(
378 cert_verify_flags, net_log_), 532 cert_verify_flags, net_log_),
379 crypto_config)); 533 crypto_config));
534 self_handle_ = base::MakeUnique<Handle>(weak_factory_.GetWeakPtr());
380 connection->set_debug_visitor(logger_.get()); 535 connection->set_debug_visitor(logger_.get());
381 connection->set_creator_debug_delegate(logger_.get()); 536 connection->set_creator_debug_delegate(logger_.get());
382 net_log_.BeginEvent(NetLogEventType::QUIC_SESSION, 537 net_log_.BeginEvent(NetLogEventType::QUIC_SESSION,
383 base::Bind(NetLogQuicClientSessionCallback, &server_id, 538 base::Bind(NetLogQuicClientSessionCallback, &server_id,
384 cert_verify_flags, require_confirmation_)); 539 cert_verify_flags, require_confirmation_));
385 IPEndPoint address; 540 IPEndPoint address;
386 if (socket && socket->GetLocalAddress(&address) == OK && 541 if (socket && socket->GetLocalAddress(&address) == OK &&
387 address.GetFamily() == ADDRESS_FAMILY_IPV6) { 542 address.GetFamily() == ADDRESS_FAMILY_IPV6) {
388 connection->SetMaxPacketLength(connection->max_packet_length() - 543 connection->SetMaxPacketLength(connection->max_packet_length() -
389 kAdditionalOverheadForIPv6); 544 kAdditionalOverheadForIPv6);
390 } 545 }
391 connect_timing_.dns_start = dns_resolution_start_time; 546 connect_timing_.dns_start = dns_resolution_start_time;
392 connect_timing_.dns_end = dns_resolution_end_time; 547 connect_timing_.dns_end = dns_resolution_end_time;
393 } 548 }
394 549
395 QuicChromiumClientSession::~QuicChromiumClientSession() { 550 QuicChromiumClientSession::~QuicChromiumClientSession() {
396 DCHECK(callback_.is_null()); 551 DCHECK(callback_.is_null());
397 552
398 net_log_.EndEvent(NetLogEventType::QUIC_SESSION); 553 net_log_.EndEvent(NetLogEventType::QUIC_SESSION);
399 DCHECK(waiting_for_confirmation_callbacks_.empty()); 554 DCHECK(waiting_for_confirmation_callbacks_.empty());
400 if (!dynamic_streams().empty()) 555 if (!dynamic_streams().empty())
401 RecordUnexpectedOpenStreams(DESTRUCTOR); 556 RecordUnexpectedOpenStreams(DESTRUCTOR);
402 if (!observers_.empty()) 557 if (!handles_.empty())
403 RecordUnexpectedObservers(DESTRUCTOR); 558 RecordUnexpectedObservers(DESTRUCTOR);
404 if (!going_away_) 559 if (!going_away_)
405 RecordUnexpectedNotGoingAway(DESTRUCTOR); 560 RecordUnexpectedNotGoingAway(DESTRUCTOR);
406 561
407 while (!dynamic_streams().empty() || !observers_.empty() || 562 while (!dynamic_streams().empty() || !handles_.empty() ||
408 !stream_requests_.empty()) { 563 !stream_requests_.empty()) {
409 // The session must be closed before it is destroyed. 564 // The session must be closed before it is destroyed.
410 DCHECK(dynamic_streams().empty()); 565 DCHECK(dynamic_streams().empty());
411 CloseAllStreams(ERR_UNEXPECTED); 566 CloseAllStreams(ERR_UNEXPECTED);
412 DCHECK(observers_.empty()); 567 DCHECK(handles_.empty());
413 CloseAllObservers(ERR_UNEXPECTED); 568 CloseAllHandles(ERR_UNEXPECTED);
414 CancelAllRequests(ERR_UNEXPECTED); 569 CancelAllRequests(ERR_UNEXPECTED);
415 570
416 connection()->set_debug_visitor(nullptr); 571 connection()->set_debug_visitor(nullptr);
417 } 572 }
418 573
419 if (connection()->connected()) { 574 if (connection()->connected()) {
420 // Ensure that the connection is closed by the time the session is 575 // Ensure that the connection is closed by the time the session is
421 // destroyed. 576 // destroyed.
422 connection()->CloseConnection(QUIC_INTERNAL_ERROR, "session torn down", 577 connection()->CloseConnection(QUIC_INTERNAL_ERROR, "session torn down",
423 ConnectionCloseBehavior::SILENT_CLOSE); 578 ConnectionCloseBehavior::SILENT_CLOSE);
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
521 void QuicChromiumClientSession::OnStreamFrame(const QuicStreamFrame& frame) { 676 void QuicChromiumClientSession::OnStreamFrame(const QuicStreamFrame& frame) {
522 // Record total number of stream frames. 677 // Record total number of stream frames.
523 UMA_HISTOGRAM_COUNTS("Net.QuicNumStreamFramesInPacket", 1); 678 UMA_HISTOGRAM_COUNTS("Net.QuicNumStreamFramesInPacket", 1);
524 679
525 // Record number of frames per stream in packet. 680 // Record number of frames per stream in packet.
526 UMA_HISTOGRAM_COUNTS("Net.QuicNumStreamFramesPerStreamInPacket", 1); 681 UMA_HISTOGRAM_COUNTS("Net.QuicNumStreamFramesPerStreamInPacket", 1);
527 682
528 return QuicSpdySession::OnStreamFrame(frame); 683 return QuicSpdySession::OnStreamFrame(frame);
529 } 684 }
530 685
531 void QuicChromiumClientSession::AddObserver(Observer* observer) { 686 void QuicChromiumClientSession::AddHandle(Handle* handle) {
532 if (going_away_) { 687 if (going_away_) {
533 RecordUnexpectedObservers(ADD_OBSERVER); 688 RecordUnexpectedObservers(ADD_OBSERVER);
534 observer->OnSessionClosed(ERR_UNEXPECTED, port_migration_detected_); 689 handle->OnSessionClosed(ERR_UNEXPECTED, port_migration_detected_);
535 return; 690 return;
536 } 691 }
537 692
538 DCHECK(!base::ContainsKey(observers_, observer)); 693 DCHECK(!base::ContainsKey(handles_, handle));
539 observers_.insert(observer); 694 handles_.insert(handle);
540 } 695 }
541 696
542 void QuicChromiumClientSession::RemoveObserver(Observer* observer) { 697 void QuicChromiumClientSession::RemoveHandle(Handle* handle) {
543 DCHECK(base::ContainsKey(observers_, observer)); 698 DCHECK(base::ContainsKey(handles_, handle));
544 observers_.erase(observer); 699 handles_.erase(handle);
545 }
546
547 std::unique_ptr<QuicChromiumClientSession::StreamRequest>
548 QuicChromiumClientSession::CreateStreamRequest(bool requires_confirmation) {
549 // base::MakeUnique does not work because the StreamRequest constructor
550 // is private.
551 return std::unique_ptr<StreamRequest>(
552 new StreamRequest(weak_factory_.GetWeakPtr(), requires_confirmation));
553 } 700 }
554 701
555 int QuicChromiumClientSession::WaitForHandshakeConfirmation( 702 int QuicChromiumClientSession::WaitForHandshakeConfirmation(
556 const CompletionCallback& callback) { 703 const CompletionCallback& callback) {
557 if (!connection()->connected()) 704 if (!connection()->connected())
558 return ERR_CONNECTION_CLOSED; 705 return ERR_CONNECTION_CLOSED;
559 706
560 if (IsCryptoHandshakeConfirmed()) 707 if (IsCryptoHandshakeConfirmed())
561 return OK; 708 return OK;
562 709
(...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after
953 "Net.QuicSession.HandshakeConfirmedTime", 1100 "Net.QuicSession.HandshakeConfirmedTime",
954 connect_timing_.connect_end - connect_timing_.connect_start); 1101 connect_timing_.connect_end - connect_timing_.connect_start);
955 // Track how long it has taken to finish handshake after we have finished 1102 // Track how long it has taken to finish handshake after we have finished
956 // DNS host resolution. 1103 // DNS host resolution.
957 if (!connect_timing_.dns_end.is_null()) { 1104 if (!connect_timing_.dns_end.is_null()) {
958 UMA_HISTOGRAM_TIMES( 1105 UMA_HISTOGRAM_TIMES(
959 "Net.QuicSession.HostResolution.HandshakeConfirmedTime", 1106 "Net.QuicSession.HostResolution.HandshakeConfirmedTime",
960 base::TimeTicks::Now() - connect_timing_.dns_end); 1107 base::TimeTicks::Now() - connect_timing_.dns_end);
961 } 1108 }
962 1109
963 ObserverSet::iterator it = observers_.begin(); 1110 HandleSet::iterator it = handles_.begin();
964 while (it != observers_.end()) { 1111 while (it != handles_.end()) {
965 Observer* observer = *it; 1112 Handle* handle = *it;
966 ++it; 1113 ++it;
967 observer->OnCryptoHandshakeConfirmed(); 1114 handle->OnCryptoHandshakeConfirmed();
968 } 1115 }
969 1116
970 NotifyRequestsOfConfirmation(OK); 1117 NotifyRequestsOfConfirmation(OK);
971 } 1118 }
972 QuicSpdySession::OnCryptoHandshakeEvent(event); 1119 QuicSpdySession::OnCryptoHandshakeEvent(event);
973 } 1120 }
974 1121
975 void QuicChromiumClientSession::OnCryptoHandshakeMessageSent( 1122 void QuicChromiumClientSession::OnCryptoHandshakeMessageSent(
976 const CryptoHandshakeMessage& message) { 1123 const CryptoHandshakeMessage& message) {
977 logger_->OnCryptoHandshakeMessageSent(message); 1124 logger_->OnCryptoHandshakeMessageSent(message);
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
1101 1248
1102 if (!callback_.is_null()) { 1249 if (!callback_.is_null()) {
1103 base::ResetAndReturn(&callback_).Run(ERR_QUIC_PROTOCOL_ERROR); 1250 base::ResetAndReturn(&callback_).Run(ERR_QUIC_PROTOCOL_ERROR);
1104 } 1251 }
1105 1252
1106 for (auto& socket : sockets_) { 1253 for (auto& socket : sockets_) {
1107 socket->Close(); 1254 socket->Close();
1108 } 1255 }
1109 DCHECK(dynamic_streams().empty()); 1256 DCHECK(dynamic_streams().empty());
1110 CloseAllStreams(ERR_UNEXPECTED); 1257 CloseAllStreams(ERR_UNEXPECTED);
1111 CloseAllObservers(ERR_UNEXPECTED); 1258 CloseAllHandles(ERR_UNEXPECTED);
1112 CancelAllRequests(ERR_CONNECTION_CLOSED); 1259 CancelAllRequests(ERR_CONNECTION_CLOSED);
1113 NotifyRequestsOfConfirmation(ERR_CONNECTION_CLOSED); 1260 NotifyRequestsOfConfirmation(ERR_CONNECTION_CLOSED);
1114 NotifyFactoryOfSessionClosedLater(); 1261 NotifyFactoryOfSessionClosedLater();
1115 } 1262 }
1116 1263
1117 void QuicChromiumClientSession::OnSuccessfulVersionNegotiation( 1264 void QuicChromiumClientSession::OnSuccessfulVersionNegotiation(
1118 const QuicVersion& version) { 1265 const QuicVersion& version) {
1119 logger_->OnSuccessfulVersionNegotiation(version); 1266 logger_->OnSuccessfulVersionNegotiation(version);
1120 QuicSpdySession::OnSuccessfulVersionNegotiation(version); 1267 QuicSpdySession::OnSuccessfulVersionNegotiation(version);
1121
1122 ObserverSet::iterator it = observers_.begin();
1123 while (it != observers_.end()) {
1124 Observer* observer = *it;
1125 ++it;
1126 observer->OnSuccessfulVersionNegotiation(version);
1127 }
1128 } 1268 }
1129 1269
1130 int QuicChromiumClientSession::HandleWriteError( 1270 int QuicChromiumClientSession::HandleWriteError(
1131 int error_code, 1271 int error_code,
1132 scoped_refptr<StringIOBuffer> packet) { 1272 scoped_refptr<StringIOBuffer> packet) {
1133 if (stream_factory_ == nullptr || 1273 if (stream_factory_ == nullptr ||
1134 !stream_factory_->migrate_sessions_on_network_change()) { 1274 !stream_factory_->migrate_sessions_on_network_change()) {
1135 return error_code; 1275 return error_code;
1136 } 1276 }
1137 DCHECK(packet != nullptr); 1277 DCHECK(packet != nullptr);
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
1323 1463
1324 void QuicChromiumClientSession::CloseSessionOnError(int net_error, 1464 void QuicChromiumClientSession::CloseSessionOnError(int net_error,
1325 QuicErrorCode quic_error) { 1465 QuicErrorCode quic_error) {
1326 UMA_HISTOGRAM_SPARSE_SLOWLY("Net.QuicSession.CloseSessionOnError", 1466 UMA_HISTOGRAM_SPARSE_SLOWLY("Net.QuicSession.CloseSessionOnError",
1327 -net_error); 1467 -net_error);
1328 1468
1329 if (!callback_.is_null()) { 1469 if (!callback_.is_null()) {
1330 base::ResetAndReturn(&callback_).Run(net_error); 1470 base::ResetAndReturn(&callback_).Run(net_error);
1331 } 1471 }
1332 CloseAllStreams(net_error); 1472 CloseAllStreams(net_error);
1333 CloseAllObservers(net_error); 1473 CloseAllHandles(net_error);
1334 net_log_.AddEvent(NetLogEventType::QUIC_SESSION_CLOSE_ON_ERROR, 1474 net_log_.AddEvent(NetLogEventType::QUIC_SESSION_CLOSE_ON_ERROR,
1335 NetLog::IntCallback("net_error", net_error)); 1475 NetLog::IntCallback("net_error", net_error));
1336 1476
1337 if (connection()->connected()) 1477 if (connection()->connected())
1338 connection()->CloseConnection(quic_error, "net error", 1478 connection()->CloseConnection(quic_error, "net error",
1339 ConnectionCloseBehavior::SILENT_CLOSE); 1479 ConnectionCloseBehavior::SILENT_CLOSE);
1340 DCHECK(!connection()->connected()); 1480 DCHECK(!connection()->connected());
1341 1481
1342 NotifyFactoryOfSessionClosed(); 1482 NotifyFactoryOfSessionClosed();
1343 } 1483 }
1344 1484
1345 void QuicChromiumClientSession::CloseAllStreams(int net_error) { 1485 void QuicChromiumClientSession::CloseAllStreams(int net_error) {
1346 while (!dynamic_streams().empty()) { 1486 while (!dynamic_streams().empty()) {
1347 QuicStream* stream = dynamic_streams().begin()->second.get(); 1487 QuicStream* stream = dynamic_streams().begin()->second.get();
1348 QuicStreamId id = stream->id(); 1488 QuicStreamId id = stream->id();
1349 static_cast<QuicChromiumClientStream*>(stream)->OnError(net_error); 1489 static_cast<QuicChromiumClientStream*>(stream)->OnError(net_error);
1350 CloseStream(id); 1490 CloseStream(id);
1351 } 1491 }
1352 } 1492 }
1353 1493
1354 void QuicChromiumClientSession::CloseAllObservers(int net_error) { 1494 void QuicChromiumClientSession::CloseAllHandles(int net_error) {
1355 while (!observers_.empty()) { 1495 while (!handles_.empty()) {
1356 Observer* observer = *observers_.begin(); 1496 Handle* handle = *handles_.begin();
1357 observers_.erase(observer); 1497 handles_.erase(handle);
1358 observer->OnSessionClosed(net_error, port_migration_detected_); 1498 handle->OnSessionClosed(net_error, port_migration_detected_);
1359 } 1499 }
1360 } 1500 }
1361 1501
1362 void QuicChromiumClientSession::CancelAllRequests(int net_error) { 1502 void QuicChromiumClientSession::CancelAllRequests(int net_error) {
1363 UMA_HISTOGRAM_COUNTS_1000("Net.QuicSession.AbortedPendingStreamRequests", 1503 UMA_HISTOGRAM_COUNTS_1000("Net.QuicSession.AbortedPendingStreamRequests",
1364 stream_requests_.size()); 1504 stream_requests_.size());
1365 1505
1366 while (!stream_requests_.empty()) { 1506 while (!stream_requests_.empty()) {
1367 StreamRequest* request = stream_requests_.front(); 1507 StreamRequest* request = stream_requests_.front();
1368 stream_requests_.pop_front(); 1508 stream_requests_.pop_front();
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1403 std::unique_ptr<base::ListValue> alias_list(new base::ListValue()); 1543 std::unique_ptr<base::ListValue> alias_list(new base::ListValue());
1404 for (std::set<HostPortPair>::const_iterator it = aliases.begin(); 1544 for (std::set<HostPortPair>::const_iterator it = aliases.begin();
1405 it != aliases.end(); it++) { 1545 it != aliases.end(); it++) {
1406 alias_list->AppendString(it->ToString()); 1546 alias_list->AppendString(it->ToString());
1407 } 1547 }
1408 dict->Set("aliases", std::move(alias_list)); 1548 dict->Set("aliases", std::move(alias_list));
1409 1549
1410 return std::move(dict); 1550 return std::move(dict);
1411 } 1551 }
1412 1552
1413 base::WeakPtr<QuicChromiumClientSession> 1553 QuicChromiumClientSession::Handle QuicChromiumClientSession::GetHandle() {
1414 QuicChromiumClientSession::GetWeakPtr() { 1554 return *self_handle_.get();
xunjieli 2017/05/04 16:54:42 So this makes a new Handle? This is quite subtle.
Ryan Hamilton 2017/05/05 03:50:24 Done.
1415 return weak_factory_.GetWeakPtr();
1416 } 1555 }
1417 1556
1418 void QuicChromiumClientSession::OnReadError( 1557 void QuicChromiumClientSession::OnReadError(
1419 int result, 1558 int result,
1420 const DatagramClientSocket* socket) { 1559 const DatagramClientSocket* socket) {
1421 DCHECK(socket != nullptr); 1560 DCHECK(socket != nullptr);
1422 if (socket != GetDefaultSocket()) { 1561 if (socket != GetDefaultSocket()) {
1423 // Ignore read errors from old sockets that are no longer active. 1562 // Ignore read errors from old sockets that are no longer active.
1424 // TODO(jri): Maybe clean up old sockets on error. 1563 // TODO(jri): Maybe clean up old sockets on error.
1425 return; 1564 return;
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
1501 // on the write to the new socket. 1640 // on the write to the new socket.
1502 task_runner_->PostTask( 1641 task_runner_->PostTask(
1503 FROM_HERE, base::Bind(&QuicChromiumClientSession::WriteToNewSocket, 1642 FROM_HERE, base::Bind(&QuicChromiumClientSession::WriteToNewSocket,
1504 weak_factory_.GetWeakPtr())); 1643 weak_factory_.GetWeakPtr()));
1505 // Migration completed. 1644 // Migration completed.
1506 migration_pending_ = false; 1645 migration_pending_ = false;
1507 return true; 1646 return true;
1508 } 1647 }
1509 1648
1510 void QuicChromiumClientSession::PopulateNetErrorDetails( 1649 void QuicChromiumClientSession::PopulateNetErrorDetails(
1511 NetErrorDetails* details) { 1650 NetErrorDetails* details) const {
1512 details->quic_port_migration_detected = port_migration_detected_; 1651 details->quic_port_migration_detected = port_migration_detected_;
1513 } 1652 }
1514 1653
1515 const DatagramClientSocket* QuicChromiumClientSession::GetDefaultSocket() 1654 const DatagramClientSocket* QuicChromiumClientSession::GetDefaultSocket()
1516 const { 1655 const {
1517 DCHECK(sockets_.back().get() != nullptr); 1656 DCHECK(sockets_.back().get() != nullptr);
1518 // The most recently added socket is the currently active one. 1657 // The most recently added socket is the currently active one.
1519 return sockets_.back().get(); 1658 return sockets_.back().get();
1520 } 1659 }
1521 1660
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
1601 } 1740 }
1602 1741
1603 size_t QuicChromiumClientSession::EstimateMemoryUsage() const { 1742 size_t QuicChromiumClientSession::EstimateMemoryUsage() const {
1604 // TODO(xunjieli): Estimate |crypto_stream_|, QuicSpdySession's 1743 // TODO(xunjieli): Estimate |crypto_stream_|, QuicSpdySession's
1605 // QuicHeaderList, QuicSession's QuiCWriteBlockedList, open streams and 1744 // QuicHeaderList, QuicSession's QuiCWriteBlockedList, open streams and
1606 // unacked packet map. 1745 // unacked packet map.
1607 return base::trace_event::EstimateMemoryUsage(packet_readers_); 1746 return base::trace_event::EstimateMemoryUsage(packet_readers_);
1608 } 1747 }
1609 1748
1610 } // namespace net 1749 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698