Index: net/spdy/spdy_proxy_client_socket.cc |
=================================================================== |
--- net/spdy/spdy_proxy_client_socket.cc (revision 118888) |
+++ net/spdy/spdy_proxy_client_socket.cc (working copy) |
@@ -14,8 +14,6 @@ |
#include "net/base/auth.h" |
#include "net/base/io_buffer.h" |
#include "net/base/net_util.h" |
-#include "net/http/http_auth_cache.h" |
-#include "net/http/http_auth_handler_factory.h" |
#include "net/http/http_net_log_params.h" |
#include "net/http/http_proxy_utils.h" |
#include "net/http/http_response_headers.h" |
@@ -29,16 +27,11 @@ |
const HostPortPair& endpoint, |
const GURL& url, |
const HostPortPair& proxy_server, |
- HttpAuthCache* auth_cache, |
- HttpAuthHandlerFactory* auth_handler_factory) |
+ HttpAuthController* http_auth_controller) |
: next_state_(STATE_DISCONNECTED), |
spdy_stream_(spdy_stream), |
endpoint_(endpoint), |
- auth_( |
- new HttpAuthController(HttpAuth::AUTH_PROXY, |
- GURL("https://" + proxy_server.ToString()), |
- auth_cache, |
- auth_handler_factory)), |
+ auth_(http_auth_controller), |
user_buffer_(NULL), |
write_buffer_len_(0), |
write_bytes_outstanding_(0), |
@@ -61,6 +54,19 @@ |
return response_.headers ? &response_ : NULL; |
} |
+const |
+scoped_refptr<HttpAuthController>& SpdyProxyClientSocket::GetAuthController() { |
+ return auth_; |
+} |
+ |
+int SpdyProxyClientSocket::RestartWithAuth(const CompletionCallback& callback) { |
+ // A SPDY Stream can only handle a single request, so the underlying |
+ // stream may not be reused and a new SpdyProxyClientSocket must be |
+ // created (possibly on top of the same SPDY Session). |
+ next_state_ = STATE_DISCONNECTED; |
+ return ERR_NO_KEEP_ALIVE_ON_AUTH_RESTART; |
+} |
+ |
HttpStream* SpdyProxyClientSocket::CreateConnectResponseStream() { |
DCHECK(response_stream_.get()); |
return response_stream_.release(); |
@@ -72,8 +78,6 @@ |
// ERR_TUNNEL_CONNECTION_FAILED will be returned for any other status. |
// In any of these cases, Read() may be called to retrieve the HTTP |
// response body. Any other return values should be considered fatal. |
-// TODO(rch): handle 407 proxy auth requested correctly, perhaps |
-// by creating a new stream for the subsequent request. |
// TODO(rch): create a more appropriate error code to disambiguate |
// the HTTPS Proxy tunnel failure from an HTTP Proxy tunnel failure. |
int SpdyProxyClientSocket::Connect(const CompletionCallback& callback) { |
@@ -379,7 +383,17 @@ |
if (response_.headers->response_code() == 200) { |
return OK; |
} else if (response_.headers->response_code() == 407) { |
- return ERR_TUNNEL_CONNECTION_FAILED; |
+ int rv = HandleAuthChallenge(auth_, &response_, net_log_); |
+ if (rv != ERR_PROXY_AUTH_REQUESTED) { |
+ return rv; |
+ } |
+ // SPDY only supports basic and digest auth |
+ if (!auth_->auth_info() || |
+ (auth_->auth_info()->scheme != "basic" && |
+ auth_->auth_info()->scheme != "digest")) { |
+ return ERR_PROXY_AUTH_UNSUPPORTED; |
+ } |
+ return ERR_PROXY_AUTH_REQUESTED; |
} else { |
// Immediately hand off our SpdyStream to a newly created SpdyHttpStream |
// so that any subsequent SpdyFrames are processed in the context of |