Merge a125f8677d into b4834a7d6d
This commit is contained in:
commit
1173d61dbc
14
lib/ws.c
14
lib/ws.c
@ -168,6 +168,7 @@ static void ws_dec_reset(struct ws_decoder *dec)
|
|||||||
dec->payload_len = 0;
|
dec->payload_len = 0;
|
||||||
dec->head_len = dec->head_total = 0;
|
dec->head_len = dec->head_total = 0;
|
||||||
dec->state = WS_DEC_INIT;
|
dec->state = WS_DEC_INIT;
|
||||||
|
dec->fin_bit = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ws_dec_init(struct ws_decoder *dec)
|
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;
|
dec->head[0] = *inbuf;
|
||||||
Curl_bufq_skip(inraw, 1);
|
Curl_bufq_skip(inraw, 1);
|
||||||
|
|
||||||
|
dec->fin_bit = (dec->head[0] & WSBIT_FIN) ? 1 : 0;
|
||||||
|
|
||||||
if(!ws_frame_rsv_supported(dec->head[0])) {
|
if(!ws_frame_rsv_supported(dec->head[0])) {
|
||||||
failf(data, "WS: unknown reserved bit in frame header: %x",
|
failf(data, "WS: unknown reserved bit in frame header: %x",
|
||||||
dec->head[0] & WSBIT_RSV_MASK);
|
dec->head[0] & WSBIT_RSV_MASK);
|
||||||
@ -370,11 +373,20 @@ static void update_meta(struct websocket *ws,
|
|||||||
curl_off_t payload_len,
|
curl_off_t payload_len,
|
||||||
size_t cur_len)
|
size_t cur_len)
|
||||||
{
|
{
|
||||||
|
curl_off_t bytesleft = (payload_len - payload_offset - cur_len);
|
||||||
|
|
||||||
ws->frame.age = frame_age;
|
ws->frame.age = frame_age;
|
||||||
ws->frame.flags = frame_flags;
|
ws->frame.flags = frame_flags;
|
||||||
ws->frame.offset = payload_offset;
|
ws->frame.offset = payload_offset;
|
||||||
ws->frame.len = cur_len;
|
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 */
|
/* WebSockets decoding client writer */
|
||||||
|
|||||||
1
lib/ws.h
1
lib/ws.h
@ -43,6 +43,7 @@ struct ws_decoder {
|
|||||||
unsigned char head[10];
|
unsigned char head[10];
|
||||||
int head_len, head_total;
|
int head_len, head_total;
|
||||||
enum ws_dec_state state;
|
enum ws_dec_state state;
|
||||||
|
int fin_bit;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* a client-side WS frame encoder, generating frame headers and
|
/* a client-side WS frame encoder, generating frame headers and
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user