From 5f71bf77bafeb05db00ee042da3543673d78385d Mon Sep 17 00:00:00 2001 From: Shawn Presser Date: Wed, 12 Aug 2020 21:28:42 -0700 Subject: [PATCH 1/2] Ensure websockets write all data --- src/websocket.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/websocket.c b/src/websocket.c index 4dae630c..35c28f67 100644 --- a/src/websocket.c +++ b/src/websocket.c @@ -77,10 +77,26 @@ ws_compute_handshake(struct http_client *c, char *out, size_t *out_sz) { return 0; } + +void +ws_write_all(int socket, void *buffer, size_t length) { + size_t written = 0; + int n; + while (written < length) { + int n = write(socket, (char*)buffer + written, length - written); + if (n <= 0) { + if (errno == EINTR || errno == EAGAIN) + continue; + err(EXIT_FAILURE, "Could not write() data"); + } + written += n; + } +} + + int ws_handshake_reply(struct http_client *c) { - int ret; char sha1_handshake[40]; char *buffer = NULL, *p; const char *origin = NULL, *host = NULL; @@ -159,8 +175,7 @@ ws_handshake_reply(struct http_client *c) { p += sizeof(template4)-1; /* send data to client */ - ret = write(c->fd, buffer, sz); - (void)ret; + ws_write_all(c->fd, buffer, sz); free(buffer); return 0; From ce3612347404dd0e6a4a6a5cd1a228a3814a9a3c Mon Sep 17 00:00:00 2001 From: Shawn Presser Date: Wed, 12 Aug 2020 21:28:59 -0700 Subject: [PATCH 2/2] Always keep_alive every websocket --- src/websocket.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/websocket.c b/src/websocket.c index 35c28f67..b1111950 100644 --- a/src/websocket.c +++ b/src/websocket.c @@ -380,9 +380,7 @@ ws_reply(struct cmd *cmd, const char *p, size_t sz) { /* send WS frame */ r = http_response_init(cmd->w, 0, NULL); - if (cmd_is_subscribe(cmd)) { - r->keep_alive = 1; - } + r->keep_alive = 1; if (r == NULL) return -1;