]> granicus.if.org Git - esp-idf/commitdiff
tcp_transport: modified ws_read to read payload directly to the read buffer and separ...
authorDavid Cermak <cermak@espressif.com>
Tue, 30 Apr 2019 09:41:39 +0000 (11:41 +0200)
committerDavid Cermak <cermak@espressif.com>
Mon, 27 May 2019 14:31:24 +0000 (16:31 +0200)
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

components/mqtt/esp-mqtt
components/tcp_transport/transport_ws.c

index 39118d5182f804edc01ed030c8ba137a9c7f388e..18b6f2c58231728805ff813d46021d07ed023dcb 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 39118d5182f804edc01ed030c8ba137a9c7f388e
+Subproject commit 18b6f2c58231728805ff813d46021d07ed023dcb
index a760ecfec0fe144dc6dc107801d4363cb5794fa8..e31149e1786227559c1dcf4911997d0620555946 100644 (file)
@@ -192,8 +192,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) {
@@ -202,7 +202,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;
     }
@@ -219,8 +219,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;
@@ -235,29 +233,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 > payload_len_buff) {
-        ESP_LOGD(TAG, "Actual data to receive (%d) are longer than ws buffer (%d)", payload_len, payload_len_buff);
-        payload_len = payload_len_buff;
+    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 (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;
 }