Chromium Code Reviews| 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 #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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |