diff --git a/lib/sendf.c b/lib/sendf.c index ad144edd884c25ffafa1a617d9bb2e313467b713..78581f5855cad47ab0bdac58583ee979ccd0a411 100644 --- a/lib/sendf.c +++ b/lib/sendf.c @@ -279,13 +279,28 @@ CURLcode Curl_read(struct connectdata *conn, int sockfd, #ifdef USE_SSLEAY if (conn->ssl.use) { - int loop=100; /* just a precaution to never loop endlessly */ - while(loop--) { + bool loop=TRUE; + int err; + do { nread = SSL_read(conn->ssl.handle, buf, buffersize); - if((-1 != nread) || - (SSL_ERROR_WANT_READ != SSL_get_error(conn->ssl.handle, nread) )) + + if(nread > 0) + /* successful read */ break; - } + + err = SSL_get_error(conn->ssl.handle, nread); + + switch(err) { + case SSL_ERROR_NONE: /* this is not an error */ + case SSL_ERROR_ZERO_RETURN: /* no more data */ + loop=0; /* get out of loop */ + break; + case SSL_ERROR_WANT_READ: + case SSL_ERROR_WANT_WRITE: + /* if there's data pending, then we re-invoke SSL_read() */ + break; + } + } while(loop && SSL_pending(conn->ssl.handle)); } else { #endif