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(), |