From 1ca3a4fbe31df5b690e84d49d4734753be4ef8c9 Mon Sep 17 00:00:00 2001 From: MacDue Date: Tue, 15 Mar 2022 19:46:37 +0000 Subject: [PATCH] transport_ws: Parse and expose frame fin flag Note: esp_websocket_client still needs patching to expose this --- components/tcp_transport/include/esp_transport_ws.h | 10 ++++++++++ components/tcp_transport/transport_ws.c | 8 ++++++++ 2 files changed, 18 insertions(+) diff --git a/components/tcp_transport/include/esp_transport_ws.h b/components/tcp_transport/include/esp_transport_ws.h index 338b3fcd01..46eb0c7f9c 100644 --- a/components/tcp_transport/include/esp_transport_ws.h +++ b/components/tcp_transport/include/esp_transport_ws.h @@ -126,6 +126,16 @@ esp_err_t esp_transport_ws_set_config(esp_transport_handle_t t, const esp_transp */ int esp_transport_ws_send_raw(esp_transport_handle_t t, ws_transport_opcodes_t opcode, const char *b, int len, int timeout_ms); +/** + * @brief Returns websocket fin flag for last received data + * + * @param t websocket transport handle + * + * @return + * - Fin flag as a boolean + */ +bool esp_transport_ws_get_fin_flag(esp_transport_handle_t t); + /** * @brief Returns websocket op-code for last received data * diff --git a/components/tcp_transport/transport_ws.c b/components/tcp_transport/transport_ws.c index 38d4777366..95280f8113 100644 --- a/components/tcp_transport/transport_ws.c +++ b/components/tcp_transport/transport_ws.c @@ -41,6 +41,7 @@ static const char *TAG = "TRANSPORT_WS"; typedef struct { uint8_t opcode; + bool fin; /*!< Frame fin flag, for continuations */ char mask_key[4]; /*!< Mask key for this payload */ int payload_len; /*!< Total length of the payload */ int bytes_remaining; /*!< Bytes left to read of the payload */ @@ -382,6 +383,7 @@ static int ws_read_header(esp_transport_handle_t t, char *buffer, int len, int t return rlen; } ws->frame_state.header_received = true; + ws->frame_state.fin = (*data_ptr & 0x80) != 0; ws->frame_state.opcode = (*data_ptr & 0x0F); data_ptr ++; mask = ((*data_ptr >> 7) & 0x01); @@ -711,6 +713,12 @@ esp_err_t esp_transport_ws_set_config(esp_transport_handle_t t, const esp_transp return err; } +bool esp_transport_ws_get_fin_flag(esp_transport_handle_t t) +{ + transport_ws_t *ws = esp_transport_get_context_data(t); + return ws->frame_state.fin; +} + ws_transport_opcodes_t esp_transport_ws_get_read_opcode(esp_transport_handle_t t) { transport_ws_t *ws = esp_transport_get_context_data(t);