diff options
Diffstat (limited to 'cpp/src/IceSSL/ConnectorI.cpp')
-rw-r--r-- | cpp/src/IceSSL/ConnectorI.cpp | 128 |
1 files changed, 6 insertions, 122 deletions
diff --git a/cpp/src/IceSSL/ConnectorI.cpp b/cpp/src/IceSSL/ConnectorI.cpp index e1bad76f96b..feb4c4b4e89 100644 --- a/cpp/src/IceSSL/ConnectorI.cpp +++ b/cpp/src/IceSSL/ConnectorI.cpp @@ -43,7 +43,7 @@ IceSSL::ConnectorI::connect(int timeout) SOCKET fd = IceInternal::createSocket(false); IceInternal::setBlock(fd, false); IceInternal::setTcpBufSize(fd, _instance->communicator()->getProperties(), _logger); - IceInternal::doConnect(fd, _addr, timeout); + bool connected = IceInternal::doConnect(fd, _addr, timeout); // This static_cast is necessary due to 64bit windows. There SOCKET is a non-int type. BIO* bio = BIO_new_socket(static_cast<int>(fd), BIO_CLOSE); @@ -65,112 +65,11 @@ IceSSL::ConnectorI::connect(int timeout) } SSL_set_bio(ssl, bio, bio); - try - { - do - { - int result = SSL_connect(ssl); - switch(SSL_get_error(ssl, result)) - { - case SSL_ERROR_NONE: - break; - case SSL_ERROR_ZERO_RETURN: - { - ConnectionLostException ex(__FILE__, __LINE__); - ex.error = IceInternal::getSocketErrno(); - throw ex; - } - case SSL_ERROR_WANT_READ: - if(!selectRead(fd, timeout)) - { - throw ConnectTimeoutException(__FILE__, __LINE__); - } - break; - case SSL_ERROR_WANT_WRITE: - if(!selectWrite(fd, timeout)) - { - throw ConnectTimeoutException(__FILE__, __LINE__); - } - break; - case SSL_ERROR_SYSCALL: - { - if(result == -1) - { - if(IceInternal::interrupted()) - { - break; - } - - if(IceInternal::wouldBlock()) - { - if(SSL_want_read(ssl)) - { - if(!selectRead(fd, timeout)) - { - throw ConnectTimeoutException(__FILE__, __LINE__); - } - } - else if(SSL_want_write(ssl)) - { - if(!selectWrite(fd, timeout)) - { - throw ConnectTimeoutException(__FILE__, __LINE__); - } - } - - continue; - } - - if(IceInternal::connectionLost()) - { - ConnectionLostException ex(__FILE__, __LINE__); - ex.error = IceInternal::getSocketErrno(); - throw ex; - } - } - - if(result == 0) - { - ConnectionLostException ex(__FILE__, __LINE__); - ex.error = 0; - throw ex; - } - - SocketException ex(__FILE__, __LINE__); - ex.error = IceInternal::getSocketErrno(); - throw ex; - } - case SSL_ERROR_SSL: - { - ProtocolException ex(__FILE__, __LINE__); - ex.reason = "SSL error for new outgoing connection:\nremote address = " + - IceInternal::addrToString(_addr) + "\n" + _instance->sslErrors(); - throw ex; - } - } - } - while(!SSL_is_init_finished(ssl)); - - _instance->verifyPeer(ssl, fd, _host, "", false); - } - catch(...) - { - SSL_free(ssl); - throw; - } - - if(_instance->networkTraceLevel() >= 1) - { - Trace out(_logger, _instance->networkTraceCategory()); - out << "ssl connection established\n" << IceInternal::fdToString(fd); - } - - if(_instance->securityTraceLevel() >= 1) - { - _instance->traceConnection(ssl, false); - } - - return new TransceiverI(_instance, ssl, fd, false); + // + // SSL handshaking is performed in TransceiverI::initialize, since + // connect must not block. + // + return new TransceiverI(_instance, ssl, fd, connected, false); } Short @@ -248,21 +147,6 @@ IceSSL::ConnectorI::operator<(const IceInternal::Connector& r) const return IceInternal::compareAddress(_addr, p->_addr) == -1; } -bool -IceSSL::ConnectorI::equivalent(const string& host, int port) const -{ - struct sockaddr_in addr; - try - { - IceInternal::getAddress(host, port, addr); - } - catch(const DNSException&) - { - return false; - } - return IceInternal::compareAddress(_addr, addr) == 0; -} - IceSSL::ConnectorI::ConnectorI(const InstancePtr& instance, const struct sockaddr_in& addr, Ice::Int timeout, const string& connectionId) : _instance(instance), |