From 56e5190f332651a933e4c1f51dceba4fb40b0ca2 Mon Sep 17 00:00:00 2001 From: jim Date: Wed, 18 Oct 2023 15:50:35 +0800 Subject: [PATCH 1/2] esp_http_client: Fix reset errno to 0 before call esp_transport_read Closes https://github.com/espressif/esp-idf/issues/9020 --- components/esp_http_client/esp_http_client.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/components/esp_http_client/esp_http_client.c b/components/esp_http_client/esp_http_client.c index 25454cbdcd..96d62f0cf3 100644 --- a/components/esp_http_client/esp_http_client.c +++ b/components/esp_http_client/esp_http_client.c @@ -1028,6 +1028,7 @@ static int esp_http_client_get_data(esp_http_client_handle_t client) ESP_LOGD(TAG, "data_process=%lld, content_length=%lld", client->response->data_process, client->response->content_length); + errno = 0; int rlen = esp_transport_read(client->transport, res_buffer->data, client->buffer_size_rx, client->timeout_ms); if (rlen >= 0) { // When tls error is ESP_TLS_ERR_SSL_WANT_READ (-0x6900), esp_trasnport_read returns ERR_TCP_TRANSPORT_CONNECTION_TIMEOUT (0x0). @@ -1258,6 +1259,7 @@ int64_t esp_http_client_fetch_headers(esp_http_client_handle_t client) client->response->status_code = -1; while (client->state < HTTP_STATE_RES_COMPLETE_HEADER) { + errno = 0; buffer->len = esp_transport_read(client->transport, buffer->data, client->buffer_size_rx, client->timeout_ms); if (buffer->len <= 0) { if (buffer->len == ERR_TCP_TRANSPORT_CONNECTION_TIMEOUT) { From 5a4fda230ade7ddbe1abe5cae147e772f9130130 Mon Sep 17 00:00:00 2001 From: Harshit Malpani Date: Fri, 22 Dec 2023 16:20:24 +0530 Subject: [PATCH 2/2] fix(esp_http_client): Add test case in esp_http_client example Add a test case in esp_http_client example to test HTTP_METHOD_HEAD with async mode --- .../main/esp_http_client_example.c | 25 +++++++++++++++++++ .../esp_http_client/pytest_esp_http_client.py | 2 ++ 2 files changed, 27 insertions(+) diff --git a/examples/protocols/esp_http_client/main/esp_http_client_example.c b/examples/protocols/esp_http_client/main/esp_http_client_example.c index fcdcd330ab..ef9fa20419 100644 --- a/examples/protocols/esp_http_client/main/esp_http_client_example.c +++ b/examples/protocols/esp_http_client/main/esp_http_client_example.c @@ -582,6 +582,31 @@ static void https_async(void) ESP_LOGE(TAG, "Error perform http request %s", esp_err_to_name(err)); } esp_http_client_cleanup(client); + + // Test HTTP_METHOD_HEAD with is_async enabled + config.url = "https://"CONFIG_EXAMPLE_HTTP_ENDPOINT"/get"; + config.event_handler = _http_event_handler; + config.crt_bundle_attach = esp_crt_bundle_attach; + config.is_async = true; + config.timeout_ms = 5000; + + client = esp_http_client_init(&config); + esp_http_client_set_method(client, HTTP_METHOD_HEAD); + + while (1) { + err = esp_http_client_perform(client); + if (err != ESP_ERR_HTTP_EAGAIN) { + break; + } + } + if (err == ESP_OK) { + ESP_LOGI(TAG, "HTTPS Status = %d, content_length = %"PRId64, + esp_http_client_get_status_code(client), + esp_http_client_get_content_length(client)); + } else { + ESP_LOGE(TAG, "Error perform http request %s", esp_err_to_name(err)); + } + esp_http_client_cleanup(client); } static void https_with_invalid_url(void) diff --git a/examples/protocols/esp_http_client/pytest_esp_http_client.py b/examples/protocols/esp_http_client/pytest_esp_http_client.py index c4cb4a4758..adc0f95af1 100644 --- a/examples/protocols/esp_http_client/pytest_esp_http_client.py +++ b/examples/protocols/esp_http_client/pytest_esp_http_client.py @@ -48,6 +48,7 @@ def test_examples_protocol_esp_http_client(dut: Dut) -> None: # content-len for chunked encoding is typically -1, could be a positive length in some cases dut.expect(r'HTTP Stream reader Status = 200, content_length = (\d)') dut.expect(r'HTTPS Status = 200, content_length = (\d)') + dut.expect(r'HTTPS Status = 200, content_length = (\d)') dut.expect(r'Last esp error code: 0x8001') dut.expect(r'HTTP GET Status = 200, content_length = (\d)') dut.expect(r'HTTP POST Status = 200, content_length = (\d)') @@ -94,6 +95,7 @@ def test_examples_protocol_esp_http_client_dynamic_buffer(dut: Dut) -> None: # content-len for chunked encoding is typically -1, could be a positive length in some cases dut.expect(r'HTTP Stream reader Status = 200, content_length = (\d)') dut.expect(r'HTTPS Status = 200, content_length = (\d)') + dut.expect(r'HTTPS Status = 200, content_length = (\d)') dut.expect(r'Last esp error code: 0x8001') dut.expect(r'HTTP GET Status = 200, content_length = (\d)') dut.expect(r'HTTP POST Status = 200, content_length = (\d)')