summaryrefslogtreecommitdiffstats
path: root/net/socket_stream/socket_stream.cc
diff options
context:
space:
mode:
Diffstat (limited to 'net/socket_stream/socket_stream.cc')
-rw-r--r--net/socket_stream/socket_stream.cc33
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);
}