From 814ee9db7f549baf146ec55363e43b0cd3990013 Mon Sep 17 00:00:00 2001 From: David Cermak Date: Tue, 30 Apr 2019 11:41:39 +0200 Subject: [PATCH] tcp_transport: modified ws_read to read payload directly to the read buffer and separately from header bytes Previous version read all data to the buffer including header which reduced maximum payload read. This version uses a local array to receive header and reads payload bytes to the buffer cherry-picked from db121a56e13b4b93b6bcc9217f7890bc4783cabd --- components/mqtt/esp-mqtt | 2 +- components/tcp_transport/transport_ws.c | 28 +++++++++++-------------- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/components/mqtt/esp-mqtt b/components/mqtt/esp-mqtt index f08f3b678..6f1fc3785 160000 --- a/components/mqtt/esp-mqtt +++ b/components/mqtt/esp-mqtt @@ -1 +1 @@ -Subproject commit f08f3b678717865234637164a29ed3a63e756ca7 +Subproject commit 6f1fc3785af8cc7765f78dd93f09aeb0109cd2b7 diff --git a/components/tcp_transport/transport_ws.c b/components/tcp_transport/transport_ws.c index 55ea6d115..7c7d57cd9 100644 --- a/components/tcp_transport/transport_ws.c +++ b/components/tcp_transport/transport_ws.c @@ -184,8 +184,8 @@ static int ws_read(esp_transport_handle_t t, char *buffer, int len, int timeout_ { transport_ws_t *ws = esp_transport_get_context_data(t); int payload_len; - int payload_len_buff = len; - char *data_ptr = buffer, opcode, mask, *mask_key = NULL; + char ws_header[MAX_WEBSOCKET_HEADER_SIZE]; + char *data_ptr = ws_header, opcode, mask, *mask_key = NULL; int rlen; int poll_read; if ((poll_read = esp_transport_poll_read(ws->parent, timeout_ms)) <= 0) { @@ -194,7 +194,7 @@ static int ws_read(esp_transport_handle_t t, char *buffer, int len, int timeout_ // Receive and process header first (based on header size) int header = 2; - if ((rlen = esp_transport_read(ws->parent, buffer, header, timeout_ms)) <= 0) { + if ((rlen = esp_transport_read(ws->parent, data_ptr, header, timeout_ms)) <= 0) { ESP_LOGE(TAG, "Error read data"); return rlen; } @@ -211,8 +211,6 @@ static int ws_read(esp_transport_handle_t t, char *buffer, int len, int timeout_ return rlen; } payload_len = data_ptr[0] << 8 | data_ptr[1]; - payload_len_buff = len - 4; - data_ptr += 2; } else if (payload_len == 127) { // headerLen += 8; header = 8; @@ -227,27 +225,25 @@ static int ws_read(esp_transport_handle_t t, char *buffer, int len, int timeout_ } else { payload_len = data_ptr[4] << 24 | data_ptr[5] << 16 | data_ptr[6] << 8 | data_ptr[7]; } - data_ptr += 8; - payload_len_buff = len - 10; } + + if (payload_len > len) { + ESP_LOGD(TAG, "Actual data to receive (%d) are longer than ws buffer (%d)", payload_len, len); + payload_len = len; + } + // Then receive and process payload - if ((rlen = esp_transport_read(ws->parent, data_ptr, payload_len, timeout_ms)) <= 0) { + if ((rlen = esp_transport_read(ws->parent, buffer, payload_len, timeout_ms)) <= 0) { ESP_LOGE(TAG, "Error read data"); return rlen; } - if (payload_len > payload_len_buff) { - ESP_LOGD(TAG, "Actual data received (%d) are longer than mqtt buffer (%d)", payload_len, payload_len_buff); - payload_len = payload_len_buff; - } if (mask) { - mask_key = data_ptr; - data_ptr += 4; + mask_key = buffer; + data_ptr = buffer + 4; for (int i = 0; i < payload_len; i++) { buffer[i] = (data_ptr[i] ^ mask_key[i % 4]); } - } else { - memmove(buffer, data_ptr, payload_len); } return payload_len; }