From 28b722a4c03b62a5d7dc2b2265e4fc01796c99eb Mon Sep 17 00:00:00 2001 From: roberte777 Date: Thu, 27 Feb 2025 16:21:28 -0600 Subject: [PATCH 1/2] fix: corrected curlws_cont to reflect its documented purpose --- lib/ws.c | 14 +++++++++++++- lib/ws.h | 1 + 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/ws.c b/lib/ws.c index 2ce0b48455..cafda7dfd9 100644 --- a/lib/ws.c +++ b/lib/ws.c @@ -168,6 +168,7 @@ static void ws_dec_reset(struct ws_decoder *dec) dec->payload_len = 0; dec->head_len = dec->head_total = 0; dec->state = WS_DEC_INIT; + dec->fin_bit = 1; } static void ws_dec_init(struct ws_decoder *dec) @@ -187,6 +188,8 @@ static CURLcode ws_dec_read_head(struct ws_decoder *dec, dec->head[0] = *inbuf; Curl_bufq_skip(inraw, 1); + dec->fin_bit = (dec->head[0] & WSBIT_FIN) ? 1 : 0; + if(!ws_frame_rsv_supported(dec->head[0])) { failf(data, "WS: unknown reserved bit in frame header: %x", dec->head[0] & WSBIT_RSV_MASK); @@ -370,11 +373,20 @@ static void update_meta(struct websocket *ws, curl_off_t payload_len, size_t cur_len) { + curl_off_t bytesleft = (payload_len - payload_offset - cur_len); + ws->frame.age = frame_age; ws->frame.flags = frame_flags; ws->frame.offset = payload_offset; ws->frame.len = cur_len; - ws->frame.bytesleft = (payload_len - payload_offset - cur_len); + ws->frame.bytesleft = bytesleft; + + if(!ws->dec.fin_bit || bytesleft > 0) { + ws->frame.flags |= CURLWS_CONT; + } + else { + ws->frame.flags &= ~CURLWS_CONT; + } } /* WebSockets decoding client writer */ diff --git a/lib/ws.h b/lib/ws.h index c96bccab9f..949dead7a2 100644 --- a/lib/ws.h +++ b/lib/ws.h @@ -43,6 +43,7 @@ struct ws_decoder { unsigned char head[10]; int head_len, head_total; enum ws_dec_state state; + int fin_bit; }; /* a client-side WS frame encoder, generating frame headers and From a125f8677db19d02a3a65811a006acbf258f247c Mon Sep 17 00:00:00 2001 From: roberte777 Date: Thu, 27 Feb 2025 16:31:14 -0600 Subject: [PATCH 2/2] fix: whitespace --- lib/ws.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/ws.c b/lib/ws.c index cafda7dfd9..71196c0526 100644 --- a/lib/ws.c +++ b/lib/ws.c @@ -374,13 +374,13 @@ static void update_meta(struct websocket *ws, size_t cur_len) { curl_off_t bytesleft = (payload_len - payload_offset - cur_len); - + ws->frame.age = frame_age; ws->frame.flags = frame_flags; ws->frame.offset = payload_offset; ws->frame.len = cur_len; ws->frame.bytesleft = bytesleft; - + if(!ws->dec.fin_bit || bytesleft > 0) { ws->frame.flags |= CURLWS_CONT; }