diff options
Diffstat (limited to 'net/socket/ssl_client_socket_win.cc')
-rw-r--r-- | net/socket/ssl_client_socket_win.cc | 43 |
1 files changed, 36 insertions, 7 deletions
diff --git a/net/socket/ssl_client_socket_win.cc b/net/socket/ssl_client_socket_win.cc index 1e42414..d1ed130 100644 --- a/net/socket/ssl_client_socket_win.cc +++ b/net/socket/ssl_client_socket_win.cc @@ -397,7 +397,7 @@ SSLClientSocketWin::SSLClientSocketWin(ClientSocketHandle* transport_socket, transport_(transport_socket), host_and_port_(host_and_port), ssl_config_(ssl_config), - user_connect_callback_(NULL), + old_user_connect_callback_(NULL), user_read_callback_(NULL), user_read_buf_len_(0), user_write_callback_(NULL), @@ -565,7 +565,30 @@ SSLClientSocketWin::GetNextProto(std::string* proto, int SSLClientSocketWin::Connect(OldCompletionCallback* callback) { DCHECK(transport_.get()); DCHECK(next_state_ == STATE_NONE); - DCHECK(!user_connect_callback_); + DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null()); + + net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT, NULL); + + int rv = InitializeSSLContext(); + if (rv != OK) { + net_log_.EndEvent(NetLog::TYPE_SSL_CONNECT, NULL); + return rv; + } + + writing_first_token_ = true; + next_state_ = STATE_HANDSHAKE_WRITE; + rv = DoLoop(OK); + if (rv == ERR_IO_PENDING) { + old_user_connect_callback_ = callback; + } else { + net_log_.EndEvent(NetLog::TYPE_SSL_CONNECT, NULL); + } + return rv; +} +int SSLClientSocketWin::Connect(const CompletionCallback& callback) { + DCHECK(transport_.get()); + DCHECK(next_state_ == STATE_NONE); + DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null()); net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT, NULL); @@ -842,7 +865,7 @@ void SSLClientSocketWin::OnHandshakeIOComplete(int result) { // If there is no connect callback available to call, we are renegotiating // (which occurs because we are in the middle of a Read when the // renegotiation process starts). So we complete the Read here. - if (!user_connect_callback_) { + if (!old_user_connect_callback_ && user_connect_callback_.is_null()) { OldCompletionCallback* c = user_read_callback_; user_read_callback_ = NULL; user_read_buf_ = NULL; @@ -851,9 +874,15 @@ void SSLClientSocketWin::OnHandshakeIOComplete(int result) { return; } net_log_.EndEvent(NetLog::TYPE_SSL_CONNECT, NULL); - OldCompletionCallback* c = user_connect_callback_; - user_connect_callback_ = NULL; - c->Run(rv); + if (old_user_connect_callback_) { + OldCompletionCallback* c = old_user_connect_callback_; + old_user_connect_callback_ = NULL; + c->Run(rv); + } else { + CompletionCallback c = user_connect_callback_; + user_connect_callback_.Reset(); + c.Run(rv); + } } } @@ -1549,7 +1578,7 @@ int SSLClientSocketWin::DidCompleteHandshake() { // Called when a renegotiation is completed. |result| is the verification // result of the server certificate received during renegotiation. void SSLClientSocketWin::DidCompleteRenegotiation() { - DCHECK(!user_connect_callback_); + DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null()); DCHECK(user_read_callback_); renegotiating_ = false; next_state_ = STATE_COMPLETED_RENEGOTIATION; |