Index: net/socket_stream/socket_stream.cc |
diff --git a/net/socket_stream/socket_stream.cc b/net/socket_stream/socket_stream.cc |
index 46cb1e5bd0b68cab6c3ec695638d24140a0f3e97..3bc6da4ac28b39b73dedfc5d47e08fd491f3454a 100644 |
--- a/net/socket_stream/socket_stream.cc |
+++ b/net/socket_stream/socket_stream.cc |
@@ -63,6 +63,9 @@ SocketStream::SocketStream(const GURL& url, Delegate* delegate) |
server_bound_cert_service_(NULL), |
http_auth_handler_factory_(NULL), |
factory_(ClientSocketFactory::GetDefaultFactory()), |
+ ALLOW_THIS_IN_INITIALIZER_LIST(before_connect_callback_( |
+ base::Bind(&SocketStream::BeforeConnectComplete, |
+ base::Unretained(this)))), |
proxy_mode_(kDirectConnection), |
proxy_url_(url), |
pac_request_(NULL), |
@@ -147,7 +150,7 @@ void SocketStream::Connect() { |
AddRef(); // Released in Finish() |
// Open a connection asynchronously, so that delegate won't be called |
// back before returning Connect(). |
- next_state_ = STATE_RESOLVE_PROXY; |
+ next_state_ = STATE_BEFORE_CONNECT; |
net_log_.BeginEvent( |
NetLog::TYPE_SOCKET_STREAM_CONNECT, |
make_scoped_refptr( |
@@ -410,6 +413,10 @@ void SocketStream::DoLoop(int result) { |
State state = next_state_; |
next_state_ = STATE_NONE; |
switch (state) { |
+ case STATE_BEFORE_CONNECT: |
+ DCHECK_EQ(OK, result); |
+ result = DoBeforeConnect(); |
+ break; |
case STATE_RESOLVE_PROXY: |
DCHECK_EQ(OK, result); |
result = DoResolveProxy(); |
@@ -511,6 +518,19 @@ void SocketStream::DoLoop(int result) { |
} while (result != ERR_IO_PENDING); |
} |
+int SocketStream::DoBeforeConnect() { |
+ next_state_ = STATE_RESOLVE_PROXY; |
+ if (!context_ || !context_->network_delegate()) |
+ return OK; |
+ |
+ int result = context_->network_delegate()->NotifyBeforeSocketStreamConnect( |
+ this, before_connect_callback_); |
+ if (result != OK && result != ERR_IO_PENDING) |
+ next_state_ = STATE_CLOSE; |
+ |
+ return result; |
+} |
+ |
int SocketStream::DoResolveProxy() { |
DCHECK(!pac_request_); |
next_state_ = STATE_RESOLVE_PROXY_COMPLETE; |
@@ -1072,6 +1092,16 @@ int SocketStream::DoReadWrite(int result) { |
return ERR_IO_PENDING; |
} |
+void SocketStream::BeforeConnectComplete(int result) { |
+ DCHECK_NE(ERR_IO_PENDING, result); |
+ |
+ if (result == OK) |
+ next_state_ = STATE_RESOLVE_PROXY; |
+ else |
+ next_state_ = STATE_CLOSE; |
+ DoLoop(result); |
+} |
+ |
GURL SocketStream::ProxyAuthOrigin() const { |
DCHECK(!proxy_info_.is_empty()); |
return GURL("http://" + |