summaryrefslogtreecommitdiffstats
path: root/net/http/http_proxy_client_socket.cc
diff options
context:
space:
mode:
Diffstat (limited to 'net/http/http_proxy_client_socket.cc')
-rw-r--r--net/http/http_proxy_client_socket.cc76
1 files changed, 14 insertions, 62 deletions
diff --git a/net/http/http_proxy_client_socket.cc b/net/http/http_proxy_client_socket.cc
index ef9fb82..6356da7 100644
--- a/net/http/http_proxy_client_socket.cc
+++ b/net/http/http_proxy_client_socket.cc
@@ -37,7 +37,6 @@ HttpProxyClientSocket::HttpProxyClientSocket(
: ALLOW_THIS_IN_INITIALIZER_LIST(
io_callback_(this, &HttpProxyClientSocket::OnIOComplete)),
next_state_(STATE_NONE),
- old_user_callback_(NULL),
transport_(transport_socket),
endpoint_(endpoint),
auth_(tunnel ?
@@ -65,7 +64,7 @@ HttpProxyClientSocket::~HttpProxyClientSocket() {
int HttpProxyClientSocket::RestartWithAuth(OldCompletionCallback* callback) {
DCHECK_EQ(STATE_NONE, next_state_);
- DCHECK(!old_user_callback_ && user_callback_.is_null());
+ DCHECK(user_callback_.is_null());
int rv = PrepareForAuthRestart();
if (rv != OK || next_state_ == STATE_NONE)
@@ -73,7 +72,10 @@ int HttpProxyClientSocket::RestartWithAuth(OldCompletionCallback* callback) {
rv = DoLoop(OK);
if (rv == ERR_IO_PENDING)
- old_user_callback_ = callback;
+ if (callback) {
+ user_callback_ = base::Bind(&OldCompletionCallback::Run<int>,
+ base::Unretained(callback));
+ }
return rv;
}
@@ -92,34 +94,10 @@ HttpStream* HttpProxyClientSocket::CreateConnectResponseStream() {
}
-int HttpProxyClientSocket::Connect(OldCompletionCallback* callback) {
- DCHECK(transport_.get());
- DCHECK(transport_->socket());
- DCHECK(!old_user_callback_ && user_callback_.is_null());
-
- // TODO(rch): figure out the right way to set up a tunnel with SPDY.
- // This approach sends the complete HTTPS request to the proxy
- // which allows the proxy to see "private" data. Instead, we should
- // create an SSL tunnel to the origin server using the CONNECT method
- // inside a single SPDY stream.
- if (using_spdy_ || !tunnel_)
- next_state_ = STATE_DONE;
- if (next_state_ == STATE_DONE)
- return OK;
-
- DCHECK_EQ(STATE_NONE, next_state_);
- next_state_ = STATE_GENERATE_AUTH_TOKEN;
-
- int rv = DoLoop(OK);
- if (rv == ERR_IO_PENDING)
- old_user_callback_ = callback;
- return rv;
-}
-
int HttpProxyClientSocket::Connect(const CompletionCallback& callback) {
DCHECK(transport_.get());
DCHECK(transport_->socket());
- DCHECK(!old_user_callback_ && user_callback_.is_null());
+ DCHECK(user_callback_.is_null());
// TODO(rch): figure out the right way to set up a tunnel with SPDY.
// This approach sends the complete HTTPS request to the proxy
@@ -147,7 +125,6 @@ void HttpProxyClientSocket::Disconnect() {
// Reset other states to make sure they aren't mistakenly used later.
// These are the states initialized by Connect().
next_state_ = STATE_NONE;
- old_user_callback_ = NULL;
user_callback_.Reset();
}
@@ -213,27 +190,8 @@ base::TimeDelta HttpProxyClientSocket::GetConnectTimeMicros() const {
}
int HttpProxyClientSocket::Read(IOBuffer* buf, int buf_len,
- OldCompletionCallback* callback) {
- DCHECK(!old_user_callback_ && user_callback_.is_null());
- if (next_state_ != STATE_DONE) {
- // We're trying to read the body of the response but we're still trying
- // to establish an SSL tunnel through the proxy. We can't read these
- // bytes when establishing a tunnel because they might be controlled by
- // an active network attacker. We don't worry about this for HTTP
- // because an active network attacker can already control HTTP sessions.
- // We reach this case when the user cancels a 407 proxy auth prompt.
- // See http://crbug.com/8473.
- DCHECK_EQ(407, response_.headers->response_code());
- LogBlockedTunnelResponse(response_.headers->response_code());
-
- return ERR_TUNNEL_CONNECTION_FAILED;
- }
-
- return transport_->socket()->Read(buf, buf_len, callback);
-}
-int HttpProxyClientSocket::Read(IOBuffer* buf, int buf_len,
const CompletionCallback& callback) {
- DCHECK(!old_user_callback_ && user_callback_.is_null());
+ DCHECK(user_callback_.is_null());
if (next_state_ != STATE_DONE) {
// We're trying to read the body of the response but we're still trying
// to establish an SSL tunnel through the proxy. We can't read these
@@ -252,9 +210,9 @@ int HttpProxyClientSocket::Read(IOBuffer* buf, int buf_len,
}
int HttpProxyClientSocket::Write(IOBuffer* buf, int buf_len,
- OldCompletionCallback* callback) {
+ const CompletionCallback& callback) {
DCHECK_EQ(STATE_DONE, next_state_);
- DCHECK(!old_user_callback_);
+ DCHECK(user_callback_.is_null());
return transport_->socket()->Write(buf, buf_len, callback);
}
@@ -321,19 +279,13 @@ void HttpProxyClientSocket::LogBlockedTunnelResponse(int response_code) const {
void HttpProxyClientSocket::DoCallback(int result) {
DCHECK_NE(ERR_IO_PENDING, result);
- DCHECK(old_user_callback_ || !user_callback_.is_null());
+ DCHECK(!user_callback_.is_null());
// Since Run() may result in Read being called,
- // clear old_user_callback_ up front.
- if (old_user_callback_) {
- OldCompletionCallback* c = old_user_callback_;
- old_user_callback_ = NULL;
- c->Run(result);
- } else {
- CompletionCallback c = user_callback_;
- user_callback_.Reset();
- c.Run(result);
- }
+ // clear user_callback_ up front.
+ CompletionCallback c = user_callback_;
+ user_callback_.Reset();
+ c.Run(result);
}
void HttpProxyClientSocket::OnIOComplete(int result) {