https: handle TLS_WANT_POLLIN and TLS_WANT_POLLOUT - frontends - front-ends for some sites (experiment)
DIR Log
DIR Files
DIR Refs
DIR README
DIR LICENSE
---
DIR commit f2a7bc67a3a4b1fae29f35192fc6ad566041bfc3
DIR parent edb55dfa30e8bca53391c23e22fbe0207ae78645
HTML Author: Hiltjo Posthuma <hiltjo@codemadness.org>
Date: Tue, 19 May 2020 15:39:50 +0200
https: handle TLS_WANT_POLLIN and TLS_WANT_POLLOUT
Handle this for tls_read() and tls_write() like the idiom suggests in the man
page.
Diffstat:
M https.c | 22 ++++++++++++++++++----
1 file changed, 18 insertions(+), 4 deletions(-)
---
DIR diff --git a/https.c b/https.c
@@ -56,14 +56,18 @@ readtls(struct tls *t)
if (!(buf = realloc(buf, size + 1)))
die("realloc: %s\n", strerror(errno));
}
- if ((r = tls_read(t, &buf[len], READ_BUF_SIZ)) <= 0)
+ r = tls_read(t, &buf[len], READ_BUF_SIZ);
+ if (r == TLS_WANT_POLLIN || r == TLS_WANT_POLLOUT) {
+ continue;
+ } else if (r <= 0) {
break;
+ }
len += r;
buf[len] = '\0';
if (len > MAX_RESPONSESIZ)
die("response is too big: > %zu bytes\n", MAX_RESPONSESIZ);
}
- if (r < 0)
+ if (r == -1)
die("tls_read: %s\n", tls_error(t));
return buf;
@@ -125,6 +129,7 @@ request(const char *host, const char *path, const char *headers)
struct tls *t;
char request[4096];
char *data;
+ size_t len;
ssize_t w;
int fd;
@@ -148,8 +153,17 @@ request(const char *host, const char *path, const char *headers)
if (tls_connect_socket(t, fd, host) == -1)
die("tls_connect: %s\n", tls_error(t));
- if ((w = tls_write(t, request, strlen(request))) < 0)
- die("tls_write: %s\n", tls_error(t));
+ data = request;
+ len = strlen(data);
+ while (len > 0) {
+ w = tls_write(t, data, len);
+ if (w == TLS_WANT_POLLIN || w == TLS_WANT_POLLOUT)
+ continue;
+ else if (w == -1)
+ die("tls_write: %s\n", tls_error(t));
+ data += w;
+ len -= w;
+ }
data = readtls(t);