| Index: net/http/http_stream_factory_impl_job.cc
|
| diff --git a/net/http/http_stream_factory_impl_job.cc b/net/http/http_stream_factory_impl_job.cc
|
| index 53a377b2620314f487d52d1e010a247097c298d2..45d152a107945d57b624b3199a8a1baaaf6ce851 100644
|
| --- a/net/http/http_stream_factory_impl_job.cc
|
| +++ b/net/http/http_stream_factory_impl_job.cc
|
| @@ -1028,6 +1028,22 @@ int HttpStreamFactoryImpl::Job::DoWaitingUserAction(int result) {
|
| return ERR_IO_PENDING;
|
| }
|
|
|
| +int HttpStreamFactoryImpl::Job::SetSpdyHttpStream(
|
| + base::WeakPtr<SpdySession> session, bool direct) {
|
| + // TODO(ricea): Restore the code for WebSockets over SPDY once it's
|
| + // implemented.
|
| + if (stream_factory_->for_websockets_)
|
| + return ERR_NOT_IMPLEMENTED;
|
| +
|
| + // TODO(willchan): Delete this code, because eventually, the
|
| + // HttpStreamFactoryImpl will be creating all the SpdyHttpStreams, since it
|
| + // will know when SpdySessions become available.
|
| +
|
| + bool use_relative_url = direct || request_info_.url.SchemeIs("https");
|
| + stream_.reset(new SpdyHttpStream(session, use_relative_url));
|
| + return OK;
|
| +}
|
| +
|
| int HttpStreamFactoryImpl::Job::DoCreateStream() {
|
| DCHECK(connection_->socket() || existing_spdy_session_.get() || using_quic_);
|
|
|
| @@ -1061,76 +1077,64 @@ int HttpStreamFactoryImpl::Job::DoCreateStream() {
|
| bool direct = true;
|
| const ProxyServer& proxy_server = proxy_info_.proxy_server();
|
| PrivacyMode privacy_mode = request_info_.privacy_mode;
|
| - SpdySessionKey spdy_session_key(origin_, proxy_server, privacy_mode);
|
| - if (IsHttpsProxyAndHttpUrl()) {
|
| - // 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.
|
| - // We never use privacy mode for connection to proxy server.
|
| - spdy_session_key = SpdySessionKey(proxy_server.host_port_pair(),
|
| - ProxyServer::Direct(),
|
| - PRIVACY_MODE_DISABLED);
|
| + if (IsHttpsProxyAndHttpUrl())
|
| direct = false;
|
| - }
|
|
|
| - base::WeakPtr<SpdySession> spdy_session;
|
| if (existing_spdy_session_.get()) {
|
| // We picked up an existing session, so we don't need our socket.
|
| if (connection_->socket())
|
| connection_->socket()->Disconnect();
|
| connection_->Reset();
|
| - std::swap(spdy_session, existing_spdy_session_);
|
| - } else {
|
| - SpdySessionPool* spdy_pool = session_->spdy_session_pool();
|
| - spdy_session = spdy_pool->FindAvailableSession(spdy_session_key, net_log_);
|
| - if (!spdy_session) {
|
| - base::WeakPtr<SpdySession> new_spdy_session =
|
| - spdy_pool->CreateAvailableSessionFromSocket(spdy_session_key,
|
| - connection_.Pass(),
|
| - net_log_,
|
| - spdy_certificate_error_,
|
| - using_ssl_);
|
| - if (!new_spdy_session->HasAcceptableTransportSecurity()) {
|
| - new_spdy_session->CloseSessionOnError(
|
| - ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY, "");
|
| - return ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY;
|
| - }
|
| -
|
| - new_spdy_session_ = new_spdy_session;
|
| - spdy_session_direct_ = direct;
|
| - const HostPortPair& host_port_pair = spdy_session_key.host_port_pair();
|
| - base::WeakPtr<HttpServerProperties> http_server_properties =
|
| - session_->http_server_properties();
|
| - if (http_server_properties)
|
| - http_server_properties->SetSupportsSpdy(host_port_pair, true);
|
| -
|
| - // Create a SpdyHttpStream attached to the session;
|
| - // OnNewSpdySessionReadyCallback is not called until an event loop
|
| - // iteration later, so if the SpdySession is closed between then, allow
|
| - // reuse state from the underlying socket, sampled by SpdyHttpStream,
|
| - // bubble up to the request.
|
| - bool use_relative_url = direct || request_info_.url.SchemeIs("https");
|
| - stream_.reset(new SpdyHttpStream(new_spdy_session_, use_relative_url));
|
|
|
| - return OK;
|
| - }
|
| + int set_result = SetSpdyHttpStream(existing_spdy_session_, direct);
|
| + existing_spdy_session_.reset();
|
| + return set_result;
|
| }
|
|
|
| - if (!spdy_session)
|
| - return ERR_CONNECTION_CLOSED;
|
| + SpdySessionKey spdy_session_key(origin_, proxy_server, privacy_mode);
|
| + if (IsHttpsProxyAndHttpUrl()) {
|
| + // 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.
|
| + // We never use privacy mode for connection to proxy server.
|
| + spdy_session_key = SpdySessionKey(proxy_server.host_port_pair(),
|
| + ProxyServer::Direct(),
|
| + PRIVACY_MODE_DISABLED);
|
| + }
|
|
|
| - // TODO(willchan): Delete this code, because eventually, the
|
| - // HttpStreamFactoryImpl will be creating all the SpdyHttpStreams, since it
|
| - // will know when SpdySessions become available.
|
| + SpdySessionPool* spdy_pool = session_->spdy_session_pool();
|
| + base::WeakPtr<SpdySession> spdy_session =
|
| + spdy_pool->FindAvailableSession(spdy_session_key, net_log_);
|
|
|
| - // TODO(ricea): Restore the code for WebSockets over SPDY once it's
|
| - // implemented.
|
| - if (stream_factory_->for_websockets_)
|
| - return ERR_NOT_IMPLEMENTED;
|
| + if (spdy_session) {
|
| + return SetSpdyHttpStream(spdy_session, direct);
|
| + }
|
|
|
| - bool use_relative_url = direct || request_info_.url.SchemeIs("https");
|
| - stream_.reset(new SpdyHttpStream(spdy_session, use_relative_url));
|
| + spdy_session =
|
| + spdy_pool->CreateAvailableSessionFromSocket(spdy_session_key,
|
| + connection_.Pass(),
|
| + net_log_,
|
| + spdy_certificate_error_,
|
| + using_ssl_);
|
| + if (!spdy_session->HasAcceptableTransportSecurity()) {
|
| + spdy_session->CloseSessionOnError(
|
| + ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY, "");
|
| + return ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY;
|
| + }
|
|
|
| - return OK;
|
| + new_spdy_session_ = spdy_session;
|
| + spdy_session_direct_ = direct;
|
| + const HostPortPair& host_port_pair = spdy_session_key.host_port_pair();
|
| + base::WeakPtr<HttpServerProperties> http_server_properties =
|
| + session_->http_server_properties();
|
| + if (http_server_properties)
|
| + http_server_properties->SetSupportsSpdy(host_port_pair, true);
|
| +
|
| + // Create a SpdyHttpStream attached to the session;
|
| + // OnNewSpdySessionReadyCallback is not called until an event loop
|
| + // iteration later, so if the SpdySession is closed between then, allow
|
| + // reuse state from the underlying socket, sampled by SpdyHttpStream,
|
| + // bubble up to the request.
|
| + return SetSpdyHttpStream(new_spdy_session_, spdy_session_direct_);
|
| }
|
|
|
| int HttpStreamFactoryImpl::Job::DoCreateStreamComplete(int result) {
|
|
|