aboutsummaryrefslogtreecommitdiff
path: root/lib/sendf.c
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2002-01-08 23:19:32 +0000
committerDaniel Stenberg <daniel@haxx.se>2002-01-08 23:19:32 +0000
commiteecb86bfb0cd0fada5bdeb3c8d069f194b08208b (patch)
tree39c3d8dffceeab1dc80744a442d112b31b370054 /lib/sendf.c
parent0b1197936c488950041cc54db9db9af1d82ea0b8 (diff)
this seems to correct the SSL reading problem introduced when switching
over to non-blocking sockets, but this loops very nastily. We should return back to the select() and wait there until more data arrives, not just blindly attempt again and again...
Diffstat (limited to 'lib/sendf.c')
-rw-r--r--lib/sendf.c25
1 files changed, 20 insertions, 5 deletions
diff --git a/lib/sendf.c b/lib/sendf.c
index ad144edd8..78581f585 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