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/quic_client_session.h" | 5 #include "net/quic/quic_client_session.h" |
6 | 6 |
7 #include "base/callback_helpers.h" | 7 #include "base/callback_helpers.h" |
8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
9 #include "base/metrics/histogram.h" | 9 #include "base/metrics/histogram.h" |
10 #include "base/metrics/sparse_histogram.h" | 10 #include "base/metrics/sparse_histogram.h" |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
149 require_confirmation_(false), | 149 require_confirmation_(false), |
150 stream_factory_(stream_factory), | 150 stream_factory_(stream_factory), |
151 socket_(socket.Pass()), | 151 socket_(socket.Pass()), |
152 writer_(writer.Pass()), | 152 writer_(writer.Pass()), |
153 read_buffer_(new IOBufferWithSize(kMaxPacketSize)), | 153 read_buffer_(new IOBufferWithSize(kMaxPacketSize)), |
154 server_info_(server_info.Pass()), | 154 server_info_(server_info.Pass()), |
155 read_pending_(false), | 155 read_pending_(false), |
156 num_total_streams_(0), | 156 num_total_streams_(0), |
157 task_runner_(task_runner), | 157 task_runner_(task_runner), |
158 net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_QUIC_SESSION)), | 158 net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_QUIC_SESSION)), |
159 logger_(net_log_), | 159 logger_(new QuicConnectionLogger(net_log_)), |
160 num_packets_read_(0), | 160 num_packets_read_(0), |
161 going_away_(false), | 161 going_away_(false), |
162 weak_factory_(this) { | 162 weak_factory_(this) { |
163 crypto_stream_.reset( | 163 crypto_stream_.reset( |
164 crypto_client_stream_factory ? | 164 crypto_client_stream_factory ? |
165 crypto_client_stream_factory->CreateQuicCryptoClientStream( | 165 crypto_client_stream_factory->CreateQuicCryptoClientStream( |
166 server_id, this, crypto_config) : | 166 server_id, this, crypto_config) : |
167 new QuicCryptoClientStream(server_id, this, | 167 new QuicCryptoClientStream(server_id, this, |
168 new ProofVerifyContextChromium(net_log_), | 168 new ProofVerifyContextChromium(net_log_), |
169 crypto_config)); | 169 crypto_config)); |
170 | 170 |
171 connection->set_debug_visitor(&logger_); | 171 connection->set_debug_visitor(logger_); |
172 // TODO(rch): pass in full host port proxy pair | 172 // TODO(rch): pass in full host port proxy pair |
173 net_log_.BeginEvent( | 173 net_log_.BeginEvent( |
174 NetLog::TYPE_QUIC_SESSION, | 174 NetLog::TYPE_QUIC_SESSION, |
175 NetLog::StringCallback("host", &server_id.host())); | 175 NetLog::StringCallback("host", &server_id.host())); |
176 } | 176 } |
177 | 177 |
178 QuicClientSession::~QuicClientSession() { | 178 QuicClientSession::~QuicClientSession() { |
179 if (!streams()->empty()) | 179 if (!streams()->empty()) |
180 RecordUnexpectedOpenStreams(DESTRUCTOR); | 180 RecordUnexpectedOpenStreams(DESTRUCTOR); |
181 if (!observers_.empty()) | 181 if (!observers_.empty()) |
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
514 | 514 |
515 QuicDataStream* QuicClientSession::CreateIncomingDataStream( | 515 QuicDataStream* QuicClientSession::CreateIncomingDataStream( |
516 QuicStreamId id) { | 516 QuicStreamId id) { |
517 DLOG(ERROR) << "Server push not supported"; | 517 DLOG(ERROR) << "Server push not supported"; |
518 return NULL; | 518 return NULL; |
519 } | 519 } |
520 | 520 |
521 void QuicClientSession::CloseStream(QuicStreamId stream_id) { | 521 void QuicClientSession::CloseStream(QuicStreamId stream_id) { |
522 ReliableQuicStream* stream = GetStream(stream_id); | 522 ReliableQuicStream* stream = GetStream(stream_id); |
523 if (stream) { | 523 if (stream) { |
524 logger_.UpdateReceivedFrameCounts( | 524 logger_->UpdateReceivedFrameCounts( |
525 stream_id, stream->num_frames_received(), | 525 stream_id, stream->num_frames_received(), |
526 stream->num_duplicate_frames_received()); | 526 stream->num_duplicate_frames_received()); |
527 } | 527 } |
528 QuicSession::CloseStream(stream_id); | 528 QuicSession::CloseStream(stream_id); |
529 OnClosedStream(); | 529 OnClosedStream(); |
530 } | 530 } |
531 | 531 |
532 void QuicClientSession::SendRstStream(QuicStreamId id, | 532 void QuicClientSession::SendRstStream(QuicStreamId id, |
533 QuicRstStreamErrorCode error, | 533 QuicRstStreamErrorCode error, |
534 QuicStreamOffset bytes_written) { | 534 QuicStreamOffset bytes_written) { |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
570 Observer* observer = *it; | 570 Observer* observer = *it; |
571 ++it; | 571 ++it; |
572 observer->OnCryptoHandshakeConfirmed(); | 572 observer->OnCryptoHandshakeConfirmed(); |
573 } | 573 } |
574 } | 574 } |
575 QuicSession::OnCryptoHandshakeEvent(event); | 575 QuicSession::OnCryptoHandshakeEvent(event); |
576 } | 576 } |
577 | 577 |
578 void QuicClientSession::OnCryptoHandshakeMessageSent( | 578 void QuicClientSession::OnCryptoHandshakeMessageSent( |
579 const CryptoHandshakeMessage& message) { | 579 const CryptoHandshakeMessage& message) { |
580 logger_.OnCryptoHandshakeMessageSent(message); | 580 logger_->OnCryptoHandshakeMessageSent(message); |
581 } | 581 } |
582 | 582 |
583 void QuicClientSession::OnCryptoHandshakeMessageReceived( | 583 void QuicClientSession::OnCryptoHandshakeMessageReceived( |
584 const CryptoHandshakeMessage& message) { | 584 const CryptoHandshakeMessage& message) { |
585 logger_.OnCryptoHandshakeMessageReceived(message); | 585 logger_->OnCryptoHandshakeMessageReceived(message); |
586 } | 586 } |
587 | 587 |
588 void QuicClientSession::OnConnectionClosed(QuicErrorCode error, | 588 void QuicClientSession::OnConnectionClosed(QuicErrorCode error, |
589 bool from_peer) { | 589 bool from_peer) { |
590 DCHECK(!connection()->connected()); | 590 DCHECK(!connection()->connected()); |
591 logger_.OnConnectionClosed(error, from_peer); | 591 logger_->OnConnectionClosed(error, from_peer); |
592 if (from_peer) { | 592 if (from_peer) { |
593 UMA_HISTOGRAM_SPARSE_SLOWLY( | 593 UMA_HISTOGRAM_SPARSE_SLOWLY( |
594 "Net.QuicSession.ConnectionCloseErrorCodeServer", error); | 594 "Net.QuicSession.ConnectionCloseErrorCodeServer", error); |
595 } else { | 595 } else { |
596 UMA_HISTOGRAM_SPARSE_SLOWLY( | 596 UMA_HISTOGRAM_SPARSE_SLOWLY( |
597 "Net.QuicSession.ConnectionCloseErrorCodeClient", error); | 597 "Net.QuicSession.ConnectionCloseErrorCodeClient", error); |
598 } | 598 } |
599 | 599 |
600 if (error == QUIC_CONNECTION_TIMED_OUT) { | 600 if (error == QUIC_CONNECTION_TIMED_OUT) { |
601 UMA_HISTOGRAM_COUNTS( | 601 UMA_HISTOGRAM_COUNTS( |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
636 socket_->Close(); | 636 socket_->Close(); |
637 QuicSession::OnConnectionClosed(error, from_peer); | 637 QuicSession::OnConnectionClosed(error, from_peer); |
638 DCHECK(streams()->empty()); | 638 DCHECK(streams()->empty()); |
639 CloseAllStreams(ERR_UNEXPECTED); | 639 CloseAllStreams(ERR_UNEXPECTED); |
640 CloseAllObservers(ERR_UNEXPECTED); | 640 CloseAllObservers(ERR_UNEXPECTED); |
641 NotifyFactoryOfSessionClosedLater(); | 641 NotifyFactoryOfSessionClosedLater(); |
642 } | 642 } |
643 | 643 |
644 void QuicClientSession::OnSuccessfulVersionNegotiation( | 644 void QuicClientSession::OnSuccessfulVersionNegotiation( |
645 const QuicVersion& version) { | 645 const QuicVersion& version) { |
646 logger_.OnSuccessfulVersionNegotiation(version); | 646 logger_->OnSuccessfulVersionNegotiation(version); |
647 QuicSession::OnSuccessfulVersionNegotiation(version); | 647 QuicSession::OnSuccessfulVersionNegotiation(version); |
648 } | 648 } |
649 | 649 |
650 void QuicClientSession::OnProofValid( | 650 void QuicClientSession::OnProofValid( |
651 const QuicCryptoClientConfig::CachedState& cached) { | 651 const QuicCryptoClientConfig::CachedState& cached) { |
652 DCHECK(cached.proof_valid()); | 652 DCHECK(cached.proof_valid()); |
653 | 653 |
654 if (!server_info_ || !server_info_->IsReadyToPersist()) { | 654 if (!server_info_ || !server_info_->IsReadyToPersist()) { |
655 return; | 655 return; |
656 } | 656 } |
657 | 657 |
658 QuicServerInfo::State* state = server_info_->mutable_state(); | 658 QuicServerInfo::State* state = server_info_->mutable_state(); |
659 | 659 |
660 state->server_config = cached.server_config(); | 660 state->server_config = cached.server_config(); |
661 state->source_address_token = cached.source_address_token(); | 661 state->source_address_token = cached.source_address_token(); |
662 state->server_config_sig = cached.signature(); | 662 state->server_config_sig = cached.signature(); |
663 state->certs = cached.certs(); | 663 state->certs = cached.certs(); |
664 | 664 |
665 server_info_->Persist(); | 665 server_info_->Persist(); |
666 } | 666 } |
667 | 667 |
668 void QuicClientSession::OnProofVerifyDetailsAvailable( | 668 void QuicClientSession::OnProofVerifyDetailsAvailable( |
669 const ProofVerifyDetails& verify_details) { | 669 const ProofVerifyDetails& verify_details) { |
670 const CertVerifyResult* cert_verify_result_other = | 670 const CertVerifyResult* cert_verify_result_other = |
671 &(reinterpret_cast<const ProofVerifyDetailsChromium*>( | 671 &(reinterpret_cast<const ProofVerifyDetailsChromium*>( |
672 &verify_details))->cert_verify_result; | 672 &verify_details))->cert_verify_result; |
673 CertVerifyResult* result_copy = new CertVerifyResult; | 673 CertVerifyResult* result_copy = new CertVerifyResult; |
674 result_copy->CopyFrom(*cert_verify_result_other); | 674 result_copy->CopyFrom(*cert_verify_result_other); |
675 cert_verify_result_.reset(result_copy); | 675 cert_verify_result_.reset(result_copy); |
676 logger_.OnCertificateVerified(*cert_verify_result_); | 676 logger_->OnCertificateVerified(*cert_verify_result_); |
677 } | 677 } |
678 | 678 |
679 void QuicClientSession::StartReading() { | 679 void QuicClientSession::StartReading() { |
680 if (read_pending_) { | 680 if (read_pending_) { |
681 return; | 681 return; |
682 } | 682 } |
683 read_pending_ = true; | 683 read_pending_ = true; |
684 int rv = socket_->Read(read_buffer_.get(), | 684 int rv = socket_->Read(read_buffer_.get(), |
685 read_buffer_->size(), | 685 read_buffer_->size(), |
686 base::Bind(&QuicClientSession::OnReadComplete, | 686 base::Bind(&QuicClientSession::OnReadComplete, |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
856 return; | 856 return; |
857 | 857 |
858 // TODO(rch): re-enable this code once beta is cut. | 858 // TODO(rch): re-enable this code once beta is cut. |
859 // if (stream_factory_) | 859 // if (stream_factory_) |
860 // stream_factory_->OnSessionConnectTimeout(this); | 860 // stream_factory_->OnSessionConnectTimeout(this); |
861 // CloseAllStreams(ERR_QUIC_HANDSHAKE_FAILED); | 861 // CloseAllStreams(ERR_QUIC_HANDSHAKE_FAILED); |
862 // DCHECK_EQ(0u, GetNumOpenStreams()); | 862 // DCHECK_EQ(0u, GetNumOpenStreams()); |
863 } | 863 } |
864 | 864 |
865 } // namespace net | 865 } // namespace net |
OLD | NEW |