| 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) {
|
|
|