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 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 264 DCHECK(connection_.get() && connection_->socket()); | 264 DCHECK(connection_.get() && connection_->socket()); |
| 265 SSLClientSocket* ssl_socket = | 265 SSLClientSocket* ssl_socket = |
| 266 static_cast<SSLClientSocket*>(connection_->socket()); | 266 static_cast<SSLClientSocket*>(connection_->socket()); |
| 267 ssl_socket->GetSSLInfo(&ssl_info_); | 267 ssl_socket->GetSSLInfo(&ssl_info_); |
| 268 } | 268 } |
| 269 | 269 |
| 270 SpdySessionKey HttpStreamFactoryImpl::Job::GetSpdySessionKey() const { | 270 SpdySessionKey HttpStreamFactoryImpl::Job::GetSpdySessionKey() const { |
| 271 // In the case that we're using an HTTPS proxy for an HTTP url, | 271 // In the case that we're using an HTTPS proxy for an HTTP url, |
| 272 // we look for a SPDY session *to* the proxy, instead of to the | 272 // we look for a SPDY session *to* the proxy, instead of to the |
| 273 // origin server. | 273 // origin server. |
| 274 PrivacyMode privacy_mode = request_info_.privacy_mode; | |
| 275 if (IsHttpsProxyAndHttpUrl()) { | 274 if (IsHttpsProxyAndHttpUrl()) { |
| 276 return SpdySessionKey(proxy_info_.proxy_server().host_port_pair(), | 275 return SpdySessionKey(proxy_info_.proxy_server().host_port_pair(), |
| 277 ProxyServer::Direct(), | 276 ProxyServer::Direct(), PRIVACY_MODE_DISABLED); |
| 278 privacy_mode); | |
| 279 } | 277 } |
| 278 PrivacyMode privacy_mode = request_info_.privacy_mode; | |
|
Ryan Hamilton
2015/04/14 23:24:47
nit: just inline this in the next line.
Bence
2015/04/15 13:12:08
Done.
| |
| 280 return SpdySessionKey(server_, proxy_info_.proxy_server(), privacy_mode); | 279 return SpdySessionKey(server_, proxy_info_.proxy_server(), privacy_mode); |
| 281 } | 280 } |
| 282 | 281 |
| 283 bool HttpStreamFactoryImpl::Job::CanUseExistingSpdySession() const { | 282 bool HttpStreamFactoryImpl::Job::CanUseExistingSpdySession() const { |
| 284 // We need to make sure that if a spdy session was created for | 283 // We need to make sure that if a spdy session was created for |
| 285 // https://somehost/ that we don't use that session for http://somehost:443/. | 284 // https://somehost/ that we don't use that session for http://somehost:443/. |
| 286 // The only time we can use an existing session is if the request URL is | 285 // The only time we can use an existing session is if the request URL is |
| 287 // https (the normal case) or if we're connection to a SPDY proxy. | 286 // https (the normal case) or if we're connection to a SPDY proxy. |
| 288 // https://crbug.com/133176 | 287 // https://crbug.com/133176 |
| 289 // TODO(ricea): Add "wss" back to this list when SPDY WebSocket support is | 288 // TODO(ricea): Add "wss" back to this list when SPDY WebSocket support is |
| (...skipping 504 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 794 // OK, there's no available QUIC session. Let |waiting_job_| resume | 793 // OK, there's no available QUIC session. Let |waiting_job_| resume |
| 795 // if it's paused. | 794 // if it's paused. |
| 796 if (waiting_job_) { | 795 if (waiting_job_) { |
| 797 waiting_job_->Resume(this); | 796 waiting_job_->Resume(this); |
| 798 waiting_job_ = NULL; | 797 waiting_job_ = NULL; |
| 799 } | 798 } |
| 800 } | 799 } |
| 801 return rv; | 800 return rv; |
| 802 } | 801 } |
| 803 | 802 |
| 803 SpdySessionKey spdy_session_key = GetSpdySessionKey(); | |
| 804 | |
| 804 // Check first if we have a spdy session for this group. If so, then go | 805 // Check first if we have a spdy session for this group. If so, then go |
| 805 // straight to using that. | 806 // straight to using that. |
| 806 SpdySessionKey spdy_session_key = GetSpdySessionKey(); | 807 if (CanUseExistingSpdySession()) { |
| 807 base::WeakPtr<SpdySession> spdy_session = | 808 base::WeakPtr<SpdySession> spdy_session = |
| 808 session_->spdy_session_pool()->FindAvailableSession( | 809 session_->spdy_session_pool()->FindAvailableSession(spdy_session_key, |
| 809 spdy_session_key, net_log_); | 810 net_log_); |
| 810 if (spdy_session && CanUseExistingSpdySession()) { | 811 if (spdy_session) { |
| 811 // If we're preconnecting, but we already have a SpdySession, we don't | 812 // If we're preconnecting, but we already have a SpdySession, we don't |
| 812 // actually need to preconnect any sockets, so we're done. | 813 // actually need to preconnect any sockets, so we're done. |
| 813 if (IsPreconnecting()) | 814 if (IsPreconnecting()) |
| 815 return OK; | |
| 816 using_spdy_ = true; | |
| 817 next_state_ = STATE_CREATE_STREAM; | |
| 818 existing_spdy_session_ = spdy_session; | |
| 814 return OK; | 819 return OK; |
| 815 using_spdy_ = true; | 820 } |
| 816 next_state_ = STATE_CREATE_STREAM; | 821 } |
| 817 existing_spdy_session_ = spdy_session; | 822 if (request_ && !request_->HasSpdySessionKey() && using_ssl_) { |
| 818 return OK; | |
| 819 } else if (request_ && !request_->HasSpdySessionKey() && using_ssl_) { | |
| 820 // Update the spdy session key for the request that launched this job. | 823 // Update the spdy session key for the request that launched this job. |
| 821 request_->SetSpdySessionKey(spdy_session_key); | 824 request_->SetSpdySessionKey(spdy_session_key); |
| 822 } | 825 } |
| 823 | 826 |
| 824 // OK, there's no available SPDY session. Let |waiting_job_| resume if it's | 827 // OK, there's no available SPDY session. Let |waiting_job_| resume if it's |
| 825 // paused. | 828 // paused. |
| 826 | |
| 827 if (waiting_job_) { | 829 if (waiting_job_) { |
| 828 waiting_job_->Resume(this); | 830 waiting_job_->Resume(this); |
| 829 waiting_job_ = NULL; | 831 waiting_job_ = NULL; |
| 830 } | 832 } |
| 831 | 833 |
| 832 if (proxy_info_.is_http() || proxy_info_.is_https()) | 834 if (proxy_info_.is_http() || proxy_info_.is_https()) |
| 833 establishing_tunnel_ = using_ssl_; | 835 establishing_tunnel_ = using_ssl_; |
| 834 | 836 |
| 835 // TODO(bnc): s/want_spdy_over_npn/expect_spdy_over_npn/ | 837 // TODO(bnc): s/want_spdy_over_npn/expect_spdy_over_npn/ |
| 836 bool want_spdy_over_npn = IsAlternate(); | 838 bool want_spdy_over_npn = IsAlternate(); |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 861 DCHECK(!stream_factory_->for_websockets_); | 863 DCHECK(!stream_factory_->for_websockets_); |
| 862 return PreconnectSocketsForHttpRequest( | 864 return PreconnectSocketsForHttpRequest( |
| 863 GetSocketGroup(), server_, request_info_.extra_headers, | 865 GetSocketGroup(), server_, request_info_.extra_headers, |
| 864 request_info_.load_flags, priority_, session_, proxy_info_, | 866 request_info_.load_flags, priority_, session_, proxy_info_, |
| 865 want_spdy_over_npn, server_ssl_config_, proxy_ssl_config_, | 867 want_spdy_over_npn, server_ssl_config_, proxy_ssl_config_, |
| 866 request_info_.privacy_mode, net_log_, num_streams_); | 868 request_info_.privacy_mode, net_log_, num_streams_); |
| 867 } | 869 } |
| 868 | 870 |
| 869 // If we can't use a SPDY session, don't bother checking for one after | 871 // If we can't use a SPDY session, don't bother checking for one after |
| 870 // the hostname is resolved. | 872 // the hostname is resolved. |
| 871 OnHostResolutionCallback resolution_callback = CanUseExistingSpdySession() ? | 873 OnHostResolutionCallback resolution_callback = |
| 872 base::Bind(&Job::OnHostResolution, session_->spdy_session_pool(), | 874 CanUseExistingSpdySession() |
| 873 GetSpdySessionKey()) : | 875 ? base::Bind(&Job::OnHostResolution, session_->spdy_session_pool(), |
| 874 OnHostResolutionCallback(); | 876 spdy_session_key) |
| 877 : OnHostResolutionCallback(); | |
| 875 if (stream_factory_->for_websockets_) { | 878 if (stream_factory_->for_websockets_) { |
| 876 // TODO(ricea): Re-enable NPN when WebSockets over SPDY is supported. | 879 // TODO(ricea): Re-enable NPN when WebSockets over SPDY is supported. |
| 877 SSLConfig websocket_server_ssl_config = server_ssl_config_; | 880 SSLConfig websocket_server_ssl_config = server_ssl_config_; |
| 878 websocket_server_ssl_config.next_protos.clear(); | 881 websocket_server_ssl_config.next_protos.clear(); |
| 879 return InitSocketHandleForWebSocketRequest( | 882 return InitSocketHandleForWebSocketRequest( |
| 880 GetSocketGroup(), server_, request_info_.extra_headers, | 883 GetSocketGroup(), server_, request_info_.extra_headers, |
| 881 request_info_.load_flags, priority_, session_, proxy_info_, | 884 request_info_.load_flags, priority_, session_, proxy_info_, |
| 882 want_spdy_over_npn, websocket_server_ssl_config, proxy_ssl_config_, | 885 want_spdy_over_npn, websocket_server_ssl_config, proxy_ssl_config_, |
| 883 request_info_.privacy_mode, net_log_, connection_.get(), | 886 request_info_.privacy_mode, net_log_, connection_.get(), |
| 884 resolution_callback, io_callback_); | 887 resolution_callback, io_callback_); |
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1096 request_->websocket_handshake_stream_create_helper() | 1099 request_->websocket_handshake_stream_create_helper() |
| 1097 ->CreateBasicStream(connection_.Pass(), using_proxy)); | 1100 ->CreateBasicStream(connection_.Pass(), using_proxy)); |
| 1098 } else { | 1101 } else { |
| 1099 stream_.reset(new HttpBasicStream(connection_.release(), using_proxy)); | 1102 stream_.reset(new HttpBasicStream(connection_.release(), using_proxy)); |
| 1100 } | 1103 } |
| 1101 return OK; | 1104 return OK; |
| 1102 } | 1105 } |
| 1103 | 1106 |
| 1104 CHECK(!stream_.get()); | 1107 CHECK(!stream_.get()); |
| 1105 | 1108 |
| 1106 bool direct = true; | 1109 bool direct = !IsHttpsProxyAndHttpUrl(); |
| 1107 const ProxyServer& proxy_server = proxy_info_.proxy_server(); | |
| 1108 PrivacyMode privacy_mode = request_info_.privacy_mode; | |
| 1109 if (IsHttpsProxyAndHttpUrl()) | |
| 1110 direct = false; | |
| 1111 | |
| 1112 if (existing_spdy_session_.get()) { | 1110 if (existing_spdy_session_.get()) { |
| 1113 // We picked up an existing session, so we don't need our socket. | 1111 // We picked up an existing session, so we don't need our socket. |
| 1114 if (connection_->socket()) | 1112 if (connection_->socket()) |
| 1115 connection_->socket()->Disconnect(); | 1113 connection_->socket()->Disconnect(); |
| 1116 connection_->Reset(); | 1114 connection_->Reset(); |
| 1117 | 1115 |
| 1118 int set_result = SetSpdyHttpStream(existing_spdy_session_, direct); | 1116 int set_result = SetSpdyHttpStream(existing_spdy_session_, direct); |
| 1119 existing_spdy_session_.reset(); | 1117 existing_spdy_session_.reset(); |
| 1120 return set_result; | 1118 return set_result; |
| 1121 } | 1119 } |
| 1122 | 1120 |
| 1123 SpdySessionKey spdy_session_key(server_, proxy_server, privacy_mode); | |
| 1124 if (IsHttpsProxyAndHttpUrl()) { | |
| 1125 // If we don't have a direct SPDY session, and we're using an HTTPS | |
| 1126 // proxy, then we might have a SPDY session to the proxy. | |
| 1127 // We never use privacy mode for connection to proxy server. | |
| 1128 spdy_session_key = SpdySessionKey(proxy_server.host_port_pair(), | |
| 1129 ProxyServer::Direct(), | |
| 1130 PRIVACY_MODE_DISABLED); | |
| 1131 } | |
| 1132 | |
| 1133 SpdySessionPool* spdy_pool = session_->spdy_session_pool(); | 1121 SpdySessionPool* spdy_pool = session_->spdy_session_pool(); |
| 1122 SpdySessionKey spdy_session_key = GetSpdySessionKey(); | |
| 1134 base::WeakPtr<SpdySession> spdy_session = | 1123 base::WeakPtr<SpdySession> spdy_session = |
| 1135 spdy_pool->FindAvailableSession(spdy_session_key, net_log_); | 1124 spdy_pool->FindAvailableSession(spdy_session_key, net_log_); |
| 1136 | 1125 |
| 1137 if (spdy_session) { | 1126 if (spdy_session) { |
| 1138 return SetSpdyHttpStream(spdy_session, direct); | 1127 return SetSpdyHttpStream(spdy_session, direct); |
| 1139 } | 1128 } |
| 1140 | 1129 |
| 1141 spdy_session = | 1130 spdy_session = |
| 1142 spdy_pool->CreateAvailableSessionFromSocket(spdy_session_key, | 1131 spdy_pool->CreateAvailableSessionFromSocket(spdy_session_key, |
| 1143 connection_.Pass(), | 1132 connection_.Pass(), |
| (...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1485 if (scheme == "https" || scheme == "wss" || IsSpdyAlternate()) | 1474 if (scheme == "https" || scheme == "wss" || IsSpdyAlternate()) |
| 1486 return ClientSocketPoolManager::SSL_GROUP; | 1475 return ClientSocketPoolManager::SSL_GROUP; |
| 1487 | 1476 |
| 1488 if (scheme == "ftp") | 1477 if (scheme == "ftp") |
| 1489 return ClientSocketPoolManager::FTP_GROUP; | 1478 return ClientSocketPoolManager::FTP_GROUP; |
| 1490 | 1479 |
| 1491 return ClientSocketPoolManager::NORMAL_GROUP; | 1480 return ClientSocketPoolManager::NORMAL_GROUP; |
| 1492 } | 1481 } |
| 1493 | 1482 |
| 1494 } // namespace net | 1483 } // namespace net |
| OLD | NEW |