diff --git a/lib/roles/ws/ops-ws.c b/lib/roles/ws/ops-ws.c index 37fbd34dc..3898457a0 100644 --- a/lib/roles/ws/ops-ws.c +++ b/lib/roles/ws/ops-ws.c @@ -723,7 +723,7 @@ utf8_fail: } #if !defined(LWS_WITHOUT_EXTENSIONS) - if (!lin) + if (!lin && !(already_processed & ALREADY_PROCESSED_FULL_DRAINING)) break; #endif diff --git a/lib/roles/ws/private-lib-roles-ws.h b/lib/roles/ws/private-lib-roles-ws.h index d0b087073..69033d6ce 100644 --- a/lib/roles/ws/private-lib-roles-ws.h +++ b/lib/roles/ws/private-lib-roles-ws.h @@ -75,6 +75,7 @@ enum lws_websocket_opcodes_07 { #define ALREADY_PROCESSED_IGNORE_CHAR 1 #define ALREADY_PROCESSED_NO_CB 2 +#define ALREADY_PROCESSED_FULL_DRAINING 4 #if !defined(LWS_WITHOUT_EXTENSIONS) struct lws_vhost_role_ws { diff --git a/lib/roles/ws/server-ws.c b/lib/roles/ws/server-ws.c index b8469a4c5..f746ab31d 100644 --- a/lib/roles/ws/server-ws.c +++ b/lib/roles/ws/server-ws.c @@ -1080,7 +1080,7 @@ lws_parse_ws(struct lws *wsi, unsigned char **buf, size_t len) wsi->ws->rx_draining_ext); #endif m = lws_ws_rx_sm(wsi, ALREADY_PROCESSED_IGNORE_CHAR | - ALREADY_PROCESSED_NO_CB, 0); + ALREADY_PROCESSED_NO_CB | ALREADY_PROCESSED_FULL_DRAINING, 0); } if (m < 0) {