From 9feedcbf4e1647f05f06d895aaf7faab63e779d4 Mon Sep 17 00:00:00 2001 From: surengab Date: Fri, 23 Jan 2026 14:39:02 +0400 Subject: [PATCH] fix(transport_ws): optimize ws polling and fix read error logging --- components/tcp_transport/transport_ws.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/components/tcp_transport/transport_ws.c b/components/tcp_transport/transport_ws.c index 78d8c10f7be..46c00d9f005 100644 --- a/components/tcp_transport/transport_ws.c +++ b/components/tcp_transport/transport_ws.c @@ -514,7 +514,9 @@ static int ws_read_payload(esp_transport_handle_t t, char *buffer, int len, int // Receive and process payload if (bytes_to_read != 0 && (rlen = esp_transport_read_internal(ws, buffer, bytes_to_read, timeout_ms)) <= 0) { - ESP_LOGE(TAG, "Error read data(%d)", rlen); + if (rlen < 0) { + ESP_LOGE(TAG, "Error read data(%d)", rlen); + } return rlen; } ws->frame_state.bytes_remaining -= rlen; @@ -563,10 +565,12 @@ static int ws_read_header(esp_transport_handle_t t, char *buffer, int len, int t char ws_header[MAX_WEBSOCKET_HEADER_SIZE]; char *data_ptr = ws_header, mask; int rlen; - int poll_read; ws->frame_state.header_received = false; - if ((poll_read = esp_transport_poll_read(ws->parent, timeout_ms)) <= 0) { - return poll_read; + if (ws->buffer_len == 0) { + int poll_read = esp_transport_poll_read(ws->parent, timeout_ms); + if (poll_read <= 0) { + return poll_read; + } } // Receive and process header first (based on header size) @@ -705,8 +709,10 @@ static int ws_read(esp_transport_handle_t t, char *buffer, int len, int timeout_ if (ws->frame_state.payload_len) { if ( (rlen = ws_read_payload(t, buffer, len, timeout_ms)) <= 0) { - ESP_LOGE(TAG, "Error reading payload data(%d)", rlen); - ws->frame_state.bytes_remaining = 0; + if (rlen < 0) { + ESP_LOGE(TAG, "Error reading payload data(%d)", rlen); + ws->frame_state.bytes_remaining = 0; + } return rlen; } } @@ -718,6 +724,10 @@ static int ws_read(esp_transport_handle_t t, char *buffer, int len, int timeout_ static int ws_poll_read(esp_transport_handle_t t, int timeout_ms) { transport_ws_t *ws = esp_transport_get_context_data(t); + if (ws->buffer_len > 0) { + ESP_LOGD(TAG, "ws_poll_read: buffered data available (%zu bytes)", ws->buffer_len); + return 1; + } return esp_transport_poll_read(ws->parent, timeout_ms); }