| 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 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 159 scoped_ptr<QuicServerInfo> server_info, | 159 scoped_ptr<QuicServerInfo> server_info, |
| 160 const QuicConfig& config, | 160 const QuicConfig& config, |
| 161 const char* const connection_description, | 161 const char* const connection_description, |
| 162 base::TimeTicks dns_resolution_end_time, | 162 base::TimeTicks dns_resolution_end_time, |
| 163 base::TaskRunner* task_runner, | 163 base::TaskRunner* task_runner, |
| 164 NetLog* net_log) | 164 NetLog* net_log) |
| 165 : QuicClientSessionBase(connection, config), | 165 : QuicClientSessionBase(connection, config), |
| 166 require_confirmation_(false), | 166 require_confirmation_(false), |
| 167 stream_factory_(stream_factory), | 167 stream_factory_(stream_factory), |
| 168 socket_(socket.Pass()), | 168 socket_(socket.Pass()), |
| 169 read_buffer_(new IOBufferWithSize(kMaxPacketSize)), | |
| 170 transport_security_state_(transport_security_state), | 169 transport_security_state_(transport_security_state), |
| 171 server_info_(server_info.Pass()), | 170 server_info_(server_info.Pass()), |
| 172 read_pending_(false), | |
| 173 num_total_streams_(0), | 171 num_total_streams_(0), |
| 174 task_runner_(task_runner), | 172 task_runner_(task_runner), |
| 175 net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_QUIC_SESSION)), | 173 net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_QUIC_SESSION)), |
| 174 packet_reader_(socket_.get(), this, net_log_), |
| 176 dns_resolution_end_time_(dns_resolution_end_time), | 175 dns_resolution_end_time_(dns_resolution_end_time), |
| 177 logger_(new QuicConnectionLogger(this, connection_description, net_log_)), | 176 logger_(new QuicConnectionLogger(this, connection_description, net_log_)), |
| 178 num_packets_read_(0), | |
| 179 going_away_(false), | 177 going_away_(false), |
| 180 weak_factory_(this) { | 178 weak_factory_(this) { |
| 181 connection->set_debug_visitor(logger_.get()); | 179 connection->set_debug_visitor(logger_.get()); |
| 182 IPEndPoint address; | 180 IPEndPoint address; |
| 183 if (socket && socket->GetLocalAddress(&address) == OK && | 181 if (socket && socket->GetLocalAddress(&address) == OK && |
| 184 address.GetFamily() == ADDRESS_FAMILY_IPV6) { | 182 address.GetFamily() == ADDRESS_FAMILY_IPV6) { |
| 185 connection->set_max_packet_length( | 183 connection->set_max_packet_length( |
| 186 connection->max_packet_length() - kAdditionalOverheadForIPv6); | 184 connection->max_packet_length() - kAdditionalOverheadForIPv6); |
| 187 } | 185 } |
| 188 } | 186 } |
| (...skipping 571 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 760 const ProofVerifyDetailsChromium* verify_details_chromium = | 758 const ProofVerifyDetailsChromium* verify_details_chromium = |
| 761 reinterpret_cast<const ProofVerifyDetailsChromium*>(&verify_details); | 759 reinterpret_cast<const ProofVerifyDetailsChromium*>(&verify_details); |
| 762 CertVerifyResult* result_copy = new CertVerifyResult; | 760 CertVerifyResult* result_copy = new CertVerifyResult; |
| 763 result_copy->CopyFrom(verify_details_chromium->cert_verify_result); | 761 result_copy->CopyFrom(verify_details_chromium->cert_verify_result); |
| 764 cert_verify_result_.reset(result_copy); | 762 cert_verify_result_.reset(result_copy); |
| 765 pinning_failure_log_ = verify_details_chromium->pinning_failure_log; | 763 pinning_failure_log_ = verify_details_chromium->pinning_failure_log; |
| 766 logger_->OnCertificateVerified(*cert_verify_result_); | 764 logger_->OnCertificateVerified(*cert_verify_result_); |
| 767 } | 765 } |
| 768 | 766 |
| 769 void QuicClientSession::StartReading() { | 767 void QuicClientSession::StartReading() { |
| 770 if (read_pending_) { | 768 packet_reader_.StartReading(); |
| 771 return; | |
| 772 } | |
| 773 read_pending_ = true; | |
| 774 int rv = socket_->Read(read_buffer_.get(), | |
| 775 read_buffer_->size(), | |
| 776 base::Bind(&QuicClientSession::OnReadComplete, | |
| 777 weak_factory_.GetWeakPtr())); | |
| 778 UMA_HISTOGRAM_BOOLEAN("Net.QuicSession.AsyncRead", rv == ERR_IO_PENDING); | |
| 779 if (rv == ERR_IO_PENDING) { | |
| 780 num_packets_read_ = 0; | |
| 781 return; | |
| 782 } | |
| 783 | |
| 784 if (++num_packets_read_ > 32) { | |
| 785 num_packets_read_ = 0; | |
| 786 // Data was read, process it. | |
| 787 // Schedule the work through the message loop to 1) prevent infinite | |
| 788 // recursion and 2) avoid blocking the thread for too long. | |
| 789 base::MessageLoop::current()->PostTask( | |
| 790 FROM_HERE, | |
| 791 base::Bind(&QuicClientSession::OnReadComplete, | |
| 792 weak_factory_.GetWeakPtr(), rv)); | |
| 793 } else { | |
| 794 OnReadComplete(rv); | |
| 795 } | |
| 796 } | 769 } |
| 797 | 770 |
| 798 void QuicClientSession::CloseSessionOnError(int error) { | 771 void QuicClientSession::CloseSessionOnError(int error) { |
| 799 UMA_HISTOGRAM_SPARSE_SLOWLY("Net.QuicSession.CloseSessionOnError", -error); | 772 UMA_HISTOGRAM_SPARSE_SLOWLY("Net.QuicSession.CloseSessionOnError", -error); |
| 800 CloseSessionOnErrorInner(error, QUIC_INTERNAL_ERROR); | 773 CloseSessionOnErrorInner(error, QUIC_INTERNAL_ERROR); |
| 801 NotifyFactoryOfSessionClosed(); | 774 NotifyFactoryOfSessionClosed(); |
| 802 } | 775 } |
| 803 | 776 |
| 804 void QuicClientSession::CloseSessionOnErrorInner(int net_error, | 777 void QuicClientSession::CloseSessionOnErrorInner(int net_error, |
| 805 QuicErrorCode quic_error) { | 778 QuicErrorCode quic_error) { |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 867 } | 840 } |
| 868 dict->Set("aliases", alias_list); | 841 dict->Set("aliases", alias_list); |
| 869 | 842 |
| 870 return dict; | 843 return dict; |
| 871 } | 844 } |
| 872 | 845 |
| 873 base::WeakPtr<QuicClientSession> QuicClientSession::GetWeakPtr() { | 846 base::WeakPtr<QuicClientSession> QuicClientSession::GetWeakPtr() { |
| 874 return weak_factory_.GetWeakPtr(); | 847 return weak_factory_.GetWeakPtr(); |
| 875 } | 848 } |
| 876 | 849 |
| 877 void QuicClientSession::OnReadComplete(int result) { | 850 void QuicClientSession::OnReadError(int result) { |
| 878 read_pending_ = false; | 851 DVLOG(1) << "Closing session on read error: " << result; |
| 879 if (result == 0) | 852 UMA_HISTOGRAM_SPARSE_SLOWLY("Net.QuicSession.ReadError", -result); |
| 880 result = ERR_CONNECTION_CLOSED; | 853 NotifyFactoryOfSessionGoingAway(); |
| 854 CloseSessionOnErrorInner(result, QUIC_PACKET_READ_ERROR); |
| 855 NotifyFactoryOfSessionClosedLater(); |
| 856 } |
| 881 | 857 |
| 882 if (result < 0) { | 858 bool QuicClientSession::OnPacket(const QuicEncryptedPacket& packet, |
| 883 DVLOG(1) << "Closing session on read error: " << result; | 859 IPEndPoint local_address, |
| 884 UMA_HISTOGRAM_SPARSE_SLOWLY("Net.QuicSession.ReadError", -result); | 860 IPEndPoint peer_address) { |
| 885 NotifyFactoryOfSessionGoingAway(); | |
| 886 CloseSessionOnErrorInner(result, QUIC_PACKET_READ_ERROR); | |
| 887 NotifyFactoryOfSessionClosedLater(); | |
| 888 return; | |
| 889 } | |
| 890 | |
| 891 QuicEncryptedPacket packet(read_buffer_->data(), result); | |
| 892 IPEndPoint local_address; | |
| 893 IPEndPoint peer_address; | |
| 894 socket_->GetLocalAddress(&local_address); | |
| 895 socket_->GetPeerAddress(&peer_address); | |
| 896 // ProcessUdpPacket might result in |this| being deleted, so we | |
| 897 // use a weak pointer to be safe. | |
| 898 connection()->ProcessUdpPacket(local_address, peer_address, packet); | 861 connection()->ProcessUdpPacket(local_address, peer_address, packet); |
| 899 if (!connection()->connected()) { | 862 if (!connection()->connected()) { |
| 900 NotifyFactoryOfSessionClosedLater(); | 863 NotifyFactoryOfSessionClosedLater(); |
| 901 return; | 864 return false; |
| 902 } | 865 } |
| 903 StartReading(); | 866 return true; |
| 904 } | 867 } |
| 905 | 868 |
| 906 void QuicClientSession::NotifyFactoryOfSessionGoingAway() { | 869 void QuicClientSession::NotifyFactoryOfSessionGoingAway() { |
| 907 going_away_ = true; | 870 going_away_ = true; |
| 908 if (stream_factory_) | 871 if (stream_factory_) |
| 909 stream_factory_->OnSessionGoingAway(this); | 872 stream_factory_->OnSessionGoingAway(this); |
| 910 } | 873 } |
| 911 | 874 |
| 912 void QuicClientSession::NotifyFactoryOfSessionClosedLater() { | 875 void QuicClientSession::NotifyFactoryOfSessionClosedLater() { |
| 913 if (!streams()->empty()) | 876 if (!streams()->empty()) |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 947 return; | 910 return; |
| 948 | 911 |
| 949 // TODO(rch): re-enable this code once beta is cut. | 912 // TODO(rch): re-enable this code once beta is cut. |
| 950 // if (stream_factory_) | 913 // if (stream_factory_) |
| 951 // stream_factory_->OnSessionConnectTimeout(this); | 914 // stream_factory_->OnSessionConnectTimeout(this); |
| 952 // CloseAllStreams(ERR_QUIC_HANDSHAKE_FAILED); | 915 // CloseAllStreams(ERR_QUIC_HANDSHAKE_FAILED); |
| 953 // DCHECK_EQ(0u, GetNumOpenStreams()); | 916 // DCHECK_EQ(0u, GetNumOpenStreams()); |
| 954 } | 917 } |
| 955 | 918 |
| 956 } // namespace net | 919 } // namespace net |
| OLD | NEW |