Index: net/socket/ssl_client_socket_openssl.cc |
diff --git a/net/socket/ssl_client_socket_openssl.cc b/net/socket/ssl_client_socket_openssl.cc |
index 14b5790290651ec8dff75c60f96188490d98defa..79c299713573009f4972eb26fcc8fda6ff669fae 100644 |
--- a/net/socket/ssl_client_socket_openssl.cc |
+++ b/net/socket/ssl_client_socket_openssl.cc |
@@ -390,7 +390,7 @@ SSLClientSocketOpenSSL::SSLClientSocketOpenSSL( |
this, &SSLClientSocketOpenSSL::BufferRecvComplete)), |
transport_send_busy_(false), |
transport_recv_busy_(false), |
- user_connect_callback_(NULL), |
+ old_user_connect_callback_(NULL), |
user_read_callback_(NULL), |
user_write_callback_(NULL), |
completed_handshake_(false), |
@@ -648,6 +648,29 @@ int SSLClientSocketOpenSSL::Connect(OldCompletionCallback* callback) { |
GotoState(STATE_HANDSHAKE); |
int rv = DoHandshakeLoop(net::OK); |
if (rv == ERR_IO_PENDING) { |
+ old_user_connect_callback_ = callback; |
+ } else { |
+ net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); |
+ } |
+ |
+ return rv > OK ? OK : rv; |
+} |
+int SSLClientSocketOpenSSL::Connect(const CompletionCallback& callback) { |
+ net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT, NULL); |
+ |
+ // Set up new ssl object. |
+ if (!Init()) { |
+ int result = ERR_UNEXPECTED; |
+ net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, result); |
+ return result; |
+ } |
+ |
+ // Set SSL to client mode. Handshake happens in the loop below. |
+ SSL_set_connect_state(ssl_); |
+ |
+ GotoState(STATE_HANDSHAKE); |
+ int rv = DoHandshakeLoop(net::OK); |
+ if (rv == ERR_IO_PENDING) { |
user_connect_callback_ = callback; |
} else { |
net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); |
@@ -676,7 +699,8 @@ void SSLClientSocketOpenSSL::Disconnect() { |
transport_recv_busy_ = false; |
recv_buffer_ = NULL; |
- user_connect_callback_ = NULL; |
+ old_user_connect_callback_ = NULL; |
+ user_connect_callback_.Reset(); |
user_read_callback_ = NULL; |
user_write_callback_ = NULL; |
user_read_buf_ = NULL; |
@@ -1017,9 +1041,15 @@ void SSLClientSocketOpenSSL::TransportReadComplete(int result) { |
} |
void SSLClientSocketOpenSSL::DoConnectCallback(int rv) { |
- OldCompletionCallback* c = user_connect_callback_; |
- user_connect_callback_ = NULL; |
- c->Run(rv > OK ? OK : rv); |
+ if (old_user_connect_callback_) { |
+ OldCompletionCallback* c = old_user_connect_callback_; |
+ old_user_connect_callback_ = NULL; |
+ c->Run(rv > OK ? OK : rv); |
+ } else { |
+ CompletionCallback c = user_connect_callback_; |
+ user_connect_callback_.Reset(); |
+ c.Run(rv > OK ? OK : rv); |
+ } |
} |
void SSLClientSocketOpenSSL::OnHandshakeIOComplete(int result) { |