From: David Cermak Date: Tue, 14 May 2019 13:36:46 +0000 (+0200) Subject: tcp_transport: reading http header in a chunked mode until header terminator received... X-Git-Tag: v4.0-beta1~319^2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d41d70b8efa10035d38aebcbbd0ed01c714a4ef6;p=esp-idf tcp_transport: reading http header in a chunked mode until header terminator received (or timeout) to correctly receive all header if fragmented Closes https://github.com/espressif/esp-idf/issues/3461 --- diff --git a/components/tcp_transport/transport_ws.c b/components/tcp_transport/transport_ws.c index 74f339a0ad..a760ecfec0 100644 --- a/components/tcp_transport/transport_ws.c +++ b/components/tcp_transport/transport_ws.c @@ -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");