summaryrefslogtreecommitdiff
path: root/cpp/src/IceSSL/ConnectorI.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/IceSSL/ConnectorI.cpp')
-rw-r--r--cpp/src/IceSSL/ConnectorI.cpp128
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),