| 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 // The Job is forced to use QUIC without a designated version, try the |
| 214 // preferred QUIC version that is supported by default. |
| 215 if (quic_version_ == QUIC_VERSION_UNSUPPORTED && |
| 216 ShouldForceQuic(session, destination, origin_url, proxy_info)) { |
| 217 quic_version_ = session->params().quic_supported_versions[0]; |
| 218 } |
| 219 |
| 220 if (using_quic_) |
| 221 DCHECK_NE(quic_version_, QUIC_VERSION_UNSUPPORTED); |
| 222 |
| 211 DCHECK(session); | 223 DCHECK(session); |
| 212 if (alternative_protocol != kProtoUnknown) { | 224 if (alternative_protocol != kProtoUnknown) { |
| 213 // The job cannot have protocol requirements dictated by alternative service | 225 // The job cannot have protocol requirements dictated by alternative service |
| 214 // and have an alternative proxy server set at the same time, since | 226 // and have an alternative proxy server set at the same time, since |
| 215 // alternative services are used for requests that are fetched directly, | 227 // alternative services are used for requests that are fetched directly, |
| 216 // while the alternative proxy server is used for requests that should be | 228 // while the alternative proxy server is used for requests that should be |
| 217 // fetched using proxy. | 229 // fetched using proxy. |
| 218 DCHECK(!alternative_proxy_server_.is_valid()); | 230 DCHECK(!alternative_proxy_server_.is_valid()); |
| 219 // If the alternative service protocol is specified, then the job type must | 231 // If the alternative service protocol is specified, then the job type must |
| 220 // be either ALTERNATIVE or PRECONNECT. | 232 // be either ALTERNATIVE or PRECONNECT. |
| (...skipping 670 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 891 replacements.ClearRef(); | 903 replacements.ClearRef(); |
| 892 url = url.ReplaceComponents(replacements); | 904 url = url.ReplaceComponents(replacements); |
| 893 } else { | 905 } else { |
| 894 DCHECK(using_ssl_); | 906 DCHECK(using_ssl_); |
| 895 // The certificate of a QUIC alternative server is expected to be valid | 907 // 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 | 908 // for the origin of the request (in addition to being valid for the |
| 897 // server itself). | 909 // server itself). |
| 898 destination = destination_; | 910 destination = destination_; |
| 899 ssl_config = &server_ssl_config_; | 911 ssl_config = &server_ssl_config_; |
| 900 } | 912 } |
| 901 int rv = | 913 int rv = quic_request_.Request( |
| 902 quic_request_.Request(destination, request_info_.privacy_mode, | 914 destination, quic_version_, request_info_.privacy_mode, |
| 903 ssl_config->GetCertVerifyFlags(), url, | 915 ssl_config->GetCertVerifyFlags(), url, request_info_.method, net_log_, |
| 904 request_info_.method, net_log_, io_callback_); | 916 io_callback_); |
| 905 if (rv == OK) { | 917 if (rv == OK) { |
| 906 using_existing_quic_session_ = true; | 918 using_existing_quic_session_ = true; |
| 907 } else { | 919 } else { |
| 908 // There's no available QUIC session. Inform the delegate how long to | 920 // There's no available QUIC session. Inform the delegate how long to |
| 909 // delay the main job. | 921 // delay the main job. |
| 910 if (rv == ERR_IO_PENDING) { | 922 if (rv == ERR_IO_PENDING) { |
| 911 delegate_->MaybeSetWaitTimeForMainJob( | 923 delegate_->MaybeSetWaitTimeForMainJob( |
| 912 quic_request_.GetTimeDelayForWaitingJob()); | 924 quic_request_.GetTimeDelayForWaitingJob()); |
| 913 } | 925 } |
| 914 } | 926 } |
| (...skipping 544 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1459 const ProxyInfo& proxy_info, | 1471 const ProxyInfo& proxy_info, |
| 1460 const SSLConfig& server_ssl_config, | 1472 const SSLConfig& server_ssl_config, |
| 1461 const SSLConfig& proxy_ssl_config, | 1473 const SSLConfig& proxy_ssl_config, |
| 1462 HostPortPair destination, | 1474 HostPortPair destination, |
| 1463 GURL origin_url, | 1475 GURL origin_url, |
| 1464 bool enable_ip_based_pooling, | 1476 bool enable_ip_based_pooling, |
| 1465 NetLog* net_log) { | 1477 NetLog* net_log) { |
| 1466 return base::MakeUnique<HttpStreamFactoryImpl::Job>( | 1478 return base::MakeUnique<HttpStreamFactoryImpl::Job>( |
| 1467 delegate, job_type, session, request_info, priority, proxy_info, | 1479 delegate, job_type, session, request_info, priority, proxy_info, |
| 1468 server_ssl_config, proxy_ssl_config, destination, origin_url, | 1480 server_ssl_config, proxy_ssl_config, destination, origin_url, |
| 1469 kProtoUnknown, ProxyServer(), enable_ip_based_pooling, net_log); | 1481 kProtoUnknown, QUIC_VERSION_UNSUPPORTED, ProxyServer(), |
| 1482 enable_ip_based_pooling, net_log); |
| 1470 } | 1483 } |
| 1471 | 1484 |
| 1472 std::unique_ptr<HttpStreamFactoryImpl::Job> | 1485 std::unique_ptr<HttpStreamFactoryImpl::Job> |
| 1473 HttpStreamFactoryImpl::JobFactory::CreateAltSvcJob( | 1486 HttpStreamFactoryImpl::JobFactory::CreateAltSvcJob( |
| 1474 HttpStreamFactoryImpl::Job::Delegate* delegate, | 1487 HttpStreamFactoryImpl::Job::Delegate* delegate, |
| 1475 HttpStreamFactoryImpl::JobType job_type, | 1488 HttpStreamFactoryImpl::JobType job_type, |
| 1476 HttpNetworkSession* session, | 1489 HttpNetworkSession* session, |
| 1477 const HttpRequestInfo& request_info, | 1490 const HttpRequestInfo& request_info, |
| 1478 RequestPriority priority, | 1491 RequestPriority priority, |
| 1479 const ProxyInfo& proxy_info, | 1492 const ProxyInfo& proxy_info, |
| 1480 const SSLConfig& server_ssl_config, | 1493 const SSLConfig& server_ssl_config, |
| 1481 const SSLConfig& proxy_ssl_config, | 1494 const SSLConfig& proxy_ssl_config, |
| 1482 HostPortPair destination, | 1495 HostPortPair destination, |
| 1483 GURL origin_url, | 1496 GURL origin_url, |
| 1484 NextProto alternative_protocol, | 1497 NextProto alternative_protocol, |
| 1498 QuicVersion quic_version, |
| 1485 bool enable_ip_based_pooling, | 1499 bool enable_ip_based_pooling, |
| 1486 NetLog* net_log) { | 1500 NetLog* net_log) { |
| 1487 return base::MakeUnique<HttpStreamFactoryImpl::Job>( | 1501 return base::MakeUnique<HttpStreamFactoryImpl::Job>( |
| 1488 delegate, job_type, session, request_info, priority, proxy_info, | 1502 delegate, job_type, session, request_info, priority, proxy_info, |
| 1489 server_ssl_config, proxy_ssl_config, destination, origin_url, | 1503 server_ssl_config, proxy_ssl_config, destination, origin_url, |
| 1490 alternative_protocol, ProxyServer(), enable_ip_based_pooling, net_log); | 1504 alternative_protocol, quic_version, ProxyServer(), |
| 1505 enable_ip_based_pooling, net_log); |
| 1491 } | 1506 } |
| 1492 | 1507 |
| 1493 std::unique_ptr<HttpStreamFactoryImpl::Job> | 1508 std::unique_ptr<HttpStreamFactoryImpl::Job> |
| 1494 HttpStreamFactoryImpl::JobFactory::CreateAltProxyJob( | 1509 HttpStreamFactoryImpl::JobFactory::CreateAltProxyJob( |
| 1495 HttpStreamFactoryImpl::Job::Delegate* delegate, | 1510 HttpStreamFactoryImpl::Job::Delegate* delegate, |
| 1496 HttpStreamFactoryImpl::JobType job_type, | 1511 HttpStreamFactoryImpl::JobType job_type, |
| 1497 HttpNetworkSession* session, | 1512 HttpNetworkSession* session, |
| 1498 const HttpRequestInfo& request_info, | 1513 const HttpRequestInfo& request_info, |
| 1499 RequestPriority priority, | 1514 RequestPriority priority, |
| 1500 const ProxyInfo& proxy_info, | 1515 const ProxyInfo& proxy_info, |
| 1501 const SSLConfig& server_ssl_config, | 1516 const SSLConfig& server_ssl_config, |
| 1502 const SSLConfig& proxy_ssl_config, | 1517 const SSLConfig& proxy_ssl_config, |
| 1503 HostPortPair destination, | 1518 HostPortPair destination, |
| 1504 GURL origin_url, | 1519 GURL origin_url, |
| 1505 const ProxyServer& alternative_proxy_server, | 1520 const ProxyServer& alternative_proxy_server, |
| 1506 bool enable_ip_based_pooling, | 1521 bool enable_ip_based_pooling, |
| 1507 NetLog* net_log) { | 1522 NetLog* net_log) { |
| 1508 return base::MakeUnique<HttpStreamFactoryImpl::Job>( | 1523 return base::MakeUnique<HttpStreamFactoryImpl::Job>( |
| 1509 delegate, job_type, session, request_info, priority, proxy_info, | 1524 delegate, job_type, session, request_info, priority, proxy_info, |
| 1510 server_ssl_config, proxy_ssl_config, destination, origin_url, | 1525 server_ssl_config, proxy_ssl_config, destination, origin_url, |
| 1511 kProtoUnknown, alternative_proxy_server, enable_ip_based_pooling, | 1526 kProtoUnknown, QUIC_VERSION_UNSUPPORTED, alternative_proxy_server, |
| 1512 net_log); | 1527 enable_ip_based_pooling, net_log); |
| 1513 } | 1528 } |
| 1514 | 1529 |
| 1515 } // namespace net | 1530 } // namespace net |
| OLD | NEW |