Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(542)

Side by Side Diff: net/http/http_stream_factory_impl_job_controller.cc

Issue 2958133002: Change QuicStreamRequest::Request() to take a preferred QuicVersion so that (Closed)
Patch Set: Add QuicStreamFactoryTest Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2016 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2016 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/http/http_stream_factory_impl_job_controller.h" 5 #include "net/http/http_stream_factory_impl_job_controller.h"
6 6
7 #include <string> 7 #include <string>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/memory/ptr_util.h" 10 #include "base/memory/ptr_util.h"
(...skipping 615 matching lines...) Expand 10 before | Expand all | Expand 10 after
626 CHECK(request_); 626 CHECK(request_);
627 session_->spdy_session_pool()->RemoveRequestFromSpdySessionRequestMap( 627 session_->spdy_session_pool()->RemoveRequestFromSpdySessionRequestMap(
628 request_); 628 request_);
629 } 629 }
630 630
631 const NetLogWithSource* HttpStreamFactoryImpl::JobController::GetNetLog() 631 const NetLogWithSource* HttpStreamFactoryImpl::JobController::GetNetLog()
632 const { 632 const {
633 return &net_log_; 633 return &net_log_;
634 } 634 }
635 635
636 const QuicVersionVector&
637 HttpStreamFactoryImpl::JobController::GetAdvertisedQuicVersions() const {
638 return alternative_service_info_.advertised_versions();
639 }
640
636 void HttpStreamFactoryImpl::JobController::MaybeSetWaitTimeForMainJob( 641 void HttpStreamFactoryImpl::JobController::MaybeSetWaitTimeForMainJob(
637 const base::TimeDelta& delay) { 642 const base::TimeDelta& delay) {
638 if (main_job_is_blocked_) { 643 if (main_job_is_blocked_) {
639 main_job_wait_time_ = std::min( 644 main_job_wait_time_ = std::min(
640 delay, base::TimeDelta::FromSeconds(kMaxDelayTimeForMainJobSecs)); 645 delay, base::TimeDelta::FromSeconds(kMaxDelayTimeForMainJobSecs));
641 } 646 }
642 } 647 }
643 648
644 bool HttpStreamFactoryImpl::JobController::HasPendingMainJob() const { 649 bool HttpStreamFactoryImpl::JobController::HasPendingMainJob() const {
645 return main_job_.get() != nullptr; 650 return main_job_.get() != nullptr;
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
763 } 768 }
764 769
765 int HttpStreamFactoryImpl::JobController::DoCreateJobs() { 770 int HttpStreamFactoryImpl::JobController::DoCreateJobs() {
766 DCHECK(!main_job_); 771 DCHECK(!main_job_);
767 DCHECK(!alternative_job_); 772 DCHECK(!alternative_job_);
768 773
769 HostPortPair destination(HostPortPair::FromURL(request_info_.url)); 774 HostPortPair destination(HostPortPair::FromURL(request_info_.url));
770 GURL origin_url = ApplyHostMappingRules(request_info_.url, &destination); 775 GURL origin_url = ApplyHostMappingRules(request_info_.url, &destination);
771 776
772 // Create an alternative job if alternative service is set up for this domain. 777 // Create an alternative job if alternative service is set up for this domain.
773 alternative_service_ = 778 alternative_service_info_ =
774 GetAlternativeServiceInfoFor(request_info_, delegate_, stream_type_) 779 GetAlternativeServiceInfoFor(request_info_, delegate_, stream_type_);
775 .alternative_service();
776 780
777 if (is_preconnect_) { 781 if (is_preconnect_) {
778 // Due to how the socket pools handle priorities and idle sockets, only IDLE 782 // Due to how the socket pools handle priorities and idle sockets, only IDLE
779 // priority currently makes sense for preconnects. The priority for 783 // priority currently makes sense for preconnects. The priority for
780 // preconnects is currently ignored (see RequestSocketsForPool()), but could 784 // preconnects is currently ignored (see RequestSocketsForPool()), but could
781 // be used at some point for proxy resolution or something. 785 // be used at some point for proxy resolution or something.
782 if (alternative_service_.protocol != kProtoUnknown) { 786 if (alternative_service_info_.protocol() != kProtoUnknown) {
783 HostPortPair alternative_destination( 787 HostPortPair alternative_destination(
784 alternative_service_.host_port_pair()); 788 alternative_service_info_.host_port_pair());
785 ignore_result( 789 ignore_result(
786 ApplyHostMappingRules(request_info_.url, &alternative_destination)); 790 ApplyHostMappingRules(request_info_.url, &alternative_destination));
787 main_job_ = job_factory_->CreateAltSvcJob( 791 main_job_ = job_factory_->CreateAltSvcJob(
788 this, PRECONNECT, session_, request_info_, IDLE, proxy_info_, 792 this, PRECONNECT, session_, request_info_, IDLE, proxy_info_,
789 server_ssl_config_, proxy_ssl_config_, alternative_destination, 793 server_ssl_config_, proxy_ssl_config_, alternative_destination,
790 origin_url, alternative_service_.protocol, enable_ip_based_pooling_, 794 origin_url, alternative_service_info_.protocol(),
791 session_->net_log()); 795 enable_ip_based_pooling_, session_->net_log());
792 } else { 796 } else {
793 main_job_ = job_factory_->CreateMainJob( 797 main_job_ = job_factory_->CreateMainJob(
794 this, PRECONNECT, session_, request_info_, IDLE, proxy_info_, 798 this, PRECONNECT, session_, request_info_, IDLE, proxy_info_,
795 server_ssl_config_, proxy_ssl_config_, destination, origin_url, 799 server_ssl_config_, proxy_ssl_config_, destination, origin_url,
796 enable_ip_based_pooling_, session_->net_log()); 800 enable_ip_based_pooling_, session_->net_log());
797 } 801 }
798 main_job_->Preconnect(num_streams_); 802 main_job_->Preconnect(num_streams_);
799 return OK; 803 return OK;
800 } 804 }
801 main_job_ = job_factory_->CreateMainJob( 805 main_job_ = job_factory_->CreateMainJob(
802 this, MAIN, session_, request_info_, priority_, proxy_info_, 806 this, MAIN, session_, request_info_, priority_, proxy_info_,
803 server_ssl_config_, proxy_ssl_config_, destination, origin_url, 807 server_ssl_config_, proxy_ssl_config_, destination, origin_url,
804 enable_ip_based_pooling_, net_log_.net_log()); 808 enable_ip_based_pooling_, net_log_.net_log());
805 // Alternative Service can only be set for HTTPS requests while Alternative 809 // Alternative Service can only be set for HTTPS requests while Alternative
806 // Proxy is set for HTTP requests. 810 // Proxy is set for HTTP requests.
807 if (alternative_service_.protocol != kProtoUnknown) { 811 if (alternative_service_info_.protocol() != kProtoUnknown) {
808 // Never share connection with other jobs for FTP requests. 812 // Never share connection with other jobs for FTP requests.
809 DVLOG(1) << "Selected alternative service (host: " 813 DVLOG(1) << "Selected alternative service (host: "
810 << alternative_service_.host_port_pair().host() 814 << alternative_service_info_.host_port_pair().host()
811 << " port: " << alternative_service_.host_port_pair().port() 815 << " port: " << alternative_service_info_.host_port_pair().port()
812 << ")"; 816 << ")";
813 817
814 DCHECK(!request_info_.url.SchemeIs(url::kFtpScheme)); 818 DCHECK(!request_info_.url.SchemeIs(url::kFtpScheme));
815 HostPortPair alternative_destination(alternative_service_.host_port_pair()); 819 HostPortPair alternative_destination(
820 alternative_service_info_.host_port_pair());
816 ignore_result( 821 ignore_result(
817 ApplyHostMappingRules(request_info_.url, &alternative_destination)); 822 ApplyHostMappingRules(request_info_.url, &alternative_destination));
818 823
819 alternative_job_ = job_factory_->CreateAltSvcJob( 824 alternative_job_ = job_factory_->CreateAltSvcJob(
820 this, ALTERNATIVE, session_, request_info_, priority_, proxy_info_, 825 this, ALTERNATIVE, session_, request_info_, priority_, proxy_info_,
821 server_ssl_config_, proxy_ssl_config_, alternative_destination, 826 server_ssl_config_, proxy_ssl_config_, alternative_destination,
822 origin_url, alternative_service_.protocol, enable_ip_based_pooling_, 827 origin_url, alternative_service_info_.protocol(),
Ryan Hamilton 2017/06/28 18:53:14 Since we're already passing in some of the Alterna
Zhongyi Shi 2017/07/05 23:08:59 Done. Changed to only pass the selected QUIC versi
823 net_log_.net_log()); 828 enable_ip_based_pooling_, net_log_.net_log());
824 829
825 main_job_is_blocked_ = true; 830 main_job_is_blocked_ = true;
826 alternative_job_->Start(request_->stream_type()); 831 alternative_job_->Start(request_->stream_type());
827 } else { 832 } else {
828 ProxyServer alternative_proxy_server; 833 ProxyServer alternative_proxy_server;
829 if (ShouldCreateAlternativeProxyServerJob(proxy_info_, request_info_.url, 834 if (ShouldCreateAlternativeProxyServerJob(proxy_info_, request_info_.url,
830 &alternative_proxy_server)) { 835 &alternative_proxy_server)) {
831 DCHECK(!main_job_is_blocked_); 836 DCHECK(!main_job_is_blocked_);
832 ProxyInfo alternative_proxy_info; 837 ProxyInfo alternative_proxy_info;
833 alternative_proxy_info.UseProxyServer(alternative_proxy_server); 838 alternative_proxy_info.UseProxyServer(alternative_proxy_server);
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
941 NextProto negotiated_protocol, 946 NextProto negotiated_protocol,
942 bool using_spdy) { 947 bool using_spdy) {
943 if (request_) 948 if (request_)
944 request_->Complete(was_alpn_negotiated, negotiated_protocol, using_spdy); 949 request_->Complete(was_alpn_negotiated, negotiated_protocol, using_spdy);
945 } 950 }
946 951
947 void HttpStreamFactoryImpl::JobController::OnAlternativeServiceJobFailed( 952 void HttpStreamFactoryImpl::JobController::OnAlternativeServiceJobFailed(
948 int net_error) { 953 int net_error) {
949 DCHECK_EQ(alternative_job_->job_type(), ALTERNATIVE); 954 DCHECK_EQ(alternative_job_->job_type(), ALTERNATIVE);
950 DCHECK_NE(OK, net_error); 955 DCHECK_NE(OK, net_error);
951 DCHECK_NE(kProtoUnknown, alternative_service_.protocol); 956 DCHECK_NE(kProtoUnknown, alternative_service_info_.protocol());
952 957
953 alternative_job_net_error_ = net_error; 958 alternative_job_net_error_ = net_error;
954 959
955 if (IsJobOrphaned(alternative_job_.get())) { 960 if (IsJobOrphaned(alternative_job_.get())) {
956 // If |request_| is gone then it must have been successfully served by 961 // If |request_| is gone then it must have been successfully served by
957 // |main_job_|. 962 // |main_job_|.
958 // If |request_| is bound to a different job, then it is being 963 // If |request_| is bound to a different job, then it is being
959 // successfully serverd by the main job. 964 // successfully serverd by the main job.
960 ReportBrokenAlternativeService(); 965 ReportBrokenAlternativeService();
961 } 966 }
962 } 967 }
963 968
964 void HttpStreamFactoryImpl::JobController::OnAlternativeProxyJobFailed( 969 void HttpStreamFactoryImpl::JobController::OnAlternativeProxyJobFailed(
965 int net_error) { 970 int net_error) {
966 DCHECK_EQ(alternative_job_->job_type(), ALTERNATIVE); 971 DCHECK_EQ(alternative_job_->job_type(), ALTERNATIVE);
967 DCHECK_NE(OK, net_error); 972 DCHECK_NE(OK, net_error);
968 DCHECK(alternative_job_->alternative_proxy_server().is_valid()); 973 DCHECK(alternative_job_->alternative_proxy_server().is_valid());
969 974
970 // Need to mark alt proxy as broken regardless whether the job is bound. 975 // Need to mark alt proxy as broken regardless whether the job is bound.
971 ProxyDelegate* proxy_delegate = session_->context().proxy_delegate; 976 ProxyDelegate* proxy_delegate = session_->context().proxy_delegate;
972 if (proxy_delegate) { 977 if (proxy_delegate) {
973 proxy_delegate->OnAlternativeProxyBroken( 978 proxy_delegate->OnAlternativeProxyBroken(
974 alternative_job_->alternative_proxy_server()); 979 alternative_job_->alternative_proxy_server());
975 } 980 }
976 } 981 }
977 982
978 void HttpStreamFactoryImpl::JobController::ReportBrokenAlternativeService() { 983 void HttpStreamFactoryImpl::JobController::ReportBrokenAlternativeService() {
979 DCHECK(alternative_service_.protocol != kProtoUnknown); 984 DCHECK(alternative_service_info_.protocol() != kProtoUnknown);
980 DCHECK_NE(OK, alternative_job_net_error_); 985 DCHECK_NE(OK, alternative_job_net_error_);
981 986
982 int error_to_report = alternative_job_net_error_; 987 int error_to_report = alternative_job_net_error_;
983 alternative_job_net_error_ = OK; 988 alternative_job_net_error_ = OK;
984 UMA_HISTOGRAM_SPARSE_SLOWLY("Net.AlternateServiceFailed", -error_to_report); 989 UMA_HISTOGRAM_SPARSE_SLOWLY("Net.AlternateServiceFailed", -error_to_report);
985 990
986 if (error_to_report == ERR_NETWORK_CHANGED || 991 if (error_to_report == ERR_NETWORK_CHANGED ||
987 error_to_report == ERR_INTERNET_DISCONNECTED) { 992 error_to_report == ERR_INTERNET_DISCONNECTED) {
988 // No need to mark alternative service or proxy as broken. 993 // No need to mark alternative service or proxy as broken.
989 return; 994 return;
990 } 995 }
991 996
992 HistogramBrokenAlternateProtocolLocation( 997 HistogramBrokenAlternateProtocolLocation(
993 BROKEN_ALTERNATE_PROTOCOL_LOCATION_HTTP_STREAM_FACTORY_IMPL_JOB_ALT); 998 BROKEN_ALTERNATE_PROTOCOL_LOCATION_HTTP_STREAM_FACTORY_IMPL_JOB_ALT);
994 session_->http_server_properties()->MarkAlternativeServiceBroken( 999 session_->http_server_properties()->MarkAlternativeServiceBroken(
995 alternative_service_); 1000 alternative_service_info_.alternative_service());
996 } 1001 }
997 1002
998 void HttpStreamFactoryImpl::JobController::MaybeNotifyFactoryOfCompletion() { 1003 void HttpStreamFactoryImpl::JobController::MaybeNotifyFactoryOfCompletion() {
999 if (!request_ && !main_job_ && !alternative_job_) { 1004 if (!request_ && !main_job_ && !alternative_job_) {
1000 DCHECK(!bound_job_); 1005 DCHECK(!bound_job_);
1001 factory_->OnJobControllerComplete(this); 1006 factory_->OnJobControllerComplete(this);
1002 } 1007 }
1003 } 1008 }
1004 1009
1005 void HttpStreamFactoryImpl::JobController::NotifyRequestFailed(int rv) { 1010 void HttpStreamFactoryImpl::JobController::NotifyRequestFailed(int rv) {
(...skipping 20 matching lines...) Expand all
1026 HttpStreamFactoryImpl::JobController::GetAlternativeServiceInfoFor( 1031 HttpStreamFactoryImpl::JobController::GetAlternativeServiceInfoFor(
1027 const HttpRequestInfo& request_info, 1032 const HttpRequestInfo& request_info,
1028 HttpStreamRequest::Delegate* delegate, 1033 HttpStreamRequest::Delegate* delegate,
1029 HttpStreamRequest::StreamType stream_type) { 1034 HttpStreamRequest::StreamType stream_type) {
1030 if (!enable_alternative_services_) 1035 if (!enable_alternative_services_)
1031 return AlternativeServiceInfo(); 1036 return AlternativeServiceInfo();
1032 1037
1033 AlternativeServiceInfo alternative_service_info = 1038 AlternativeServiceInfo alternative_service_info =
1034 GetAlternativeServiceInfoInternal(request_info, delegate, stream_type); 1039 GetAlternativeServiceInfoInternal(request_info, delegate, stream_type);
1035 AlternativeServiceType type; 1040 AlternativeServiceType type;
1036 if (alternative_service_info.alternative_service().protocol == 1041 if (alternative_service_info.protocol() == kProtoUnknown) {
1037 kProtoUnknown) {
1038 type = NO_ALTERNATIVE_SERVICE; 1042 type = NO_ALTERNATIVE_SERVICE;
1039 } else if (alternative_service_info.alternative_service().protocol == 1043 } else if (alternative_service_info.protocol() == kProtoQUIC) {
1040 kProtoQUIC) {
1041 if (request_info.url.host_piece() == 1044 if (request_info.url.host_piece() ==
1042 alternative_service_info.alternative_service().host) { 1045 alternative_service_info.alternative_service().host) {
1043 type = QUIC_SAME_DESTINATION; 1046 type = QUIC_SAME_DESTINATION;
1044 } else { 1047 } else {
1045 type = QUIC_DIFFERENT_DESTINATION; 1048 type = QUIC_DIFFERENT_DESTINATION;
1046 } 1049 }
1047 } else { 1050 } else {
1048 if (request_info.url.host_piece() == 1051 if (request_info.url.host_piece() ==
1049 alternative_service_info.alternative_service().host) { 1052 alternative_service_info.alternative_service().host) {
1050 type = NOT_QUIC_SAME_DESTINATION; 1053 type = NOT_QUIC_SAME_DESTINATION;
(...skipping 25 matching lines...) Expand all
1076 return AlternativeServiceInfo(); 1079 return AlternativeServiceInfo();
1077 1080
1078 bool quic_advertised = false; 1081 bool quic_advertised = false;
1079 bool quic_all_broken = true; 1082 bool quic_all_broken = true;
1080 1083
1081 // First alternative service that is not marked as broken. 1084 // First alternative service that is not marked as broken.
1082 AlternativeServiceInfo first_alternative_service_info; 1085 AlternativeServiceInfo first_alternative_service_info;
1083 1086
1084 for (const AlternativeServiceInfo& alternative_service_info : 1087 for (const AlternativeServiceInfo& alternative_service_info :
1085 alternative_service_info_vector) { 1088 alternative_service_info_vector) {
1086 DCHECK(IsAlternateProtocolValid( 1089 DCHECK(IsAlternateProtocolValid(alternative_service_info.protocol()));
1087 alternative_service_info.alternative_service().protocol)); 1090 if (!quic_advertised && alternative_service_info.protocol() == kProtoQUIC)
1088 if (!quic_advertised &&
1089 alternative_service_info.alternative_service().protocol == kProtoQUIC)
1090 quic_advertised = true; 1091 quic_advertised = true;
1091 if (http_server_properties.IsAlternativeServiceBroken( 1092 if (http_server_properties.IsAlternativeServiceBroken(
1092 alternative_service_info.alternative_service())) { 1093 alternative_service_info.alternative_service())) {
1093 HistogramAlternateProtocolUsage(ALTERNATE_PROTOCOL_USAGE_BROKEN, false); 1094 HistogramAlternateProtocolUsage(ALTERNATE_PROTOCOL_USAGE_BROKEN, false);
1094 continue; 1095 continue;
1095 } 1096 }
1096 1097
1097 // Some shared unix systems may have user home directories (like 1098 // Some shared unix systems may have user home directories (like
1098 // http://foo.com/~mike) which allow users to emit headers. This is a bad 1099 // http://foo.com/~mike) which allow users to emit headers. This is a bad
1099 // idea already, but with Alternate-Protocol, it provides the ability for a 1100 // idea already, but with Alternate-Protocol, it provides the ability for a
1100 // single user on a multi-user system to hijack the alternate protocol. 1101 // single user on a multi-user system to hijack the alternate protocol.
1101 // These systems also enforce ports <1024 as restricted ports. So don't 1102 // These systems also enforce ports <1024 as restricted ports. So don't
1102 // allow protocol upgrades to user-controllable ports. 1103 // allow protocol upgrades to user-controllable ports.
1103 const int kUnrestrictedPort = 1024; 1104 const int kUnrestrictedPort = 1024;
1104 if (!session_->params().enable_user_alternate_protocol_ports && 1105 if (!session_->params().enable_user_alternate_protocol_ports &&
1105 (alternative_service_info.alternative_service().port >= 1106 (alternative_service_info.alternative_service().port >=
1106 kUnrestrictedPort && 1107 kUnrestrictedPort &&
1107 origin.port() < kUnrestrictedPort)) 1108 origin.port() < kUnrestrictedPort))
1108 continue; 1109 continue;
1109 1110
1110 if (alternative_service_info.alternative_service().protocol == 1111 if (alternative_service_info.protocol() == kProtoHTTP2) {
1111 kProtoHTTP2) {
1112 if (!session_->params().enable_http2_alternative_service) 1112 if (!session_->params().enable_http2_alternative_service)
1113 continue; 1113 continue;
1114 1114
1115 // Cache this entry if we don't have a non-broken Alt-Svc yet. 1115 // Cache this entry if we don't have a non-broken Alt-Svc yet.
1116 if (first_alternative_service_info.alternative_service().protocol == 1116 if (first_alternative_service_info.protocol() == kProtoUnknown)
1117 kProtoUnknown)
1118 first_alternative_service_info = alternative_service_info; 1117 first_alternative_service_info = alternative_service_info;
1119 continue; 1118 continue;
1120 } 1119 }
1121 1120
1122 DCHECK_EQ(kProtoQUIC, 1121 DCHECK_EQ(kProtoQUIC, alternative_service_info.protocol());
1123 alternative_service_info.alternative_service().protocol);
1124 quic_all_broken = false; 1122 quic_all_broken = false;
1125 if (!session_->IsQuicEnabled()) 1123 if (!session_->IsQuicEnabled())
1126 continue; 1124 continue;
1127 1125
1128 if (stream_type == HttpStreamRequest::BIDIRECTIONAL_STREAM && 1126 if (stream_type == HttpStreamRequest::BIDIRECTIONAL_STREAM &&
1129 session_->params().quic_disable_bidirectional_streams) { 1127 session_->params().quic_disable_bidirectional_streams) {
1130 continue; 1128 continue;
1131 } 1129 }
1132 1130
1133 if (!original_url.SchemeIs(url::kHttpsScheme)) 1131 if (!original_url.SchemeIs(url::kHttpsScheme))
1134 continue; 1132 continue;
1135 1133
1136 // Check whether there is an existing QUIC session to use for this origin. 1134 // Check whether there is an existing QUIC session to use for this origin.
1137 HostPortPair mapped_origin(origin.host(), origin.port()); 1135 HostPortPair mapped_origin(origin.host(), origin.port());
1138 ignore_result(ApplyHostMappingRules(original_url, &mapped_origin)); 1136 ignore_result(ApplyHostMappingRules(original_url, &mapped_origin));
1139 QuicServerId server_id(mapped_origin, request_info.privacy_mode); 1137 QuicServerId server_id(mapped_origin, request_info.privacy_mode);
1140 1138
1141 HostPortPair destination( 1139 HostPortPair destination(alternative_service_info.host_port_pair());
1142 alternative_service_info.alternative_service().host_port_pair());
1143 ignore_result(ApplyHostMappingRules(original_url, &destination)); 1140 ignore_result(ApplyHostMappingRules(original_url, &destination));
1144 1141
1145 if (session_->quic_stream_factory()->CanUseExistingSession(server_id, 1142 if (session_->quic_stream_factory()->CanUseExistingSession(server_id,
1146 destination)) { 1143 destination)) {
1147 return alternative_service_info; 1144 return alternative_service_info;
1148 } 1145 }
1149 1146
1150 // Cache this entry if we don't have a non-broken Alt-Svc yet. 1147 // Cache this entry if we don't have a non-broken Alt-Svc yet.
1151 if (first_alternative_service_info.alternative_service().protocol == 1148 if (first_alternative_service_info.protocol() == kProtoUnknown)
1152 kProtoUnknown)
1153 first_alternative_service_info = alternative_service_info; 1149 first_alternative_service_info = alternative_service_info;
1154 } 1150 }
1155 1151
1156 // Ask delegate to mark QUIC as broken for the origin. 1152 // Ask delegate to mark QUIC as broken for the origin.
1157 if (quic_advertised && quic_all_broken && delegate != nullptr) 1153 if (quic_advertised && quic_all_broken && delegate != nullptr)
1158 delegate->OnQuicBroken(); 1154 delegate->OnQuicBroken();
1159 1155
1160 return first_alternative_service_info; 1156 return first_alternative_service_info;
1161 } 1157 }
1162 1158
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
1286 // If ReconsiderProxyAfterError() failed synchronously, it means 1282 // If ReconsiderProxyAfterError() failed synchronously, it means
1287 // there was nothing left to fall-back to, so fail the transaction 1283 // there was nothing left to fall-back to, so fail the transaction
1288 // with the last connection error we got. 1284 // with the last connection error we got.
1289 // TODO(eroman): This is a confusing contract, make it more obvious. 1285 // TODO(eroman): This is a confusing contract, make it more obvious.
1290 rv = error; 1286 rv = error;
1291 } 1287 }
1292 return rv; 1288 return rv;
1293 } 1289 }
1294 1290
1295 } // namespace net 1291 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698