File httpfs-EAGAIN of Package httpfs
# HG changeset patch
# User porton
# Date 1653940178 -10800
# Mon May 30 22:49:38 2022 +0300
# Node ID 068c0fd6d16b7339a05e43231fb5166d825e781a
# Parent 4016a53779eb0241525bbc4ea44838fe324c252d
Handle EAGAIN in server communication.
diff -r 4016a53779eb -r 068c0fd6d16b httpfs2.c
--- a/httpfs2.c Wed Aug 10 16:50:34 2016 +0200
+++ b/httpfs2.c Mon May 30 22:49:38 2022 +0300
@@ -1210,12 +1210,15 @@
if (url->proto == PROTO_HTTPS) {
do {
res = gnutls_record_recv(url->ss, buf, len);
- } while ((res < 0) && handle_ssl_error(url, &res, "read"));
+ } while (res == GNUTLS_E_AGAIN || ((res < 0) && handle_ssl_error(url, &res, "read")));
if (res <= 0) ssl_error(res, url, "read");
} else
#endif
{
- res = read(url->sockfd, buf, len);
+ do {
+ errno = 0;
+ res = read(url->sockfd, buf, len);
+ } while(errno == EAGAIN);
if (res <= 0) errno_report("read");
}
return res;
@@ -1233,12 +1236,15 @@
if (url->proto == PROTO_HTTPS) {
do {
res = gnutls_record_send(url->ss, buf, len);
- } while ((res < 0) && handle_ssl_error(url, &res, "write"));
+ } while (res == GNUTLS_E_AGAIN || ((res < 0) && handle_ssl_error(url, &res, "write")));
if (res <= 0) ssl_error(res, url, "write");
} else
#endif
{
- res = write(url->sockfd, buf, len);
+ do {
+ errno = 0;
+ res = write(url->sockfd, buf, len);
+ } while(errno == EAGAIN);
if (res <= 0) errno_report("write");
}
if ( !(res <= 0) || (url->sock_type != SOCK_KEEPALIVE )) return res;