]> granicus.if.org Git - esp-idf/commitdiff
tcp_transport: modification of ws to read headers first in order to read the exact...
authorDavid Cermak <cermak@espressif.com>
Tue, 20 Nov 2018 02:31:19 +0000 (03:31 +0100)
committerDavid Cermak <cermak@espressif.com>
Thu, 3 Jan 2019 08:22:40 +0000 (09:22 +0100)
closes https://github.com/espressif/esp-mqtt/issues/69

components/tcp_transport/transport_ws.c

index b453a3e553abe3ff042043d1d512db4abf8b612f..55ea6d1158e0b0d4268ec9448f05c3418d45b257 100644 (file)
@@ -191,7 +191,10 @@ static int ws_read(esp_transport_handle_t t, char *buffer, int len, int timeout_
     if ((poll_read = esp_transport_poll_read(ws->parent, timeout_ms)) <= 0) {
         return poll_read;
     }
-    if ((rlen = esp_transport_read(ws->parent, buffer, len, timeout_ms)) <= 0) {
+
+    // Receive and process header first (based on header size)
+    int header = 2;
+    if ((rlen = esp_transport_read(ws->parent, buffer, header, timeout_ms)) <= 0) {
         ESP_LOGE(TAG, "Error read data");
         return rlen;
     }
@@ -203,11 +206,20 @@ static int ws_read(esp_transport_handle_t t, char *buffer, int len, int timeout_
     ESP_LOGD(TAG, "Opcode: %d, mask: %d, len: %d\r\n", opcode, mask, payload_len);
     if (payload_len == 126) {
         // headerLen += 2;
+        if ((rlen = esp_transport_read(ws->parent, data_ptr, header, timeout_ms)) <= 0) {
+            ESP_LOGE(TAG, "Error read data");
+            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;
+        if ((rlen = esp_transport_read(ws->parent, data_ptr, header, timeout_ms)) <= 0) {
+            ESP_LOGE(TAG, "Error read data");
+            return rlen;
+        }
 
         if (data_ptr[0] != 0 || data_ptr[1] != 0 || data_ptr[2] != 0 || data_ptr[3] != 0) {
             // really too big!
@@ -218,6 +230,11 @@ static int ws_read(esp_transport_handle_t t, char *buffer, int len, int timeout_
         data_ptr += 8;
         payload_len_buff = len - 10;
     }
+    // Then receive and process payload
+    if ((rlen = esp_transport_read(ws->parent, data_ptr, 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;