Chromium Code Reviews| 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 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 155 JobType job_type, | 155 JobType job_type, |
| 156 HttpNetworkSession* session, | 156 HttpNetworkSession* session, |
| 157 const HttpRequestInfo& request_info, | 157 const HttpRequestInfo& request_info, |
| 158 RequestPriority priority, | 158 RequestPriority priority, |
| 159 const ProxyInfo& proxy_info, | 159 const ProxyInfo& proxy_info, |
| 160 const SSLConfig& server_ssl_config, | 160 const SSLConfig& server_ssl_config, |
| 161 const SSLConfig& proxy_ssl_config, | 161 const SSLConfig& proxy_ssl_config, |
| 162 HostPortPair destination, | 162 HostPortPair destination, |
| 163 GURL origin_url, | 163 GURL origin_url, |
| 164 NextProto alternative_protocol, | 164 NextProto alternative_protocol, |
| 165 QuicVersion quic_version, | |
| 165 const ProxyServer& alternative_proxy_server, | 166 const ProxyServer& alternative_proxy_server, |
| 166 bool enable_ip_based_pooling, | 167 bool enable_ip_based_pooling, |
| 167 NetLog* net_log) | 168 NetLog* net_log) |
| 168 : request_info_(request_info), | 169 : request_info_(request_info), |
| 169 priority_(priority), | 170 priority_(priority), |
| 170 proxy_info_(proxy_info), | 171 proxy_info_(proxy_info), |
| 171 server_ssl_config_(server_ssl_config), | 172 server_ssl_config_(server_ssl_config), |
| 172 proxy_ssl_config_(proxy_ssl_config), | 173 proxy_ssl_config_(proxy_ssl_config), |
| 173 net_log_( | 174 net_log_( |
| 174 NetLogWithSource::Make(net_log, NetLogSourceType::HTTP_STREAM_JOB)), | 175 NetLogWithSource::Make(net_log, NetLogSourceType::HTTP_STREAM_JOB)), |
| 175 io_callback_(base::Bind(&Job::OnIOComplete, base::Unretained(this))), | 176 io_callback_(base::Bind(&Job::OnIOComplete, base::Unretained(this))), |
| 176 connection_(new ClientSocketHandle), | 177 connection_(new ClientSocketHandle), |
| 177 session_(session), | 178 session_(session), |
| 178 state_(STATE_NONE), | 179 state_(STATE_NONE), |
| 179 next_state_(STATE_NONE), | 180 next_state_(STATE_NONE), |
| 180 destination_(destination), | 181 destination_(destination), |
| 181 origin_url_(origin_url), | 182 origin_url_(origin_url), |
| 182 alternative_proxy_server_(alternative_proxy_server), | 183 alternative_proxy_server_(alternative_proxy_server), |
| 183 enable_ip_based_pooling_(enable_ip_based_pooling), | 184 enable_ip_based_pooling_(enable_ip_based_pooling), |
| 184 delegate_(delegate), | 185 delegate_(delegate), |
| 185 job_type_(job_type), | 186 job_type_(job_type), |
| 186 using_ssl_(origin_url_.SchemeIs(url::kHttpsScheme) || | 187 using_ssl_(origin_url_.SchemeIs(url::kHttpsScheme) || |
| 187 origin_url_.SchemeIs(url::kWssScheme)), | 188 origin_url_.SchemeIs(url::kWssScheme)), |
| 188 using_quic_( | 189 using_quic_( |
| 189 alternative_protocol == kProtoQUIC || | 190 alternative_protocol == kProtoQUIC || |
| 190 ShouldForceQuic(session, destination, origin_url, proxy_info)), | 191 ShouldForceQuic(session, destination, origin_url, proxy_info)), |
| 192 quic_version_(quic_version), | |
| 191 expect_spdy_(alternative_protocol == kProtoHTTP2 && !using_quic_), | 193 expect_spdy_(alternative_protocol == kProtoHTTP2 && !using_quic_), |
| 192 using_spdy_(false), | 194 using_spdy_(false), |
| 193 should_reconsider_proxy_(false), | 195 should_reconsider_proxy_(false), |
| 194 quic_request_(session_->quic_stream_factory()), | 196 quic_request_(session_->quic_stream_factory()), |
| 195 using_existing_quic_session_(false), | 197 using_existing_quic_session_(false), |
| 196 establishing_tunnel_(false), | 198 establishing_tunnel_(false), |
| 197 was_alpn_negotiated_(false), | 199 was_alpn_negotiated_(false), |
| 198 negotiated_protocol_(kProtoUnknown), | 200 negotiated_protocol_(kProtoUnknown), |
| 199 num_streams_(0), | 201 num_streams_(0), |
| 200 spdy_session_direct_( | 202 spdy_session_direct_( |
| 201 !(proxy_info.is_https() && origin_url_.SchemeIs(url::kHttpScheme))), | 203 !(proxy_info.is_https() && origin_url_.SchemeIs(url::kHttpScheme))), |
| 202 spdy_session_key_(using_quic_ | 204 spdy_session_key_(using_quic_ |
| 203 ? SpdySessionKey() | 205 ? SpdySessionKey() |
| 204 : GetSpdySessionKey(spdy_session_direct_, | 206 : GetSpdySessionKey(spdy_session_direct_, |
| 205 proxy_info_.proxy_server(), | 207 proxy_info_.proxy_server(), |
| 206 origin_url_, | 208 origin_url_, |
| 207 request_info_.privacy_mode)), | 209 request_info_.privacy_mode)), |
| 208 stream_type_(HttpStreamRequest::BIDIRECTIONAL_STREAM), | 210 stream_type_(HttpStreamRequest::BIDIRECTIONAL_STREAM), |
| 209 init_connection_already_resumed_(false), | 211 init_connection_already_resumed_(false), |
| 210 ptr_factory_(this) { | 212 ptr_factory_(this) { |
| 213 if (quic_version_ == QUIC_VERSION_UNSUPPORTED && | |
| 214 ShouldForceQuic(session, destination, origin_url, proxy_info)) | |
|
Ryan Hamilton
2017/07/06 13:27:45
Why does this only apply when "ShouldForceQuic" is
Zhongyi Shi
2017/07/06 18:13:39
When we create the Jobs in JobController, we pass
Ryan Hamilton
2017/07/06 19:00:04
(I guess an alternative would be to pass in suppor
Zhongyi Shi
2017/07/06 19:40:56
This could work. However, it might also be confusi
| |
| 215 quic_version_ = session->params().quic_supported_versions[0]; | |
|
Ryan Hamilton
2017/07/06 13:27:45
nit: {}s since the if predicate is more than one l
Zhongyi Shi
2017/07/06 18:13:40
Done.
| |
| 216 | |
| 211 DCHECK(session); | 217 DCHECK(session); |
| 212 if (alternative_protocol != kProtoUnknown) { | 218 if (alternative_protocol != kProtoUnknown) { |
| 213 // The job cannot have protocol requirements dictated by alternative service | 219 // The job cannot have protocol requirements dictated by alternative service |
| 214 // and have an alternative proxy server set at the same time, since | 220 // and have an alternative proxy server set at the same time, since |
| 215 // alternative services are used for requests that are fetched directly, | 221 // alternative services are used for requests that are fetched directly, |
| 216 // while the alternative proxy server is used for requests that should be | 222 // while the alternative proxy server is used for requests that should be |
| 217 // fetched using proxy. | 223 // fetched using proxy. |
| 218 DCHECK(!alternative_proxy_server_.is_valid()); | 224 DCHECK(!alternative_proxy_server_.is_valid()); |
| 219 // If the alternative service protocol is specified, then the job type must | 225 // If the alternative service protocol is specified, then the job type must |
| 220 // be either ALTERNATIVE or PRECONNECT. | 226 // be either ALTERNATIVE or PRECONNECT. |
| (...skipping 670 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 891 replacements.ClearRef(); | 897 replacements.ClearRef(); |
| 892 url = url.ReplaceComponents(replacements); | 898 url = url.ReplaceComponents(replacements); |
| 893 } else { | 899 } else { |
| 894 DCHECK(using_ssl_); | 900 DCHECK(using_ssl_); |
| 895 // The certificate of a QUIC alternative server is expected to be valid | 901 // The certificate of a QUIC alternative server is expected to be valid |
| 896 // for the origin of the request (in addition to being valid for the | 902 // for the origin of the request (in addition to being valid for the |
| 897 // server itself). | 903 // server itself). |
| 898 destination = destination_; | 904 destination = destination_; |
| 899 ssl_config = &server_ssl_config_; | 905 ssl_config = &server_ssl_config_; |
| 900 } | 906 } |
| 901 int rv = | 907 int rv = quic_request_.Request( |
| 902 quic_request_.Request(destination, request_info_.privacy_mode, | 908 destination, quic_version_, request_info_.privacy_mode, |
| 903 ssl_config->GetCertVerifyFlags(), url, | 909 ssl_config->GetCertVerifyFlags(), url, request_info_.method, net_log_, |
| 904 request_info_.method, net_log_, io_callback_); | 910 io_callback_); |
| 905 if (rv == OK) { | 911 if (rv == OK) { |
| 906 using_existing_quic_session_ = true; | 912 using_existing_quic_session_ = true; |
| 907 } else { | 913 } else { |
| 908 // There's no available QUIC session. Inform the delegate how long to | 914 // There's no available QUIC session. Inform the delegate how long to |
| 909 // delay the main job. | 915 // delay the main job. |
| 910 if (rv == ERR_IO_PENDING) { | 916 if (rv == ERR_IO_PENDING) { |
| 911 delegate_->MaybeSetWaitTimeForMainJob( | 917 delegate_->MaybeSetWaitTimeForMainJob( |
| 912 quic_request_.GetTimeDelayForWaitingJob()); | 918 quic_request_.GetTimeDelayForWaitingJob()); |
| 913 } | 919 } |
| 914 } | 920 } |
| (...skipping 545 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1460 const ProxyInfo& proxy_info, | 1466 const ProxyInfo& proxy_info, |
| 1461 const SSLConfig& server_ssl_config, | 1467 const SSLConfig& server_ssl_config, |
| 1462 const SSLConfig& proxy_ssl_config, | 1468 const SSLConfig& proxy_ssl_config, |
| 1463 HostPortPair destination, | 1469 HostPortPair destination, |
| 1464 GURL origin_url, | 1470 GURL origin_url, |
| 1465 bool enable_ip_based_pooling, | 1471 bool enable_ip_based_pooling, |
| 1466 NetLog* net_log) { | 1472 NetLog* net_log) { |
| 1467 return base::MakeUnique<HttpStreamFactoryImpl::Job>( | 1473 return base::MakeUnique<HttpStreamFactoryImpl::Job>( |
| 1468 delegate, job_type, session, request_info, priority, proxy_info, | 1474 delegate, job_type, session, request_info, priority, proxy_info, |
| 1469 server_ssl_config, proxy_ssl_config, destination, origin_url, | 1475 server_ssl_config, proxy_ssl_config, destination, origin_url, |
| 1470 kProtoUnknown, ProxyServer(), enable_ip_based_pooling, net_log); | 1476 kProtoUnknown, QUIC_VERSION_UNSUPPORTED, ProxyServer(), |
| 1477 enable_ip_based_pooling, net_log); | |
| 1471 } | 1478 } |
| 1472 | 1479 |
| 1473 std::unique_ptr<HttpStreamFactoryImpl::Job> | 1480 std::unique_ptr<HttpStreamFactoryImpl::Job> |
| 1474 HttpStreamFactoryImpl::JobFactory::CreateAltSvcJob( | 1481 HttpStreamFactoryImpl::JobFactory::CreateAltSvcJob( |
| 1475 HttpStreamFactoryImpl::Job::Delegate* delegate, | 1482 HttpStreamFactoryImpl::Job::Delegate* delegate, |
| 1476 HttpStreamFactoryImpl::JobType job_type, | 1483 HttpStreamFactoryImpl::JobType job_type, |
| 1477 HttpNetworkSession* session, | 1484 HttpNetworkSession* session, |
| 1478 const HttpRequestInfo& request_info, | 1485 const HttpRequestInfo& request_info, |
| 1479 RequestPriority priority, | 1486 RequestPriority priority, |
| 1480 const ProxyInfo& proxy_info, | 1487 const ProxyInfo& proxy_info, |
| 1481 const SSLConfig& server_ssl_config, | 1488 const SSLConfig& server_ssl_config, |
| 1482 const SSLConfig& proxy_ssl_config, | 1489 const SSLConfig& proxy_ssl_config, |
| 1483 HostPortPair destination, | 1490 HostPortPair destination, |
| 1484 GURL origin_url, | 1491 GURL origin_url, |
| 1485 NextProto alternative_protocol, | 1492 NextProto alternative_protocol, |
| 1493 QuicVersion quic_version, | |
| 1486 bool enable_ip_based_pooling, | 1494 bool enable_ip_based_pooling, |
| 1487 NetLog* net_log) { | 1495 NetLog* net_log) { |
| 1488 return base::MakeUnique<HttpStreamFactoryImpl::Job>( | 1496 return base::MakeUnique<HttpStreamFactoryImpl::Job>( |
| 1489 delegate, job_type, session, request_info, priority, proxy_info, | 1497 delegate, job_type, session, request_info, priority, proxy_info, |
| 1490 server_ssl_config, proxy_ssl_config, destination, origin_url, | 1498 server_ssl_config, proxy_ssl_config, destination, origin_url, |
| 1491 alternative_protocol, ProxyServer(), enable_ip_based_pooling, net_log); | 1499 alternative_protocol, quic_version, ProxyServer(), |
| 1500 enable_ip_based_pooling, net_log); | |
| 1492 } | 1501 } |
| 1493 | 1502 |
| 1494 std::unique_ptr<HttpStreamFactoryImpl::Job> | 1503 std::unique_ptr<HttpStreamFactoryImpl::Job> |
| 1495 HttpStreamFactoryImpl::JobFactory::CreateAltProxyJob( | 1504 HttpStreamFactoryImpl::JobFactory::CreateAltProxyJob( |
| 1496 HttpStreamFactoryImpl::Job::Delegate* delegate, | 1505 HttpStreamFactoryImpl::Job::Delegate* delegate, |
| 1497 HttpStreamFactoryImpl::JobType job_type, | 1506 HttpStreamFactoryImpl::JobType job_type, |
| 1498 HttpNetworkSession* session, | 1507 HttpNetworkSession* session, |
| 1499 const HttpRequestInfo& request_info, | 1508 const HttpRequestInfo& request_info, |
| 1500 RequestPriority priority, | 1509 RequestPriority priority, |
| 1501 const ProxyInfo& proxy_info, | 1510 const ProxyInfo& proxy_info, |
| 1502 const SSLConfig& server_ssl_config, | 1511 const SSLConfig& server_ssl_config, |
| 1503 const SSLConfig& proxy_ssl_config, | 1512 const SSLConfig& proxy_ssl_config, |
| 1504 HostPortPair destination, | 1513 HostPortPair destination, |
| 1505 GURL origin_url, | 1514 GURL origin_url, |
| 1506 const ProxyServer& alternative_proxy_server, | 1515 const ProxyServer& alternative_proxy_server, |
| 1507 bool enable_ip_based_pooling, | 1516 bool enable_ip_based_pooling, |
| 1508 NetLog* net_log) { | 1517 NetLog* net_log) { |
| 1509 return base::MakeUnique<HttpStreamFactoryImpl::Job>( | 1518 return base::MakeUnique<HttpStreamFactoryImpl::Job>( |
| 1510 delegate, job_type, session, request_info, priority, proxy_info, | 1519 delegate, job_type, session, request_info, priority, proxy_info, |
| 1511 server_ssl_config, proxy_ssl_config, destination, origin_url, | 1520 server_ssl_config, proxy_ssl_config, destination, origin_url, |
| 1512 kProtoUnknown, alternative_proxy_server, enable_ip_based_pooling, | 1521 kProtoUnknown, QUIC_VERSION_UNSUPPORTED, alternative_proxy_server, |
| 1513 net_log); | 1522 enable_ip_based_pooling, net_log); |
| 1514 } | 1523 } |
| 1515 | 1524 |
| 1516 } // namespace net | 1525 } // namespace net |
| OLD | NEW |