Index: net/spdy/spdy_proxy_client_socket.cc |
=================================================================== |
--- net/spdy/spdy_proxy_client_socket.cc (revision 68959) |
+++ net/spdy/spdy_proxy_client_socket.cc (working copy) |
@@ -59,6 +59,11 @@ |
Disconnect(); |
} |
+HttpStream* SpdyProxyClientSocket::CreateConnectResponseStream() { |
+ DCHECK(response_stream_.get()); |
+ return response_stream_.release(); |
+} |
+ |
// Sends a SYN_STREAM frame to the proxy with a CONNECT request |
// for the specified endpoint. Waits for the server to send back |
// a SYN_REPLY frame. OK will be returned if the status is 200. |
@@ -353,10 +358,22 @@ |
make_scoped_refptr(new NetLogHttpResponseParameter(response_.headers))); |
} |
- if (response_.headers->response_code() == 200) |
+ if (response_.headers->response_code() == 200) { |
return OK; |
- else |
+ } else if (response_.headers->response_code() == 407) { |
return ERR_TUNNEL_CONNECTION_FAILED; |
+ } else { |
+ // Immediately hand off our SpdyStream to a newly created SpdyHttpStream |
+ // so that any subsequent SpdyFrames are processed in the context of |
+ // the HttpStream, not the socket. |
+ DCHECK(spdy_stream_); |
+ SpdyStream* stream = spdy_stream_; |
+ spdy_stream_ = NULL; |
+ response_stream_.reset(new SpdyHttpStream(NULL, false)); |
+ response_stream_->InitializeWithExistingStream(stream); |
+ next_state_ = STATE_DISCONNECTED; |
+ return ERR_HTTPS_PROXY_TUNNEL_RESPONSE; |
+ } |
} |
// SpdyStream::Delegate methods: |