From 27ad2413d4942503f6c472a1eef5a14b26ec176a Mon Sep 17 00:00:00 2001 From: Jessie Murray Date: Sat, 24 Jul 2021 14:05:28 -0700 Subject: [PATCH] Immediately close WS connection on error The implementation was waiting for the client, which leaves some hanging even after they called close(). This mirrors the behavior for HTTP connections in client.c where close() is called right before http_client_free. --- src/worker.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/worker.c b/src/worker.c index d5decef..876dd16 100644 --- a/src/worker.c +++ b/src/worker.c @@ -55,7 +55,10 @@ worker_can_read(int fd, short event, void *p) { if(c->is_websocket) { /* Got websocket data */ - ws_add_data(c); + int add_ret = ws_add_data(c); + if(add_ret == WS_ERROR) { + c->broken = 1; /* likely connection was closed */ + } } else { /* run parser */ nparsed = http_client_execute(c); @@ -87,6 +90,9 @@ worker_can_read(int fd, short event, void *p) { } if(c->broken) { /* terminate client */ + if(c->is_websocket) { /* only close for WS since HTTP might use keep-alive */ + close(c->fd); + } http_client_free(c); } else { /* start monitoring input again */