| Index: net/http/http_stream_request.cc
 | 
| ===================================================================
 | 
| --- net/http/http_stream_request.cc	(revision 68959)
 | 
| +++ net/http/http_stream_request.cc	(working copy)
 | 
| @@ -206,6 +206,12 @@
 | 
|    delegate_->OnNeedsClientAuth(cert_info);
 | 
|  }
 | 
|  
 | 
| +void HttpStreamRequest::OnHttpsProxyTunnelResponseCallback(
 | 
| +    const HttpResponseInfo& response_info,
 | 
| +    HttpStream* stream) {
 | 
| +  delegate_->OnHttpsProxyTunnelResponse(response_info, stream);
 | 
| +}
 | 
| +
 | 
|  void HttpStreamRequest::OnPreconnectsComplete(int result) {
 | 
|    preconnect_delegate_->OnPreconnectsComplete(this, result);
 | 
|  }
 | 
| @@ -253,7 +259,7 @@
 | 
|          HttpProxyClientSocket* http_proxy_socket =
 | 
|              static_cast<HttpProxyClientSocket*>(connection_->socket());
 | 
|          const HttpResponseInfo* tunnel_auth_response =
 | 
| -            http_proxy_socket->GetResponseInfo();
 | 
| +            http_proxy_socket->GetConnectResponseInfo();
 | 
|  
 | 
|          next_state_ = STATE_WAITING_USER_ACTION;
 | 
|          MessageLoop::current()->PostTask(
 | 
| @@ -273,6 +279,23 @@
 | 
|                connection_->ssl_error_response_info().cert_request_info));
 | 
|        return ERR_IO_PENDING;
 | 
|  
 | 
| +    case ERR_HTTPS_PROXY_TUNNEL_RESPONSE:
 | 
| +      {
 | 
| +        DCHECK(connection_.get());
 | 
| +        DCHECK(connection_->socket());
 | 
| +        DCHECK(establishing_tunnel_);
 | 
| +
 | 
| +        ProxyClientSocket* proxy_socket =
 | 
| +            static_cast<ProxyClientSocket*>(connection_->socket());
 | 
| +        MessageLoop::current()->PostTask(
 | 
| +            FROM_HERE,
 | 
| +            method_factory_.NewRunnableMethod(
 | 
| +                &HttpStreamRequest::OnHttpsProxyTunnelResponseCallback,
 | 
| +                *proxy_socket->GetConnectResponseInfo(),
 | 
| +                proxy_socket->CreateConnectResponseStream()));
 | 
| +        return ERR_IO_PENDING;
 | 
| +      }
 | 
| +
 | 
|      case OK:
 | 
|        next_state_ = STATE_DONE;
 | 
|        MessageLoop::current()->PostTask(
 | 
| @@ -662,13 +685,15 @@
 | 
|    if (!force_spdy_over_ssl_ && force_spdy_always_)
 | 
|      SwitchToSpdyMode();
 | 
|  
 | 
| -  if (result == ERR_PROXY_AUTH_REQUESTED) {
 | 
| +  if (result == ERR_PROXY_AUTH_REQUESTED ||
 | 
| +      result == ERR_HTTPS_PROXY_TUNNEL_RESPONSE) {
 | 
|      DCHECK(!ssl_started);
 | 
|      // Other state (i.e. |using_ssl_|) suggests that |connection_| will have an
 | 
|      // SSL socket, but there was an error before that could happen.  This
 | 
|      // puts the in progress HttpProxy socket into |connection_| in order to
 | 
| -    // complete the auth.  The tunnel restart code is careful to remove it
 | 
| -    // before returning control to the rest of this class.
 | 
| +    // complete the auth (or read the response body).  The tunnel restart code
 | 
| +    // is careful to remove it before returning control to the rest of this
 | 
| +    // class.
 | 
|      connection_.reset(connection_->release_pending_http_proxy_connection());
 | 
|      return result;
 | 
|    }
 | 
| @@ -744,7 +769,8 @@
 | 
|    if (!using_spdy_) {
 | 
|      bool using_proxy = (proxy_info()->is_http() || proxy_info()->is_https()) &&
 | 
|          request_info().url.SchemeIs("http");
 | 
| -    stream_.reset(new HttpBasicStream(connection_.release(), using_proxy));
 | 
| +    stream_.reset(new HttpBasicStream(connection_.release(), NULL,
 | 
| +                                      using_proxy));
 | 
|      return OK;
 | 
|    }
 | 
|  
 | 
| @@ -792,8 +818,8 @@
 | 
|    if (spdy_session->IsClosed())
 | 
|      return ERR_CONNECTION_CLOSED;
 | 
|  
 | 
| -  bool useRelativeUrl = direct || request_info().url.SchemeIs("https");
 | 
| -  stream_.reset(new SpdyHttpStream(spdy_session, useRelativeUrl));
 | 
| +  bool use_relative_url = direct || request_info().url.SchemeIs("https");
 | 
| +  stream_.reset(new SpdyHttpStream(spdy_session, use_relative_url));
 | 
|    return OK;
 | 
|  }
 | 
|  
 | 
| 
 |