diff options
Diffstat (limited to 'net/socket_stream/socket_stream.cc')
-rw-r--r-- | net/socket_stream/socket_stream.cc | 33 |
1 files changed, 20 insertions, 13 deletions
diff --git a/net/socket_stream/socket_stream.cc b/net/socket_stream/socket_stream.cc index 254935a..e948570 100644 --- a/net/socket_stream/socket_stream.cc +++ b/net/socket_stream/socket_stream.cc @@ -10,6 +10,8 @@ #include <set> #include <string> +#include "base/bind.h" +#include "base/bind_helpers.h" #include "base/compiler_specific.h" #include "base/logging.h" #include "base/message_loop.h" @@ -62,12 +64,17 @@ SocketStream::SocketStream(const GURL& url, Delegate* delegate) proxy_mode_(kDirectConnection), proxy_url_(url), pac_request_(NULL), + // Unretained() is required; without it, Bind() creates a circular + // dependency and the SocketStream object will not be freed. ALLOW_THIS_IN_INITIALIZER_LIST( - io_callback_(this, &SocketStream::OnIOCompleted)), + io_callback_(base::Bind(&SocketStream::OnIOCompleted, + base::Unretained(this)))), ALLOW_THIS_IN_INITIALIZER_LIST( - read_callback_(this, &SocketStream::OnReadCompleted)), + io_callback_old_(this, &SocketStream::OnIOCompleted)), ALLOW_THIS_IN_INITIALIZER_LIST( - write_callback_(this, &SocketStream::OnWriteCompleted)), + read_callback_old_(this, &SocketStream::OnReadCompleted)), + ALLOW_THIS_IN_INITIALIZER_LIST( + write_callback_old_(this, &SocketStream::OnWriteCompleted)), read_buf_(NULL), write_buf_(NULL), current_write_buf_(NULL), @@ -548,7 +555,7 @@ int SocketStream::DoResolveProxy() { // Alternate-Protocol header here for ws:// or TLS NPN extension for wss:// . return proxy_service()->ResolveProxy( - proxy_url_, &proxy_info_, &io_callback_, &pac_request_, net_log_); + proxy_url_, &proxy_info_, &io_callback_old_, &pac_request_, net_log_); } int SocketStream::DoResolveProxyComplete(int result) { @@ -625,7 +632,7 @@ int SocketStream::DoResolveHostComplete(int result) { int SocketStream::DoResolveProtocol(int result) { DCHECK_EQ(OK, result); next_state_ = STATE_RESOLVE_PROTOCOL_COMPLETE; - result = delegate_->OnStartOpenConnection(this, &io_callback_); + result = delegate_->OnStartOpenConnection(this, io_callback_); if (result == ERR_IO_PENDING) metrics_->OnWaitConnection(); else if (result != OK && result != ERR_PROTOCOL_SWITCHED) @@ -661,7 +668,7 @@ int SocketStream::DoTcpConnect(int result) { net_log_.net_log(), net_log_.source())); metrics_->OnStartConnection(); - return socket_->Connect(&io_callback_); + return socket_->Connect(&io_callback_old_); } int SocketStream::DoTcpConnectComplete(int result) { @@ -754,7 +761,7 @@ int SocketStream::DoWriteTunnelHeaders() { int buf_len = static_cast<int>(tunnel_request_headers_->headers_.size() - tunnel_request_headers_bytes_sent_); DCHECK_GT(buf_len, 0); - return socket_->Write(tunnel_request_headers_, buf_len, &io_callback_); + return socket_->Write(tunnel_request_headers_, buf_len, &io_callback_old_); } int SocketStream::DoWriteTunnelHeadersComplete(int result) { @@ -791,7 +798,7 @@ int SocketStream::DoReadTunnelHeaders() { tunnel_response_headers_->SetDataOffset(tunnel_response_headers_len_); CHECK(tunnel_response_headers_->data()); - return socket_->Read(tunnel_response_headers_, buf_len, &io_callback_); + return socket_->Read(tunnel_response_headers_, buf_len, &io_callback_old_); } int SocketStream::DoReadTunnelHeadersComplete(int result) { @@ -888,7 +895,7 @@ int SocketStream::DoSOCKSConnect() { s = new SOCKSClientSocket(s, req_info, host_resolver_); socket_.reset(s); metrics_->OnCountConnectionType(SocketStreamMetrics::SOCKS_CONNECTION); - return socket_->Connect(&io_callback_); + return socket_->Connect(&io_callback_old_); } int SocketStream::DoSOCKSConnectComplete(int result) { @@ -919,7 +926,7 @@ int SocketStream::DoSecureProxyConnect() { ssl_context)); next_state_ = STATE_SECURE_PROXY_CONNECT_COMPLETE; metrics_->OnCountConnectionType(SocketStreamMetrics::SECURE_PROXY_CONNECTION); - return socket_->Connect(&io_callback_); + return socket_->Connect(&io_callback_old_); } int SocketStream::DoSecureProxyConnectComplete(int result) { @@ -949,7 +956,7 @@ int SocketStream::DoSSLConnect() { ssl_context)); next_state_ = STATE_SSL_CONNECT_COMPLETE; metrics_->OnCountConnectionType(SocketStreamMetrics::SSL_CONNECTION); - return socket_->Connect(&io_callback_); + return socket_->Connect(&io_callback_old_); } int SocketStream::DoSSLConnectComplete(int result) { @@ -994,7 +1001,7 @@ int SocketStream::DoReadWrite(int result) { if (!read_buf_) { // No read pending and server didn't close the socket. read_buf_ = new IOBuffer(kReadBufferSize); - result = socket_->Read(read_buf_, kReadBufferSize, &read_callback_); + result = socket_->Read(read_buf_, kReadBufferSize, &read_callback_old_); if (result > 0) { return DidReceiveData(result); } else if (result == 0) { @@ -1022,7 +1029,7 @@ int SocketStream::DoReadWrite(int result) { current_write_buf_->SetOffset(write_buf_offset_); result = socket_->Write(current_write_buf_, current_write_buf_->BytesRemaining(), - &write_callback_); + &write_callback_old_); if (result > 0) { return DidSendData(result); } |