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 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 163 | 163 |
| 164 HttpStreamFactoryImpl::Job::Job(Delegate* delegate, | 164 HttpStreamFactoryImpl::Job::Job(Delegate* delegate, |
| 165 JobType job_type, | 165 JobType job_type, |
| 166 HttpNetworkSession* session, | 166 HttpNetworkSession* session, |
| 167 const HttpRequestInfo& request_info, | 167 const HttpRequestInfo& request_info, |
| 168 RequestPriority priority, | 168 RequestPriority priority, |
| 169 const SSLConfig& server_ssl_config, | 169 const SSLConfig& server_ssl_config, |
| 170 const SSLConfig& proxy_ssl_config, | 170 const SSLConfig& proxy_ssl_config, |
| 171 HostPortPair destination, | 171 HostPortPair destination, |
| 172 GURL origin_url, | 172 GURL origin_url, |
| 173 bool enable_ip_based_pooling, | |
| 173 NetLog* net_log) | 174 NetLog* net_log) |
| 174 : Job(delegate, | 175 : Job(delegate, |
| 175 job_type, | 176 job_type, |
| 176 session, | 177 session, |
| 177 request_info, | 178 request_info, |
| 178 priority, | 179 priority, |
| 179 server_ssl_config, | 180 server_ssl_config, |
| 180 proxy_ssl_config, | 181 proxy_ssl_config, |
| 181 destination, | 182 destination, |
| 182 origin_url, | 183 origin_url, |
| 183 AlternativeService(), | 184 AlternativeService(), |
| 184 ProxyServer(), | 185 ProxyServer(), |
| 186 enable_ip_based_pooling, | |
| 185 net_log) {} | 187 net_log) {} |
| 186 | 188 |
| 187 HttpStreamFactoryImpl::Job::Job(Delegate* delegate, | 189 HttpStreamFactoryImpl::Job::Job(Delegate* delegate, |
| 188 JobType job_type, | 190 JobType job_type, |
| 189 HttpNetworkSession* session, | 191 HttpNetworkSession* session, |
| 190 const HttpRequestInfo& request_info, | 192 const HttpRequestInfo& request_info, |
| 191 RequestPriority priority, | 193 RequestPriority priority, |
| 192 const SSLConfig& server_ssl_config, | 194 const SSLConfig& server_ssl_config, |
| 193 const SSLConfig& proxy_ssl_config, | 195 const SSLConfig& proxy_ssl_config, |
| 194 HostPortPair destination, | 196 HostPortPair destination, |
| 195 GURL origin_url, | 197 GURL origin_url, |
| 196 AlternativeService alternative_service, | 198 AlternativeService alternative_service, |
| 197 const ProxyServer& alternative_proxy_server, | 199 const ProxyServer& alternative_proxy_server, |
| 200 bool enable_ip_based_pooling, | |
| 198 NetLog* net_log) | 201 NetLog* net_log) |
| 199 : request_info_(request_info), | 202 : request_info_(request_info), |
| 200 priority_(priority), | 203 priority_(priority), |
| 201 server_ssl_config_(server_ssl_config), | 204 server_ssl_config_(server_ssl_config), |
| 202 proxy_ssl_config_(proxy_ssl_config), | 205 proxy_ssl_config_(proxy_ssl_config), |
| 203 net_log_( | 206 net_log_( |
| 204 NetLogWithSource::Make(net_log, NetLogSourceType::HTTP_STREAM_JOB)), | 207 NetLogWithSource::Make(net_log, NetLogSourceType::HTTP_STREAM_JOB)), |
| 205 io_callback_(base::Bind(&Job::OnIOComplete, base::Unretained(this))), | 208 io_callback_(base::Bind(&Job::OnIOComplete, base::Unretained(this))), |
| 206 connection_(new ClientSocketHandle), | 209 connection_(new ClientSocketHandle), |
| 207 session_(session), | 210 session_(session), |
| 208 next_state_(STATE_NONE), | 211 next_state_(STATE_NONE), |
| 209 pac_request_(NULL), | 212 pac_request_(NULL), |
| 210 destination_(destination), | 213 destination_(destination), |
| 211 origin_url_(origin_url), | 214 origin_url_(origin_url), |
| 212 alternative_service_(alternative_service), | 215 alternative_service_(alternative_service), |
| 213 alternative_proxy_server_(alternative_proxy_server), | 216 alternative_proxy_server_(alternative_proxy_server), |
| 217 enable_ip_based_pooling_(enable_ip_based_pooling), | |
| 214 delegate_(delegate), | 218 delegate_(delegate), |
| 215 job_type_(job_type), | 219 job_type_(job_type), |
| 216 using_ssl_(false), | 220 using_ssl_(false), |
| 217 using_spdy_(false), | 221 using_spdy_(false), |
| 218 using_quic_(false), | 222 using_quic_(false), |
| 219 quic_request_(session_->quic_stream_factory()), | 223 quic_request_(session_->quic_stream_factory()), |
| 220 using_existing_quic_session_(false), | 224 using_existing_quic_session_(false), |
| 221 establishing_tunnel_(false), | 225 establishing_tunnel_(false), |
| 222 was_alpn_negotiated_(false), | 226 was_alpn_negotiated_(false), |
| 223 negotiated_protocol_(kProtoUnknown), | 227 negotiated_protocol_(kProtoUnknown), |
| (...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 529 } | 533 } |
| 530 delegate_->OnPreconnectsComplete(this); | 534 delegate_->OnPreconnectsComplete(this); |
| 531 // |this| may be deleted after this call. | 535 // |this| may be deleted after this call. |
| 532 } | 536 } |
| 533 | 537 |
| 534 // static | 538 // static |
| 535 int HttpStreamFactoryImpl::Job::OnHostResolution( | 539 int HttpStreamFactoryImpl::Job::OnHostResolution( |
| 536 SpdySessionPool* spdy_session_pool, | 540 SpdySessionPool* spdy_session_pool, |
| 537 const SpdySessionKey& spdy_session_key, | 541 const SpdySessionKey& spdy_session_key, |
| 538 const GURL& origin_url, | 542 const GURL& origin_url, |
| 543 bool enable_ip_based_pooling, | |
| 539 const AddressList& addresses, | 544 const AddressList& addresses, |
| 540 const NetLogWithSource& net_log) { | 545 const NetLogWithSource& net_log) { |
| 541 // It is OK to dereference spdy_session_pool, because the | 546 // It is OK to dereference spdy_session_pool, because the |
| 542 // ClientSocketPoolManager will be destroyed in the same callback that | 547 // ClientSocketPoolManager will be destroyed in the same callback that |
| 543 // destroys the SpdySessionPool. | 548 // destroys the SpdySessionPool. |
| 544 return spdy_session_pool->FindAvailableSession( | 549 return spdy_session_pool->FindAvailableSession( |
| 545 spdy_session_key, origin_url, /* enable_ip_based_pooling = */ true, | 550 spdy_session_key, origin_url, enable_ip_based_pooling, net_log) |
|
Zhongyi Shi
2017/03/29 03:05:06
I thought we could just use the enable_ip_based_po
Bence
2017/03/29 16:46:08
Yes, this method is static. That's why |spdy_sess
Zhongyi Shi
2017/03/30 22:33:02
Acknowledged. I see, I didn't realize it's a stati
| |
| 546 net_log) | |
| 547 ? ERR_SPDY_SESSION_ALREADY_EXISTS | 551 ? ERR_SPDY_SESSION_ALREADY_EXISTS |
| 548 : OK; | 552 : OK; |
| 549 } | 553 } |
| 550 | 554 |
| 551 void HttpStreamFactoryImpl::Job::OnIOComplete(int result) { | 555 void HttpStreamFactoryImpl::Job::OnIOComplete(int result) { |
| 552 TRACE_EVENT0(kNetTracingCategory, "HttpStreamFactoryImpl::Job::OnIOComplete"); | 556 TRACE_EVENT0(kNetTracingCategory, "HttpStreamFactoryImpl::Job::OnIOComplete"); |
| 553 RunLoop(result); | 557 RunLoop(result); |
| 554 } | 558 } |
| 555 | 559 |
| 556 int HttpStreamFactoryImpl::Job::RunLoop(int result) { | 560 int HttpStreamFactoryImpl::Job::RunLoop(int result) { |
| (...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 946 return rv; | 950 return rv; |
| 947 } | 951 } |
| 948 | 952 |
| 949 SpdySessionKey spdy_session_key = GetSpdySessionKey(); | 953 SpdySessionKey spdy_session_key = GetSpdySessionKey(); |
| 950 | 954 |
| 951 // Check first if we have a spdy session for this group. If so, then go | 955 // Check first if we have a spdy session for this group. If so, then go |
| 952 // straight to using that. | 956 // straight to using that. |
| 953 if (CanUseExistingSpdySession()) { | 957 if (CanUseExistingSpdySession()) { |
| 954 base::WeakPtr<SpdySession> spdy_session = | 958 base::WeakPtr<SpdySession> spdy_session = |
| 955 session_->spdy_session_pool()->FindAvailableSession( | 959 session_->spdy_session_pool()->FindAvailableSession( |
| 956 spdy_session_key, origin_url_, /* enable_ip_based_pooling = */ true, | 960 spdy_session_key, origin_url_, enable_ip_based_pooling_, net_log_); |
| 957 net_log_); | |
| 958 if (spdy_session) { | 961 if (spdy_session) { |
| 959 // If we're preconnecting, but we already have a SpdySession, we don't | 962 // If we're preconnecting, but we already have a SpdySession, we don't |
| 960 // actually need to preconnect any sockets, so we're done. | 963 // actually need to preconnect any sockets, so we're done. |
| 961 if (job_type_ == PRECONNECT) | 964 if (job_type_ == PRECONNECT) |
| 962 return OK; | 965 return OK; |
| 963 using_spdy_ = true; | 966 using_spdy_ = true; |
| 964 next_state_ = STATE_CREATE_STREAM; | 967 next_state_ = STATE_CREATE_STREAM; |
| 965 existing_spdy_session_ = spdy_session; | 968 existing_spdy_session_ = spdy_session; |
| 966 return OK; | 969 return OK; |
| 967 } | 970 } |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 994 request_info_.load_flags, priority_, session_, proxy_info_, expect_spdy, | 997 request_info_.load_flags, priority_, session_, proxy_info_, expect_spdy, |
| 995 server_ssl_config_, proxy_ssl_config_, request_info_.privacy_mode, | 998 server_ssl_config_, proxy_ssl_config_, request_info_.privacy_mode, |
| 996 net_log_, num_streams_); | 999 net_log_, num_streams_); |
| 997 } | 1000 } |
| 998 | 1001 |
| 999 // If we can't use a SPDY session, don't bother checking for one after | 1002 // If we can't use a SPDY session, don't bother checking for one after |
| 1000 // the hostname is resolved. | 1003 // the hostname is resolved. |
| 1001 OnHostResolutionCallback resolution_callback = | 1004 OnHostResolutionCallback resolution_callback = |
| 1002 CanUseExistingSpdySession() | 1005 CanUseExistingSpdySession() |
| 1003 ? base::Bind(&Job::OnHostResolution, session_->spdy_session_pool(), | 1006 ? base::Bind(&Job::OnHostResolution, session_->spdy_session_pool(), |
| 1004 spdy_session_key, origin_url_) | 1007 spdy_session_key, origin_url_, enable_ip_based_pooling_) |
|
Zhongyi Shi
2017/03/29 03:05:06
ditto
Bence
2017/03/29 16:46:08
ditto
| |
| 1005 : OnHostResolutionCallback(); | 1008 : OnHostResolutionCallback(); |
| 1006 if (delegate_->for_websockets()) { | 1009 if (delegate_->for_websockets()) { |
| 1007 // TODO(ricea): Re-enable NPN when WebSockets over SPDY is supported. | 1010 // TODO(ricea): Re-enable NPN when WebSockets over SPDY is supported. |
| 1008 SSLConfig websocket_server_ssl_config = server_ssl_config_; | 1011 SSLConfig websocket_server_ssl_config = server_ssl_config_; |
| 1009 websocket_server_ssl_config.alpn_protos.clear(); | 1012 websocket_server_ssl_config.alpn_protos.clear(); |
| 1010 return InitSocketHandleForWebSocketRequest( | 1013 return InitSocketHandleForWebSocketRequest( |
| 1011 GetSocketGroup(), destination_, request_info_.extra_headers, | 1014 GetSocketGroup(), destination_, request_info_.extra_headers, |
| 1012 request_info_.load_flags, priority_, session_, proxy_info_, expect_spdy, | 1015 request_info_.load_flags, priority_, session_, proxy_info_, expect_spdy, |
| 1013 websocket_server_ssl_config, proxy_ssl_config_, | 1016 websocket_server_ssl_config, proxy_ssl_config_, |
| 1014 request_info_.privacy_mode, net_log_, connection_.get(), | 1017 request_info_.privacy_mode, net_log_, connection_.get(), |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 1029 DCHECK_EQ(OK, result); | 1032 DCHECK_EQ(OK, result); |
| 1030 return OK; | 1033 return OK; |
| 1031 } | 1034 } |
| 1032 | 1035 |
| 1033 if (result == ERR_SPDY_SESSION_ALREADY_EXISTS) { | 1036 if (result == ERR_SPDY_SESSION_ALREADY_EXISTS) { |
| 1034 // We found a SPDY connection after resolving the host. This is | 1037 // We found a SPDY connection after resolving the host. This is |
| 1035 // probably an IP pooled connection. | 1038 // probably an IP pooled connection. |
| 1036 SpdySessionKey spdy_session_key = GetSpdySessionKey(); | 1039 SpdySessionKey spdy_session_key = GetSpdySessionKey(); |
| 1037 existing_spdy_session_ = | 1040 existing_spdy_session_ = |
| 1038 session_->spdy_session_pool()->FindAvailableSession( | 1041 session_->spdy_session_pool()->FindAvailableSession( |
| 1039 spdy_session_key, origin_url_, | 1042 spdy_session_key, origin_url_, enable_ip_based_pooling_, net_log_); |
| 1040 /* enable_ip_based_pooling = */ true, net_log_); | |
| 1041 if (existing_spdy_session_) { | 1043 if (existing_spdy_session_) { |
| 1042 using_spdy_ = true; | 1044 using_spdy_ = true; |
| 1043 next_state_ = STATE_CREATE_STREAM; | 1045 next_state_ = STATE_CREATE_STREAM; |
| 1044 } else { | 1046 } else { |
| 1045 // It is possible that the spdy session no longer exists. | 1047 // It is possible that the spdy session no longer exists. |
| 1046 ReturnToStateInitConnection(true /* close connection */); | 1048 ReturnToStateInitConnection(true /* close connection */); |
| 1047 } | 1049 } |
| 1048 return OK; | 1050 return OK; |
| 1049 } | 1051 } |
| 1050 | 1052 |
| (...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1242 } | 1244 } |
| 1243 return OK; | 1245 return OK; |
| 1244 } | 1246 } |
| 1245 | 1247 |
| 1246 CHECK(!stream_.get()); | 1248 CHECK(!stream_.get()); |
| 1247 | 1249 |
| 1248 SpdySessionKey spdy_session_key = GetSpdySessionKey(); | 1250 SpdySessionKey spdy_session_key = GetSpdySessionKey(); |
| 1249 if (!existing_spdy_session_) { | 1251 if (!existing_spdy_session_) { |
| 1250 existing_spdy_session_ = | 1252 existing_spdy_session_ = |
| 1251 session_->spdy_session_pool()->FindAvailableSession( | 1253 session_->spdy_session_pool()->FindAvailableSession( |
| 1252 spdy_session_key, origin_url_, | 1254 spdy_session_key, origin_url_, enable_ip_based_pooling_, net_log_); |
| 1253 /* enable_ip_based_pooling = */ true, net_log_); | |
| 1254 } | 1255 } |
| 1255 bool direct = !IsHttpsProxyAndHttpUrl(); | 1256 bool direct = !IsHttpsProxyAndHttpUrl(); |
| 1256 if (existing_spdy_session_.get()) { | 1257 if (existing_spdy_session_.get()) { |
| 1257 // We picked up an existing session, so we don't need our socket. | 1258 // We picked up an existing session, so we don't need our socket. |
| 1258 if (connection_->socket()) | 1259 if (connection_->socket()) |
| 1259 connection_->socket()->Disconnect(); | 1260 connection_->socket()->Disconnect(); |
| 1260 connection_->Reset(); | 1261 connection_->Reset(); |
| 1261 | 1262 |
| 1262 int set_result = SetSpdyHttpStreamOrBidirectionalStreamImpl( | 1263 int set_result = SetSpdyHttpStreamOrBidirectionalStreamImpl( |
| 1263 existing_spdy_session_, direct); | 1264 existing_spdy_session_, direct); |
| (...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1555 | 1556 |
| 1556 ConnectionAttempts socket_attempts = connection_->connection_attempts(); | 1557 ConnectionAttempts socket_attempts = connection_->connection_attempts(); |
| 1557 if (connection_->socket()) { | 1558 if (connection_->socket()) { |
| 1558 connection_->socket()->GetConnectionAttempts(&socket_attempts); | 1559 connection_->socket()->GetConnectionAttempts(&socket_attempts); |
| 1559 } | 1560 } |
| 1560 | 1561 |
| 1561 delegate_->AddConnectionAttemptsToRequest(this, socket_attempts); | 1562 delegate_->AddConnectionAttemptsToRequest(this, socket_attempts); |
| 1562 } | 1563 } |
| 1563 | 1564 |
| 1564 } // namespace net | 1565 } // namespace net |
| OLD | NEW |