OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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.h" | 5 #include "net/http/http_stream_factory_impl_job.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
118 UMA_HISTOGRAM_ENUMERATION("Net.TokenBinding.KeyMatch", match, KEY_MATCH_MAX); | 118 UMA_HISTOGRAM_ENUMERATION("Net.TokenBinding.KeyMatch", match, KEY_MATCH_MAX); |
119 } | 119 } |
120 | 120 |
121 } // namespace | 121 } // namespace |
122 | 122 |
123 // Returns parameters associated with the start of a HTTP stream job. | 123 // Returns parameters associated with the start of a HTTP stream job. |
124 std::unique_ptr<base::Value> NetLogHttpStreamJobCallback( | 124 std::unique_ptr<base::Value> NetLogHttpStreamJobCallback( |
125 const NetLogSource& source, | 125 const NetLogSource& source, |
126 const GURL* original_url, | 126 const GURL* original_url, |
127 const GURL* url, | 127 const GURL* url, |
128 const AlternativeService* alternative_service, | 128 const AlternativeServiceInfo* alternative_service_info, |
129 RequestPriority priority, | 129 RequestPriority priority, |
130 NetLogCaptureMode /* capture_mode */) { | 130 NetLogCaptureMode /* capture_mode */) { |
131 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 131 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
132 if (source.IsValid()) | 132 if (source.IsValid()) |
133 source.AddToEventParameters(dict.get()); | 133 source.AddToEventParameters(dict.get()); |
134 dict->SetString("original_url", original_url->GetOrigin().spec()); | 134 dict->SetString("original_url", original_url->GetOrigin().spec()); |
135 dict->SetString("url", url->GetOrigin().spec()); | 135 dict->SetString("url", url->GetOrigin().spec()); |
136 dict->SetString("alternative_service", alternative_service->ToString()); | 136 dict->SetString("alternative_service", |
| 137 alternative_service_info->alternative_service.ToString()); |
137 dict->SetString("priority", RequestPriorityToString(priority)); | 138 dict->SetString("priority", RequestPriorityToString(priority)); |
138 return std::move(dict); | 139 return std::move(dict); |
139 } | 140 } |
140 | 141 |
141 // Returns parameters associated with the Proto (with NPN negotiation) of a HTTP | 142 // Returns parameters associated with the Proto (with NPN negotiation) of a HTTP |
142 // stream. | 143 // stream. |
143 std::unique_ptr<base::Value> NetLogHttpStreamProtoCallback( | 144 std::unique_ptr<base::Value> NetLogHttpStreamProtoCallback( |
144 NextProto negotiated_protocol, | 145 NextProto negotiated_protocol, |
145 NetLogCaptureMode /* capture_mode */) { | 146 NetLogCaptureMode /* capture_mode */) { |
146 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 147 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
(...skipping 17 matching lines...) Expand all Loading... |
164 : Job(delegate, | 165 : Job(delegate, |
165 job_type, | 166 job_type, |
166 session, | 167 session, |
167 request_info, | 168 request_info, |
168 priority, | 169 priority, |
169 proxy_info, | 170 proxy_info, |
170 server_ssl_config, | 171 server_ssl_config, |
171 proxy_ssl_config, | 172 proxy_ssl_config, |
172 destination, | 173 destination, |
173 origin_url, | 174 origin_url, |
174 AlternativeService(), | 175 AlternativeServiceInfo(), |
175 ProxyServer(), | 176 ProxyServer(), |
176 enable_ip_based_pooling, | 177 enable_ip_based_pooling, |
177 net_log) {} | 178 net_log) {} |
178 | 179 |
179 HttpStreamFactoryImpl::Job::Job(Delegate* delegate, | 180 HttpStreamFactoryImpl::Job::Job( |
180 JobType job_type, | 181 Delegate* delegate, |
181 HttpNetworkSession* session, | 182 JobType job_type, |
182 const HttpRequestInfo& request_info, | 183 HttpNetworkSession* session, |
183 RequestPriority priority, | 184 const HttpRequestInfo& request_info, |
184 const ProxyInfo& proxy_info, | 185 RequestPriority priority, |
185 const SSLConfig& server_ssl_config, | 186 const ProxyInfo& proxy_info, |
186 const SSLConfig& proxy_ssl_config, | 187 const SSLConfig& server_ssl_config, |
187 HostPortPair destination, | 188 const SSLConfig& proxy_ssl_config, |
188 GURL origin_url, | 189 HostPortPair destination, |
189 AlternativeService alternative_service, | 190 GURL origin_url, |
190 const ProxyServer& alternative_proxy_server, | 191 const AlternativeServiceInfo& alternative_service_info, |
191 bool enable_ip_based_pooling, | 192 const ProxyServer& alternative_proxy_server, |
192 NetLog* net_log) | 193 bool enable_ip_based_pooling, |
| 194 NetLog* net_log) |
193 : request_info_(request_info), | 195 : request_info_(request_info), |
194 priority_(priority), | 196 priority_(priority), |
195 proxy_info_(proxy_info), | 197 proxy_info_(proxy_info), |
196 server_ssl_config_(server_ssl_config), | 198 server_ssl_config_(server_ssl_config), |
197 proxy_ssl_config_(proxy_ssl_config), | 199 proxy_ssl_config_(proxy_ssl_config), |
198 net_log_( | 200 net_log_( |
199 NetLogWithSource::Make(net_log, NetLogSourceType::HTTP_STREAM_JOB)), | 201 NetLogWithSource::Make(net_log, NetLogSourceType::HTTP_STREAM_JOB)), |
200 io_callback_(base::Bind(&Job::OnIOComplete, base::Unretained(this))), | 202 io_callback_(base::Bind(&Job::OnIOComplete, base::Unretained(this))), |
201 connection_(new ClientSocketHandle), | 203 connection_(new ClientSocketHandle), |
202 session_(session), | 204 session_(session), |
203 state_(STATE_NONE), | 205 state_(STATE_NONE), |
204 next_state_(STATE_NONE), | 206 next_state_(STATE_NONE), |
205 destination_(destination), | 207 destination_(destination), |
206 origin_url_(origin_url), | 208 origin_url_(origin_url), |
207 alternative_service_(alternative_service), | 209 alternative_service_info_(alternative_service_info), |
208 alternative_proxy_server_(alternative_proxy_server), | 210 alternative_proxy_server_(alternative_proxy_server), |
209 enable_ip_based_pooling_(enable_ip_based_pooling), | 211 enable_ip_based_pooling_(enable_ip_based_pooling), |
210 delegate_(delegate), | 212 delegate_(delegate), |
211 job_type_(job_type), | 213 job_type_(job_type), |
212 using_ssl_(origin_url_.SchemeIs(url::kHttpsScheme) || | 214 using_ssl_(origin_url_.SchemeIs(url::kHttpsScheme) || |
213 origin_url_.SchemeIs(url::kWssScheme)), | 215 origin_url_.SchemeIs(url::kWssScheme)), |
214 using_spdy_(false), | 216 using_spdy_(false), |
215 using_quic_(false), | 217 using_quic_(false), |
216 should_reconsider_proxy_(false), | 218 should_reconsider_proxy_(false), |
217 quic_request_(session_->quic_stream_factory()), | 219 quic_request_(session_->quic_stream_factory()), |
218 using_existing_quic_session_(false), | 220 using_existing_quic_session_(false), |
219 establishing_tunnel_(false), | 221 establishing_tunnel_(false), |
220 was_alpn_negotiated_(false), | 222 was_alpn_negotiated_(false), |
221 negotiated_protocol_(kProtoUnknown), | 223 negotiated_protocol_(kProtoUnknown), |
222 num_streams_(0), | 224 num_streams_(0), |
223 spdy_session_direct_(false), | 225 spdy_session_direct_(false), |
224 stream_type_(HttpStreamRequest::BIDIRECTIONAL_STREAM), | 226 stream_type_(HttpStreamRequest::BIDIRECTIONAL_STREAM), |
225 ptr_factory_(this) { | 227 ptr_factory_(this) { |
226 DCHECK(session); | 228 DCHECK(session); |
227 // The job can't have alternative service and alternative proxy server set at | 229 // The job can't have alternative service and alternative proxy server set at |
228 // the same time since alternative services are used for requests that are | 230 // the same time since alternative services are used for requests that are |
229 // fetched directly, while the alternative proxy server is used for requests | 231 // fetched directly, while the alternative proxy server is used for requests |
230 // that should be fetched using proxy. | 232 // that should be fetched using proxy. |
231 DCHECK(alternative_service_.protocol == kProtoUnknown || | 233 DCHECK(alternative_service_info_.alternative_service.protocol == |
| 234 kProtoUnknown || |
232 !alternative_proxy_server_.is_valid()); | 235 !alternative_proxy_server_.is_valid()); |
233 DCHECK(!alternative_proxy_server_.is_valid() || | 236 DCHECK(!alternative_proxy_server_.is_valid() || |
234 !(IsSpdyAlternative() || IsQuicAlternative())); | 237 !(IsSpdyAlternative() || IsQuicAlternative())); |
235 // If either the alternative service protocol is specified or if the | 238 // If either the alternative service protocol is specified or if the |
236 // alternative proxy server is valid, then the job type must be set to | 239 // alternative proxy server is valid, then the job type must be set to |
237 // either ALTERNATIVE or PRECONNECT. | 240 // either ALTERNATIVE or PRECONNECT. |
238 DCHECK((alternative_service_.protocol == kProtoUnknown && | 241 DCHECK((alternative_service_info_.alternative_service.protocol == |
| 242 kProtoUnknown && |
239 !alternative_proxy_server_.is_valid()) || | 243 !alternative_proxy_server_.is_valid()) || |
240 (job_type_ == ALTERNATIVE || job_type_ == PRECONNECT)); | 244 (job_type_ == ALTERNATIVE || job_type_ == PRECONNECT)); |
241 // If the alternative proxy server is valid, then the job type must be | 245 // If the alternative proxy server is valid, then the job type must be |
242 // set to ALTERNATIVE. | 246 // set to ALTERNATIVE. |
243 DCHECK(!alternative_proxy_server_.is_valid() || job_type_ == ALTERNATIVE); | 247 DCHECK(!alternative_proxy_server_.is_valid() || job_type_ == ALTERNATIVE); |
244 | 248 |
245 if (IsSpdyAlternative()) { | 249 if (IsSpdyAlternative()) { |
246 DCHECK(origin_url_.SchemeIs(url::kHttpsScheme)); | 250 DCHECK(origin_url_.SchemeIs(url::kHttpsScheme)); |
247 } | 251 } |
248 if (IsQuicAlternative()) { | 252 if (IsQuicAlternative()) { |
(...skipping 474 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
723 return ERR_IO_PENDING; | 727 return ERR_IO_PENDING; |
724 } | 728 } |
725 | 729 |
726 int HttpStreamFactoryImpl::Job::DoStart() { | 730 int HttpStreamFactoryImpl::Job::DoStart() { |
727 const NetLogWithSource* net_log = delegate_->GetNetLog(); | 731 const NetLogWithSource* net_log = delegate_->GetNetLog(); |
728 | 732 |
729 if (net_log) { | 733 if (net_log) { |
730 net_log_.BeginEvent( | 734 net_log_.BeginEvent( |
731 NetLogEventType::HTTP_STREAM_JOB, | 735 NetLogEventType::HTTP_STREAM_JOB, |
732 base::Bind(&NetLogHttpStreamJobCallback, net_log->source(), | 736 base::Bind(&NetLogHttpStreamJobCallback, net_log->source(), |
733 &request_info_.url, &origin_url_, &alternative_service_, | 737 &request_info_.url, &origin_url_, &alternative_service_info_, |
734 priority_)); | 738 priority_)); |
735 net_log->AddEvent(NetLogEventType::HTTP_STREAM_REQUEST_STARTED_JOB, | 739 net_log->AddEvent(NetLogEventType::HTTP_STREAM_REQUEST_STARTED_JOB, |
736 net_log_.source().ToEventParametersCallback()); | 740 net_log_.source().ToEventParametersCallback()); |
737 } | 741 } |
738 | 742 |
739 // Don't connect to restricted ports. | 743 // Don't connect to restricted ports. |
740 if (!IsPortAllowedForScheme(destination_.port(), | 744 if (!IsPortAllowedForScheme(destination_.port(), |
741 request_info_.url.scheme())) { | 745 request_info_.url.scheme())) { |
742 return ERR_UNSAFE_PORT; | 746 return ERR_UNSAFE_PORT; |
743 } | 747 } |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
851 replacements.ClearRef(); | 855 replacements.ClearRef(); |
852 url = url.ReplaceComponents(replacements); | 856 url = url.ReplaceComponents(replacements); |
853 } else { | 857 } else { |
854 DCHECK(using_ssl_); | 858 DCHECK(using_ssl_); |
855 // The certificate of a QUIC alternative server is expected to be valid | 859 // The certificate of a QUIC alternative server is expected to be valid |
856 // for the origin of the request (in addition to being valid for the | 860 // for the origin of the request (in addition to being valid for the |
857 // server itself). | 861 // server itself). |
858 destination = destination_; | 862 destination = destination_; |
859 ssl_config = &server_ssl_config_; | 863 ssl_config = &server_ssl_config_; |
860 } | 864 } |
861 int rv = | 865 QuicVersionVector advertised_versions; |
862 quic_request_.Request(destination, request_info_.privacy_mode, | 866 advertised_versions.push_back(QUIC_VERSION_37); |
863 ssl_config->GetCertVerifyFlags(), url, | 867 // TODO(zhongyi): change this to |
864 request_info_.method, net_log_, io_callback_); | 868 // alternative_service_info_.advertised_versions. |
| 869 |
| 870 int rv = quic_request_.Request( |
| 871 destination, advertised_versions, request_info_.privacy_mode, |
| 872 ssl_config->GetCertVerifyFlags(), url, request_info_.method, net_log_, |
| 873 io_callback_); |
865 if (rv == OK) { | 874 if (rv == OK) { |
866 using_existing_quic_session_ = true; | 875 using_existing_quic_session_ = true; |
867 } else { | 876 } else { |
868 // There's no available QUIC session. Inform the delegate how long to | 877 // There's no available QUIC session. Inform the delegate how long to |
869 // delay the main job. | 878 // delay the main job. |
870 if (rv == ERR_IO_PENDING) { | 879 if (rv == ERR_IO_PENDING) { |
871 delegate_->MaybeSetWaitTimeForMainJob( | 880 delegate_->MaybeSetWaitTimeForMainJob( |
872 quic_request_.GetTimeDelayForWaitingJob()); | 881 quic_request_.GetTimeDelayForWaitingJob()); |
873 } | 882 } |
874 } | 883 } |
(...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1283 // We currently only support Alternate-Protocol where the original scheme | 1292 // We currently only support Alternate-Protocol where the original scheme |
1284 // is http. | 1293 // is http. |
1285 // TODO(bnc): This comment is probably incorrect. | 1294 // TODO(bnc): This comment is probably incorrect. |
1286 DCHECK(origin_url_.SchemeIs(url::kHttpScheme)); | 1295 DCHECK(origin_url_.SchemeIs(url::kHttpScheme)); |
1287 return origin_url_.SchemeIs(url::kHttpScheme); | 1296 return origin_url_.SchemeIs(url::kHttpScheme); |
1288 } | 1297 } |
1289 return request_info_.url.SchemeIs(url::kHttpScheme); | 1298 return request_info_.url.SchemeIs(url::kHttpScheme); |
1290 } | 1299 } |
1291 | 1300 |
1292 bool HttpStreamFactoryImpl::Job::IsSpdyAlternative() const { | 1301 bool HttpStreamFactoryImpl::Job::IsSpdyAlternative() const { |
1293 return alternative_service_.protocol == kProtoHTTP2; | 1302 return alternative_service_info_.alternative_service.protocol == kProtoHTTP2; |
1294 } | 1303 } |
1295 | 1304 |
1296 bool HttpStreamFactoryImpl::Job::IsQuicAlternative() const { | 1305 bool HttpStreamFactoryImpl::Job::IsQuicAlternative() const { |
1297 return alternative_service_.protocol == kProtoQUIC; | 1306 return alternative_service_info_.alternative_service.protocol == kProtoQUIC; |
1298 } | 1307 } |
1299 | 1308 |
1300 void HttpStreamFactoryImpl::Job::InitSSLConfig(SSLConfig* ssl_config, | 1309 void HttpStreamFactoryImpl::Job::InitSSLConfig(SSLConfig* ssl_config, |
1301 bool is_proxy) const { | 1310 bool is_proxy) const { |
1302 if (!is_proxy) { | 1311 if (!is_proxy) { |
1303 // Prior to HTTP/2 and SPDY, some servers use TLS renegotiation to request | 1312 // Prior to HTTP/2 and SPDY, some servers use TLS renegotiation to request |
1304 // TLS client authentication after the HTTP request was sent. Allow | 1313 // TLS client authentication after the HTTP request was sent. Allow |
1305 // renegotiation for only those connections. | 1314 // renegotiation for only those connections. |
1306 // | 1315 // |
1307 // Note that this does NOT implement the provision in | 1316 // Note that this does NOT implement the provision in |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1472 HttpStreamFactoryImpl::Job::Delegate* delegate, | 1481 HttpStreamFactoryImpl::Job::Delegate* delegate, |
1473 HttpStreamFactoryImpl::JobType job_type, | 1482 HttpStreamFactoryImpl::JobType job_type, |
1474 HttpNetworkSession* session, | 1483 HttpNetworkSession* session, |
1475 const HttpRequestInfo& request_info, | 1484 const HttpRequestInfo& request_info, |
1476 RequestPriority priority, | 1485 RequestPriority priority, |
1477 const ProxyInfo& proxy_info, | 1486 const ProxyInfo& proxy_info, |
1478 const SSLConfig& server_ssl_config, | 1487 const SSLConfig& server_ssl_config, |
1479 const SSLConfig& proxy_ssl_config, | 1488 const SSLConfig& proxy_ssl_config, |
1480 HostPortPair destination, | 1489 HostPortPair destination, |
1481 GURL origin_url, | 1490 GURL origin_url, |
1482 AlternativeService alternative_service, | 1491 const AlternativeServiceInfo& alternative_service_info, |
1483 bool enable_ip_based_pooling, | 1492 bool enable_ip_based_pooling, |
1484 NetLog* net_log) { | 1493 NetLog* net_log) { |
1485 return base::MakeUnique<HttpStreamFactoryImpl::Job>( | 1494 return base::MakeUnique<HttpStreamFactoryImpl::Job>( |
1486 delegate, job_type, session, request_info, priority, proxy_info, | 1495 delegate, job_type, session, request_info, priority, proxy_info, |
1487 server_ssl_config, proxy_ssl_config, destination, origin_url, | 1496 server_ssl_config, proxy_ssl_config, destination, origin_url, |
1488 alternative_service, ProxyServer(), enable_ip_based_pooling, net_log); | 1497 alternative_service_info, ProxyServer(), enable_ip_based_pooling, |
| 1498 net_log); |
1489 } | 1499 } |
1490 | 1500 |
1491 std::unique_ptr<HttpStreamFactoryImpl::Job> | 1501 std::unique_ptr<HttpStreamFactoryImpl::Job> |
1492 HttpStreamFactoryImpl::JobFactory::CreateAltProxyJob( | 1502 HttpStreamFactoryImpl::JobFactory::CreateAltProxyJob( |
1493 HttpStreamFactoryImpl::Job::Delegate* delegate, | 1503 HttpStreamFactoryImpl::Job::Delegate* delegate, |
1494 HttpStreamFactoryImpl::JobType job_type, | 1504 HttpStreamFactoryImpl::JobType job_type, |
1495 HttpNetworkSession* session, | 1505 HttpNetworkSession* session, |
1496 const HttpRequestInfo& request_info, | 1506 const HttpRequestInfo& request_info, |
1497 RequestPriority priority, | 1507 RequestPriority priority, |
1498 const ProxyInfo& proxy_info, | 1508 const ProxyInfo& proxy_info, |
1499 const SSLConfig& server_ssl_config, | 1509 const SSLConfig& server_ssl_config, |
1500 const SSLConfig& proxy_ssl_config, | 1510 const SSLConfig& proxy_ssl_config, |
1501 HostPortPair destination, | 1511 HostPortPair destination, |
1502 GURL origin_url, | 1512 GURL origin_url, |
1503 const ProxyServer& alternative_proxy_server, | 1513 const ProxyServer& alternative_proxy_server, |
1504 bool enable_ip_based_pooling, | 1514 bool enable_ip_based_pooling, |
1505 NetLog* net_log) { | 1515 NetLog* net_log) { |
1506 return base::MakeUnique<HttpStreamFactoryImpl::Job>( | 1516 return base::MakeUnique<HttpStreamFactoryImpl::Job>( |
1507 delegate, job_type, session, request_info, priority, proxy_info, | 1517 delegate, job_type, session, request_info, priority, proxy_info, |
1508 server_ssl_config, proxy_ssl_config, destination, origin_url, | 1518 server_ssl_config, proxy_ssl_config, destination, origin_url, |
1509 AlternativeService(), alternative_proxy_server, enable_ip_based_pooling, | 1519 AlternativeServiceInfo(), alternative_proxy_server, |
1510 net_log); | 1520 enable_ip_based_pooling, net_log); |
1511 } | 1521 } |
1512 | 1522 |
1513 } // namespace net | 1523 } // namespace net |
OLD | NEW |