| Index: net/http/http_proxy_client_socket.cc
|
| ===================================================================
|
| --- net/http/http_proxy_client_socket.cc (revision 120367)
|
| +++ net/http/http_proxy_client_socket.cc (working copy)
|
| @@ -1,4 +1,4 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| +// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| @@ -31,7 +31,8 @@
|
| const std::string& user_agent,
|
| const HostPortPair& endpoint,
|
| const HostPortPair& proxy_server,
|
| - HttpAuthController* http_auth_controller,
|
| + HttpAuthCache* http_auth_cache,
|
| + HttpAuthHandlerFactory* http_auth_handler_factory,
|
| bool tunnel,
|
| bool using_spdy,
|
| SSLClientSocket::NextProto protocol_negotiated,
|
| @@ -42,7 +43,13 @@
|
| next_state_(STATE_NONE),
|
| transport_(transport_socket),
|
| endpoint_(endpoint),
|
| - auth_(http_auth_controller),
|
| + auth_(tunnel ?
|
| + new HttpAuthController(HttpAuth::AUTH_PROXY,
|
| + GURL((is_https_proxy ? "https://" : "http://")
|
| + + proxy_server.ToString()),
|
| + http_auth_cache,
|
| + http_auth_handler_factory)
|
| + : NULL),
|
| tunnel_(tunnel),
|
| using_spdy_(using_spdy),
|
| protocol_negotiated_(protocol_negotiated),
|
| @@ -60,11 +67,6 @@
|
| Disconnect();
|
| }
|
|
|
| -const
|
| -scoped_refptr<HttpAuthController>& HttpProxyClientSocket::GetAuthController() {
|
| - return auth_;
|
| -}
|
| -
|
| int HttpProxyClientSocket::RestartWithAuth(const CompletionCallback& callback) {
|
| DCHECK_EQ(STATE_NONE, next_state_);
|
| DCHECK(user_callback_.is_null());
|
| @@ -252,14 +254,14 @@
|
| }
|
|
|
| int HttpProxyClientSocket::DidDrainBodyForAuthRestart(bool keep_alive) {
|
| - int rv = OK;
|
| if (keep_alive && transport_->socket()->IsConnectedAndIdle()) {
|
| next_state_ = STATE_GENERATE_AUTH_TOKEN;
|
| transport_->set_is_reused(true);
|
| } else {
|
| - next_state_ = STATE_NONE;
|
| + // This assumes that the underlying transport socket is a TCP socket,
|
| + // since only TCP sockets are restartable.
|
| + next_state_ = STATE_TCP_RESTART;
|
| transport_->socket()->Disconnect();
|
| - rv = ERR_NO_KEEP_ALIVE_ON_AUTH_RESTART;
|
| }
|
|
|
| // Reset the other member variables.
|
| @@ -269,6 +271,17 @@
|
| request_line_.clear();
|
| request_headers_.Clear();
|
| response_ = HttpResponseInfo();
|
| + return OK;
|
| +}
|
| +
|
| +int HttpProxyClientSocket::HandleAuthChallenge() {
|
| + DCHECK(response_.headers);
|
| +
|
| + int rv = auth_->HandleAuthChallenge(response_.headers, false, true, net_log_);
|
| + response_.auth_challenge = auth_->auth_info();
|
| + if (rv == OK)
|
| + return ERR_PROXY_AUTH_REQUESTED;
|
| +
|
| return rv;
|
| }
|
|
|
| @@ -341,6 +354,13 @@
|
| case STATE_DRAIN_BODY_COMPLETE:
|
| rv = DoDrainBodyComplete(rv);
|
| break;
|
| + case STATE_TCP_RESTART:
|
| + DCHECK_EQ(OK, rv);
|
| + rv = DoTCPRestart();
|
| + break;
|
| + case STATE_TCP_RESTART_COMPLETE:
|
| + rv = DoTCPRestartComplete(rv);
|
| + break;
|
| case STATE_DONE:
|
| break;
|
| default:
|
| @@ -439,7 +459,7 @@
|
| // authentication code is smart enough to avoid being tricked by an
|
| // active network attacker.
|
| // The next state is intentionally not set as it should be STATE_NONE;
|
| - return HandleAuthChallenge(auth_, &response_, net_log_);
|
| + return HandleAuthChallenge();
|
|
|
| default:
|
| if (is_https_proxy_)
|
| @@ -475,4 +495,18 @@
|
| return OK;
|
| }
|
|
|
| +int HttpProxyClientSocket::DoTCPRestart() {
|
| + next_state_ = STATE_TCP_RESTART_COMPLETE;
|
| + return transport_->socket()->Connect(
|
| + base::Bind(&HttpProxyClientSocket::OnIOComplete, base::Unretained(this)));
|
| +}
|
| +
|
| +int HttpProxyClientSocket::DoTCPRestartComplete(int result) {
|
| + if (result != OK)
|
| + return result;
|
| +
|
| + next_state_ = STATE_GENERATE_AUTH_TOKEN;
|
| + return result;
|
| +}
|
| +
|
| } // namespace net
|
|
|