]> granicus.if.org Git - esp-idf/commitdiff
tcp_transport: reading http header in a chunked mode until header terminator received...
authorDavid Cermak <cermak@espressif.com>
Tue, 14 May 2019 13:36:46 +0000 (15:36 +0200)
committerDavid Cermak <cermak@espressif.com>
Mon, 20 May 2019 14:40:03 +0000 (16:40 +0200)
Closes https://github.com/espressif/esp-idf/issues/3461

components/tcp_transport/transport_ws.c

index 74f339a0ad88fe68a0cf49df5c3135bcbf32a5d5..a760ecfec0fe144dc6dc107801d4363cb5794fa8 100644 (file)
@@ -113,10 +113,17 @@ static int ws_connect(esp_transport_handle_t t, const char *host, int port, int
         ESP_LOGE(TAG, "Error write Upgrade header %s", ws->buffer);
         return -1;
     }
-    if ((len = esp_transport_read(ws->parent, ws->buffer, DEFAULT_WS_BUFFER, timeout_ms)) <= 0) {
-        ESP_LOGE(TAG, "Error read response for Upgrade header %s", ws->buffer);
-        return -1;
-    }
+    int header_len = 0;
+    do {
+        if ((len = esp_transport_read(ws->parent, ws->buffer + header_len, DEFAULT_WS_BUFFER - header_len, timeout_ms)) <= 0) {
+            ESP_LOGE(TAG, "Error read response for Upgrade header %s", ws->buffer);
+            return -1;
+        }
+        header_len += len;
+        ws->buffer[header_len] = '\0';
+        ESP_LOGD(TAG, "Read header chunk %d, current header size: %d", len, header_len);
+    } while (NULL == strstr(ws->buffer, "\r\n\r\n") && header_len < DEFAULT_WS_BUFFER);
+
     char *server_key = get_http_header(ws->buffer, "Sec-WebSocket-Accept:");
     if (server_key == NULL) {
         ESP_LOGE(TAG, "Sec-WebSocket-Accept not found");