| 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 378985bbf25ad21af847fc2eace88b3fd1bbbe00..b3bb81ba3fac873bc824a055ba5a660071f1af80 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()));
|
| @@ -1445,15 +1454,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();
|
| @@ -1486,6 +1495,7 @@ int QuicStreamFactory::CreateSession(
|
| InitializeCachedStateInCryptoConfig(server_id, server_info, &connection_id);
|
|
|
| QuicChromiumPacketWriter* writer = new QuicChromiumPacketWriter(socket.get());
|
| + // TODO(zhongyi): pass over |quic_version| to QuicConnection;
|
| QuicConnection* connection = new QuicConnection(
|
| connection_id, QuicSocketAddress(QuicSocketAddressImpl(addr)),
|
| helper_.get(), alarm_factory_.get(), writer, true /* owns_writer */,
|
| @@ -1579,6 +1589,18 @@ void QuicStreamFactory::ConfigureInitialRttEstimate(
|
| SetInitialRttEstimate(base::TimeDelta(), INITIAL_RTT_DEFAULT, config);
|
| }
|
|
|
| +QuicVersion QuicStreamFactory::SelectQuicVersion(
|
| + const QuicVersionVector& advertised_versions) const {
|
| + for (const auto& supported : supported_versions_) {
|
| + for (const auto& advertised : advertised_versions) {
|
| + if (supported == advertised)
|
| + return supported;
|
| + }
|
| + }
|
| +
|
| + return supported_versions_[0];
|
| +}
|
| +
|
| const base::TimeDelta* QuicStreamFactory::GetServerNetworkStatsSmoothedRtt(
|
| const QuicServerId& server_id) const {
|
| url::SchemeHostPort server("https", server_id.host_port_pair().host(),
|
|
|