diff --git a/lib/roles/ws/ops-ws.c b/lib/roles/ws/ops-ws.c index 3898457a0..3282d3dfe 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 && !(already_processed & ALREADY_PROCESSED_FULL_DRAINING)) + if (!lin) break; #endif @@ -1223,8 +1223,18 @@ drain: else pending = pending > wsi->a.context->pt_serv_buf_size ? wsi->a.context->pt_serv_buf_size : pending; - if (--sanity) + if (--sanity) { +#if !defined(LWS_WITHOUT_EXTENSIONS) + while (wsi->ws->rx_draining_ext) { + // RX Extension needs to be drained before next read + n = lws_ws_rx_sm(wsi, ALREADY_PROCESSED_IGNORE_CHAR, 0); + if (n < 0) { + return LWS_HPI_RET_PLEASE_CLOSE_ME; + } + } +#endif goto read; + } else /* * Something has gone wrong, we are spinning... diff --git a/lib/roles/ws/private-lib-roles-ws.h b/lib/roles/ws/private-lib-roles-ws.h index 69033d6ce..d0b087073 100644 --- a/lib/roles/ws/private-lib-roles-ws.h +++ b/lib/roles/ws/private-lib-roles-ws.h @@ -75,7 +75,6 @@ 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 f746ab31d..b8469a4c5 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 | ALREADY_PROCESSED_FULL_DRAINING, 0); + ALREADY_PROCESSED_NO_CB, 0); } if (m < 0) {