Chromium Code Reviews| Index: net/quic/chromium/quic_stream_factory.cc |
| diff --git a/net/quic/chromium/quic_stream_factory.cc b/net/quic/chromium/quic_stream_factory.cc |
| index c65cced78bb69c9ec9cfe59a7382fdcbd7a507f0..a040b4449b71677f6de5088b87db3d61be986486 100644 |
| --- a/net/quic/chromium/quic_stream_factory.cc |
| +++ b/net/quic/chromium/quic_stream_factory.cc |
| @@ -326,6 +326,7 @@ class QuicStreamFactory::CertVerifierJob { |
| class QuicStreamFactory::Job { |
| public: |
| Job(QuicStreamFactory* factory, |
| + const QuicVersion& quic_version, |
| HostResolver* host_resolver, |
| const QuicSessionKey& key, |
| bool was_alternative_service_recently_broken, |
| @@ -366,6 +367,7 @@ class QuicStreamFactory::Job { |
| IoState io_state_; |
| QuicStreamFactory* factory_; |
| + QuicVersion quic_version_; |
| HostResolver* host_resolver_; |
| std::unique_ptr<HostResolver::Request> request_; |
| const QuicSessionKey key_; |
| @@ -383,6 +385,7 @@ class QuicStreamFactory::Job { |
| }; |
| QuicStreamFactory::Job::Job(QuicStreamFactory* factory, |
| + const QuicVersion& quic_version, |
| HostResolver* host_resolver, |
| const QuicSessionKey& key, |
| bool was_alternative_service_recently_broken, |
| @@ -390,6 +393,7 @@ QuicStreamFactory::Job::Job(QuicStreamFactory* factory, |
| const NetLogWithSource& net_log) |
| : io_state_(STATE_RESOLVE_HOST), |
| factory_(factory), |
| + quic_version_(quic_version), |
| host_resolver_(host_resolver), |
| key_(key), |
| cert_verify_flags_(cert_verify_flags), |
| @@ -508,10 +512,11 @@ int QuicStreamFactory::Job::DoConnect() { |
| NetLogEventType::QUIC_STREAM_FACTORY_JOB_CONNECT, |
| NetLog::BoolCallback("require_confirmation", require_confirmation)); |
| - int rv = |
| - factory_->CreateSession(key_, cert_verify_flags_, require_confirmation, |
| - address_list_, dns_resolution_start_time_, |
| - dns_resolution_end_time_, net_log_, &session_); |
| + DCHECK_NE(quic_version_, QUIC_VERSION_UNSUPPORTED); |
| + int rv = factory_->CreateSession( |
| + key_, quic_version_, cert_verify_flags_, require_confirmation, |
| + address_list_, dns_resolution_start_time_, dns_resolution_end_time_, |
| + net_log_, &session_); |
| if (rv != OK) { |
| DCHECK(rv != ERR_IO_PENDING); |
| DCHECK(!session_); |
| @@ -581,6 +586,7 @@ QuicStreamRequest::~QuicStreamRequest() { |
| } |
| int QuicStreamRequest::Request(const HostPortPair& destination, |
| + const QuicVersionVector& advertised_versions, |
| PrivacyMode privacy_mode, |
| int cert_verify_flags, |
| const GURL& url, |
| @@ -591,8 +597,8 @@ int QuicStreamRequest::Request(const HostPortPair& destination, |
| DCHECK(factory_); |
| server_id_ = QuicServerId(HostPortPair::FromURL(url), privacy_mode); |
| - int rv = factory_->Create(server_id_, destination, cert_verify_flags, url, |
| - method, net_log, this); |
| + int rv = factory_->Create(server_id_, destination, advertised_versions, |
| + cert_verify_flags, url, method, net_log, this); |
| if (rv == ERR_IO_PENDING) { |
| net_log_ = net_log; |
| callback_ = callback; |
| @@ -849,6 +855,7 @@ bool QuicStreamFactory::CanUseExistingSession(const QuicServerId& server_id, |
| int QuicStreamFactory::Create(const QuicServerId& server_id, |
| const HostPortPair& destination, |
| + const QuicVersionVector& advertised_versions, |
| int cert_verify_flags, |
| const GURL& url, |
| QuicStringPiece method, |
| @@ -926,8 +933,10 @@ int QuicStreamFactory::Create(const QuicServerId& server_id, |
| ignore_result(StartCertVerifyJob(server_id, cert_verify_flags, net_log)); |
| QuicSessionKey key(destination, server_id); |
| + QuicVersion quic_version = SelectQuicVersion(advertised_versions); |
| + DCHECK_NE(quic_version, QUIC_VERSION_UNSUPPORTED); |
| std::unique_ptr<Job> job = base::MakeUnique<Job>( |
| - this, host_resolver_, key, WasQuicRecentlyBroken(server_id), |
| + this, quic_version, host_resolver_, key, WasQuicRecentlyBroken(server_id), |
| cert_verify_flags, net_log); |
| int rv = job->Run(base::Bind(&QuicStreamFactory::OnJobComplete, |
| base::Unretained(this), job.get())); |
| @@ -1458,15 +1467,15 @@ int QuicStreamFactory::ConfigureSocket(DatagramClientSocket* socket, |
| return OK; |
| } |
| -int QuicStreamFactory::CreateSession( |
| - const QuicSessionKey& key, |
| - int cert_verify_flags, |
| - bool require_confirmation, |
| - const AddressList& address_list, |
| - base::TimeTicks dns_resolution_start_time, |
| - base::TimeTicks dns_resolution_end_time, |
| - const NetLogWithSource& net_log, |
| - QuicChromiumClientSession** session) { |
| +int QuicStreamFactory::CreateSession(const QuicSessionKey& key, |
| + const QuicVersion& quic_version, |
| + int cert_verify_flags, |
| + bool require_confirmation, |
| + const AddressList& address_list, |
| + base::TimeTicks dns_resolution_start_time, |
| + base::TimeTicks dns_resolution_end_time, |
| + const NetLogWithSource& net_log, |
| + QuicChromiumClientSession** session) { |
| TRACE_EVENT0(kNetTracingCategory, "QuicStreamFactory::CreateSession"); |
| IPEndPoint addr = *address_list.begin(); |
| const QuicServerId& server_id = key.server_id(); |
| @@ -1502,7 +1511,7 @@ int QuicStreamFactory::CreateSession( |
| QuicConnection* connection = new QuicConnection( |
| connection_id, QuicSocketAddress(QuicSocketAddressImpl(addr)), |
| helper_.get(), alarm_factory_.get(), writer, true /* owns_writer */, |
| - Perspective::IS_CLIENT, supported_versions_); |
| + Perspective::IS_CLIENT, {quic_version}); |
| connection->set_ping_timeout(ping_timeout_); |
| connection->SetMaxPacketLength(max_packet_length_); |
| @@ -1592,6 +1601,20 @@ void QuicStreamFactory::ConfigureInitialRttEstimate( |
| SetInitialRttEstimate(base::TimeDelta(), INITIAL_RTT_DEFAULT, config); |
| } |
| +QuicVersion QuicStreamFactory::SelectQuicVersion( |
| + const QuicVersionVector& advertised_versions) const { |
| + if (advertised_versions.empty()) |
| + return supported_versions_[0]; |
| + |
| + for (const QuicVersion& supported : supported_versions_) { |
| + for (const QuicVersion& advertised : advertised_versions) { |
| + if (supported == advertised) |
| + return supported; |
| + } |
| + } |
| + return supported_versions_[0]; |
|
Bence
2017/06/28 19:08:58
Optional: add DCHECK(!supported_versions_.empty())
Zhongyi Shi
2017/07/05 23:08:59
Acknowledged.
|
| +} |
| + |
| const base::TimeDelta* QuicStreamFactory::GetServerNetworkStatsSmoothedRtt( |
| const QuicServerId& server_id) const { |
| url::SchemeHostPort server("https", server_id.host_port_pair().host(), |