Index: net/http/http_stream_request.cc |
=================================================================== |
--- net/http/http_stream_request.cc (revision 58183) |
+++ net/http/http_stream_request.cc (working copy) |
@@ -427,6 +427,17 @@ |
next_state_ = STATE_CREATE_STREAM; |
return OK; |
} |
+ // Check next if we have a spdy session for this proxy. If so, then go |
+ // straight to using that. |
+ if (proxy_info()->is_https()) { |
+ HostPortProxyPair proxy(proxy_info()->proxy_server().host_port_pair(), |
+ proxy_info()->proxy_server()); |
+ if (session_->spdy_session_pool()->HasSession(proxy)) { |
+ using_spdy_ = true; |
+ next_state_ = STATE_CREATE_STREAM; |
+ return OK; |
+ } |
+ } |
// Build the string used to uniquely identify connections of this type. |
// Determine the host and port to connect to. |
@@ -569,6 +580,14 @@ |
} |
if (force_spdy_over_ssl_ && force_spdy_always_) |
using_spdy_ = true; |
+ } else if (proxy_info()->is_https() && connection_->socket() && |
+ result == OK) { |
+ HttpProxyClientSocket* proxy_socket = |
+ static_cast<HttpProxyClientSocket*>(connection_->socket()); |
+ if (proxy_socket->using_spdy()) { |
+ was_npn_negotiated_ = true; |
+ using_spdy_ = true; |
+ } |
} |
// We may be using spdy without SSL |
@@ -654,15 +673,29 @@ |
CHECK(!stream_.get()); |
+ bool direct = true; |
const scoped_refptr<SpdySessionPool> spdy_pool = |
session_->spdy_session_pool(); |
scoped_refptr<SpdySession> spdy_session; |
- HostPortProxyPair pair(endpoint_, proxy_info()->proxy_server()); |
- if (session_->spdy_session_pool()->HasSession(pair)) { |
+ const ProxyServer& proxy_server = proxy_info()->proxy_server(); |
+ HostPortProxyPair pair(endpoint_, proxy_server); |
+ if (spdy_pool->HasSession(pair)) { |
+ // We have a SPDY session to the origin server. This might be a direct |
+ // connection, or it might be a SPDY session through an HTTP or HTTPS proxy. |
spdy_session = |
- session_->spdy_session_pool()->Get(pair, session_, net_log_); |
- } else { |
+ spdy_pool->Get(pair, session_, net_log_); |
+ } else if (proxy_info()->is_https()) { |
+ // If we don't have a direct SPDY session, and we're using an HTTPS |
+ // proxy, then we might have a SPDY session to the proxy |
+ pair = HostPortProxyPair(proxy_server.host_port_pair(), proxy_server); |
+ if (spdy_pool->HasSession(pair)) { |
+ spdy_session = spdy_pool->Get(pair, session_, net_log_); |
+ } |
+ direct = false; |
+ } |
+ |
+ if (!spdy_session.get()) { |
// SPDY can be negotiated using the TLS next protocol negotiation (NPN) |
// extension, or just directly using SSL. Either way, |connection_| must |
// contain an SSLClientSocket. |
@@ -677,7 +710,7 @@ |
if (spdy_session->IsClosed()) |
return ERR_CONNECTION_CLOSED; |
- SpdyHttpStream* stream = new SpdyHttpStream(spdy_session); |
+ SpdyHttpStream* stream = new SpdyHttpStream(spdy_session, direct); |
stream_.reset(new HttpStreamHandle(NULL, stream)); |
return OK; |
} |