diff options
author | Alex Graveley <alex@ximian.com> | 2002-04-30 16:24:22 +0000 |
---|---|---|
committer | Alex Graveley <orph@src.gnome.org> | 2002-04-30 16:24:22 +0000 |
commit | e011e6b534fe43c29afe040615ed8439152882cd (patch) | |
tree | cb11734223b60789a6bf12d962d05134cc408397 | |
parent | e730fe0658afb54c3b212e478ce46568ed4147ac (diff) | |
download | libsoup-e011e6b534fe43c29afe040615ed8439152882cd.tar.gz |
Loop on SSL_connect until it either returns error or success, blocking on
2002-04-30 Alex Graveley <alex@ximian.com>
* src/soup-ssl-proxy/soup-openssl.c (soup_openssl_get_iochannel):
Loop on SSL_connect until it either returns error or success,
blocking on need-read/need-write if necessary.
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | libsoup/soup-openssl.c | 26 |
2 files changed, 27 insertions, 5 deletions
@@ -1,3 +1,9 @@ +2002-04-30 Alex Graveley <alex@ximian.com> + + * src/soup-ssl-proxy/soup-openssl.c (soup_openssl_get_iochannel): + Loop on SSL_connect until it either returns error or success, + blocking on need-read/need-write if necessary. + 2002-04-26 Dan Winship <danw@ximian.com> * src/soup-ssl-proxy/soup-openssl.c (soup_openssl_read_cb): Fix diff --git a/libsoup/soup-openssl.c b/libsoup/soup-openssl.c index 3b836500..62ece5b5 100644 --- a/libsoup/soup-openssl.c +++ b/libsoup/soup-openssl.c @@ -285,11 +285,27 @@ soup_openssl_get_iochannel (GIOChannel *sock) goto THROW_CREATE_ERROR; } - SSL_connect (ssl); - if (err == 0) { - g_warning ("Secure connection could not be established."); - goto THROW_CREATE_ERROR; - } + do { + fd_set ssl_fdset; + + err = SSL_connect (ssl); + err = SSL_get_error (ssl, err); + + if (err == SSL_ERROR_WANT_READ) { + FD_ZERO (&ssl_fdset); + FD_SET (sockfd, &ssl_fdset); + select (sockfd + 1, &ssl_fdset, NULL, NULL, NULL); + } + else if (err == SSL_ERROR_WANT_WRITE) { + FD_ZERO (&ssl_fdset); + FD_SET (sockfd, &ssl_fdset); + select (sockfd + 1, NULL, &ssl_fdset, NULL, NULL); + } + else if (err != SSL_ERROR_NONE) { + g_warning ("Could not establish secure connection."); + goto THROW_CREATE_ERROR; + } + } while (err != SSL_ERROR_NONE); bits = SSL_get_cipher_bits (ssl, &alg_bits); if (bits == 0) { |