Index: net/http/http_stream_factory_impl_job_controller.cc |
diff --git a/net/http/http_stream_factory_impl_job_controller.cc b/net/http/http_stream_factory_impl_job_controller.cc |
index 207a9c36fed9ec0ac33403bab292ca33df7085ce..a5815ad8efc63b9d80d206449719221bbc8eb06a 100644 |
--- a/net/http/http_stream_factory_impl_job_controller.cc |
+++ b/net/http/http_stream_factory_impl_job_controller.cc |
@@ -805,25 +805,30 @@ int HttpStreamFactoryImpl::JobController::DoCreateJobs() { |
GURL origin_url = ApplyHostMappingRules(request_info_.url, &destination); |
// Create an alternative job if alternative service is set up for this domain. |
- alternative_service_ = |
- GetAlternativeServiceInfoFor(request_info_, delegate_, stream_type_) |
- .alternative_service(); |
+ alternative_service_info_ = |
+ GetAlternativeServiceInfoFor(request_info_, delegate_, stream_type_); |
+ QuicVersion quic_version = QUIC_VERSION_UNSUPPORTED; |
+ if (alternative_service_info_.protocol() == kProtoQUIC) { |
+ quic_version = |
+ SelectQuicVersion(alternative_service_info_.advertised_versions()); |
+ DCHECK_NE(quic_version, QUIC_VERSION_UNSUPPORTED); |
+ } |
if (is_preconnect_) { |
// Due to how the socket pools handle priorities and idle sockets, only IDLE |
// priority currently makes sense for preconnects. The priority for |
// preconnects is currently ignored (see RequestSocketsForPool()), but could |
// be used at some point for proxy resolution or something. |
- if (alternative_service_.protocol != kProtoUnknown) { |
+ if (alternative_service_info_.protocol() != kProtoUnknown) { |
HostPortPair alternative_destination( |
- alternative_service_.host_port_pair()); |
+ alternative_service_info_.host_port_pair()); |
ignore_result( |
ApplyHostMappingRules(request_info_.url, &alternative_destination)); |
main_job_ = job_factory_->CreateAltSvcJob( |
this, PRECONNECT, session_, request_info_, IDLE, proxy_info_, |
server_ssl_config_, proxy_ssl_config_, alternative_destination, |
- origin_url, alternative_service_.protocol, enable_ip_based_pooling_, |
- session_->net_log()); |
+ origin_url, alternative_service_info_.protocol(), quic_version, |
+ enable_ip_based_pooling_, session_->net_log()); |
} else { |
main_job_ = job_factory_->CreateMainJob( |
this, PRECONNECT, session_, request_info_, IDLE, proxy_info_, |
@@ -839,23 +844,23 @@ int HttpStreamFactoryImpl::JobController::DoCreateJobs() { |
enable_ip_based_pooling_, net_log_.net_log()); |
// Alternative Service can only be set for HTTPS requests while Alternative |
// Proxy is set for HTTP requests. |
- if (alternative_service_.protocol != kProtoUnknown) { |
+ if (alternative_service_info_.protocol() != kProtoUnknown) { |
// Never share connection with other jobs for FTP requests. |
DVLOG(1) << "Selected alternative service (host: " |
- << alternative_service_.host_port_pair().host() |
- << " port: " << alternative_service_.host_port_pair().port() |
- << ")"; |
+ << alternative_service_info_.host_port_pair().host() |
+ << " port: " << alternative_service_info_.host_port_pair().port() |
+ << " version: " << quic_version << ")"; |
DCHECK(!request_info_.url.SchemeIs(url::kFtpScheme)); |
- HostPortPair alternative_destination(alternative_service_.host_port_pair()); |
+ HostPortPair alternative_destination( |
+ alternative_service_info_.host_port_pair()); |
ignore_result( |
ApplyHostMappingRules(request_info_.url, &alternative_destination)); |
- |
alternative_job_ = job_factory_->CreateAltSvcJob( |
this, ALTERNATIVE, session_, request_info_, priority_, proxy_info_, |
server_ssl_config_, proxy_ssl_config_, alternative_destination, |
- origin_url, alternative_service_.protocol, enable_ip_based_pooling_, |
- net_log_.net_log()); |
+ origin_url, alternative_service_info_.protocol(), quic_version, |
+ enable_ip_based_pooling_, net_log_.net_log()); |
main_job_is_blocked_ = true; |
alternative_job_->Start(request_->stream_type()); |
@@ -983,7 +988,7 @@ void HttpStreamFactoryImpl::JobController::OnAlternativeServiceJobFailed( |
int net_error) { |
DCHECK_EQ(alternative_job_->job_type(), ALTERNATIVE); |
DCHECK_NE(OK, net_error); |
- DCHECK_NE(kProtoUnknown, alternative_service_.protocol); |
+ DCHECK_NE(kProtoUnknown, alternative_service_info_.protocol()); |
alternative_job_net_error_ = net_error; |
@@ -1011,7 +1016,7 @@ void HttpStreamFactoryImpl::JobController::OnAlternativeProxyJobFailed( |
} |
void HttpStreamFactoryImpl::JobController::ReportBrokenAlternativeService() { |
- DCHECK(alternative_service_.protocol != kProtoUnknown); |
+ DCHECK(alternative_service_info_.protocol() != kProtoUnknown); |
DCHECK_NE(OK, alternative_job_net_error_); |
int error_to_report = alternative_job_net_error_; |
@@ -1027,7 +1032,7 @@ void HttpStreamFactoryImpl::JobController::ReportBrokenAlternativeService() { |
HistogramBrokenAlternateProtocolLocation( |
BROKEN_ALTERNATE_PROTOCOL_LOCATION_HTTP_STREAM_FACTORY_IMPL_JOB_ALT); |
session_->http_server_properties()->MarkAlternativeServiceBroken( |
- alternative_service_); |
+ alternative_service_info_.alternative_service()); |
} |
void HttpStreamFactoryImpl::JobController::MaybeNotifyFactoryOfCompletion() { |
@@ -1068,11 +1073,9 @@ HttpStreamFactoryImpl::JobController::GetAlternativeServiceInfoFor( |
AlternativeServiceInfo alternative_service_info = |
GetAlternativeServiceInfoInternal(request_info, delegate, stream_type); |
AlternativeServiceType type; |
- if (alternative_service_info.alternative_service().protocol == |
- kProtoUnknown) { |
+ if (alternative_service_info.protocol() == kProtoUnknown) { |
type = NO_ALTERNATIVE_SERVICE; |
- } else if (alternative_service_info.alternative_service().protocol == |
- kProtoQUIC) { |
+ } else if (alternative_service_info.protocol() == kProtoQUIC) { |
if (request_info.url.host_piece() == |
alternative_service_info.alternative_service().host) { |
type = QUIC_SAME_DESTINATION; |
@@ -1118,10 +1121,8 @@ HttpStreamFactoryImpl::JobController::GetAlternativeServiceInfoInternal( |
for (const AlternativeServiceInfo& alternative_service_info : |
alternative_service_info_vector) { |
- DCHECK(IsAlternateProtocolValid( |
- alternative_service_info.alternative_service().protocol)); |
- if (!quic_advertised && |
- alternative_service_info.alternative_service().protocol == kProtoQUIC) |
+ DCHECK(IsAlternateProtocolValid(alternative_service_info.protocol())); |
+ if (!quic_advertised && alternative_service_info.protocol() == kProtoQUIC) |
quic_advertised = true; |
if (http_server_properties.IsAlternativeServiceBroken( |
alternative_service_info.alternative_service())) { |
@@ -1142,20 +1143,17 @@ HttpStreamFactoryImpl::JobController::GetAlternativeServiceInfoInternal( |
origin.port() < kUnrestrictedPort)) |
continue; |
- if (alternative_service_info.alternative_service().protocol == |
- kProtoHTTP2) { |
+ if (alternative_service_info.protocol() == kProtoHTTP2) { |
if (!session_->params().enable_http2_alternative_service) |
continue; |
// Cache this entry if we don't have a non-broken Alt-Svc yet. |
- if (first_alternative_service_info.alternative_service().protocol == |
- kProtoUnknown) |
+ if (first_alternative_service_info.protocol() == kProtoUnknown) |
first_alternative_service_info = alternative_service_info; |
continue; |
} |
- DCHECK_EQ(kProtoQUIC, |
- alternative_service_info.alternative_service().protocol); |
+ DCHECK_EQ(kProtoQUIC, alternative_service_info.protocol()); |
quic_all_broken = false; |
if (!session_->IsQuicEnabled()) |
continue; |
@@ -1168,8 +1166,8 @@ HttpStreamFactoryImpl::JobController::GetAlternativeServiceInfoInternal( |
if (!original_url.SchemeIs(url::kHttpsScheme)) |
continue; |
- // If there is no QUIC version in the advertised versions supported by |
- // the net stack, ignore this entry. |
+ // If there is no QUIC version in the advertised versions that is |
+ // supported, ignore this entry. |
if (SelectQuicVersion(alternative_service_info.advertised_versions()) == |
QUIC_VERSION_UNSUPPORTED) |
continue; |
@@ -1179,18 +1177,15 @@ HttpStreamFactoryImpl::JobController::GetAlternativeServiceInfoInternal( |
ignore_result(ApplyHostMappingRules(original_url, &mapped_origin)); |
QuicServerId server_id(mapped_origin, request_info.privacy_mode); |
- HostPortPair destination( |
- alternative_service_info.alternative_service().host_port_pair()); |
+ HostPortPair destination(alternative_service_info.host_port_pair()); |
ignore_result(ApplyHostMappingRules(original_url, &destination)); |
if (session_->quic_stream_factory()->CanUseExistingSession(server_id, |
- destination)) { |
+ destination)) |
return alternative_service_info; |
- } |
// Cache this entry if we don't have a non-broken Alt-Svc yet. |
- if (first_alternative_service_info.alternative_service().protocol == |
- kProtoUnknown) |
+ if (first_alternative_service_info.protocol() == kProtoUnknown) |
first_alternative_service_info = alternative_service_info; |
} |