Index: jingle/notifier/base/proxy_resolving_client_socket.cc |
diff --git a/jingle/notifier/base/proxy_resolving_client_socket.cc b/jingle/notifier/base/proxy_resolving_client_socket.cc |
index 4c31ba3d017171246d01c0c112d87237b3e439ff..b3a95f946e36df80e4cc95f7e5fb0385c928cef3 100644 |
--- a/jingle/notifier/base/proxy_resolving_client_socket.cc |
+++ b/jingle/notifier/base/proxy_resolving_client_socket.cc |
@@ -37,7 +37,7 @@ ProxyResolvingClientSocket::ProxyResolvingClientSocket( |
request_context_getter->GetURLRequestContext()->net_log(), |
net::NetLog::SOURCE_SOCKET)), |
ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)), |
- user_connect_callback_(NULL) { |
+ old_user_connect_callback_(NULL) { |
DCHECK(request_context_getter); |
net::URLRequestContext* request_context = |
request_context_getter->GetURLRequestContext(); |
@@ -97,7 +97,35 @@ bool ProxyResolvingClientSocket::SetSendBufferSize(int32 size) { |
} |
int ProxyResolvingClientSocket::Connect(net::OldCompletionCallback* callback) { |
- DCHECK(!user_connect_callback_); |
+ DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null()); |
+ |
+ tried_direct_connect_fallback_ = false; |
+ |
+ // First we try and resolve the proxy. |
+ GURL url("http://" + dest_host_port_pair_.ToString()); |
+ int status = network_session_->proxy_service()->ResolveProxy( |
+ url, |
+ &proxy_info_, |
+ &proxy_resolve_callback_, |
+ &pac_request_, |
+ bound_net_log_); |
+ if (status != net::ERR_IO_PENDING) { |
+ // We defer execution of ProcessProxyResolveDone instead of calling it |
+ // directly here for simplicity. From the caller's point of view, |
+ // the connect always happens asynchronously. |
+ MessageLoop* message_loop = MessageLoop::current(); |
+ CHECK(message_loop); |
+ message_loop->PostTask( |
+ FROM_HERE, |
+ base::Bind(&ProxyResolvingClientSocket::ProcessProxyResolveDone, |
+ weak_factory_.GetWeakPtr(), status)); |
+ } |
+ old_user_connect_callback_ = callback; |
+ return net::ERR_IO_PENDING; |
+} |
+int ProxyResolvingClientSocket::Connect( |
+ const net::CompletionCallback& callback) { |
+ DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null()); |
tried_direct_connect_fallback_ = false; |
@@ -126,9 +154,16 @@ int ProxyResolvingClientSocket::Connect(net::OldCompletionCallback* callback) { |
void ProxyResolvingClientSocket::RunUserConnectCallback(int status) { |
DCHECK_LE(status, net::OK); |
- net::OldCompletionCallback* user_connect_callback = user_connect_callback_; |
- user_connect_callback_ = NULL; |
- user_connect_callback->Run(status); |
+ if (old_user_connect_callback_) { |
+ net::OldCompletionCallback* user_connect_callback = |
+ old_user_connect_callback_; |
+ old_user_connect_callback_ = NULL; |
+ user_connect_callback->Run(status); |
+ } else { |
+ net::CompletionCallback user_connect_callback = user_connect_callback_; |
+ user_connect_callback_.Reset(); |
+ user_connect_callback.Run(status); |
+ } |
} |
// Always runs asynchronously. |
@@ -287,7 +322,8 @@ void ProxyResolvingClientSocket::Disconnect() { |
CloseTransportSocket(); |
if (pac_request_) |
network_session_->proxy_service()->CancelPacRequest(pac_request_); |
- user_connect_callback_ = NULL; |
+ old_user_connect_callback_ = NULL; |
+ user_connect_callback_.Reset(); |
} |
bool ProxyResolvingClientSocket::IsConnected() const { |