summaryrefslogtreecommitdiff
path: root/libsoup/soup-openssl.c
diff options
context:
space:
mode:
Diffstat (limited to 'libsoup/soup-openssl.c')
-rw-r--r--libsoup/soup-openssl.c26
1 files changed, 21 insertions, 5 deletions
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) {