From 092c48d1440d2590379fb5c88119be825266a06a Mon Sep 17 00:00:00 2001 From: "nilesh.kale" Date: Thu, 10 Jul 2025 16:13:35 +0530 Subject: [PATCH] feat(esp_http_client): avoid dispatching of spurious event while closing closes connection This commit updated the client closing condition to avoid spurious dispatching of event HTTP_EVENT_DISCONNECTED while closing closeed connection. Closes https://github.com/espressif/esp-idf/issues/16070 --- components/esp_http_client/esp_http_client.c | 2 +- .../test_apps/main/test_http_client.c | 35 +++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/components/esp_http_client/esp_http_client.c b/components/esp_http_client/esp_http_client.c index 2c767faf67..4dc92de53d 100644 --- a/components/esp_http_client/esp_http_client.c +++ b/components/esp_http_client/esp_http_client.c @@ -1691,7 +1691,7 @@ int esp_http_client_write(esp_http_client_handle_t client, const char *buffer, i esp_err_t esp_http_client_close(esp_http_client_handle_t client) { - if (client->state >= HTTP_STATE_INIT) { + if (client->state > HTTP_STATE_INIT) { http_dispatch_event(client, HTTP_EVENT_DISCONNECTED, esp_transport_get_error_handle(client->transport), 0); http_dispatch_event_to_event_loop(HTTP_EVENT_DISCONNECTED, &client, sizeof(esp_http_client_handle_t)); client->state = HTTP_STATE_INIT; diff --git a/components/esp_http_client/test_apps/main/test_http_client.c b/components/esp_http_client/test_apps/main/test_http_client.c index f066c2d52b..6e318678a0 100644 --- a/components/esp_http_client/test_apps/main/test_http_client.c +++ b/components/esp_http_client/test_apps/main/test_http_client.c @@ -166,6 +166,41 @@ TEST_CASE("esp_http_client_get_url() should return URL in the correct format", " TEST_ASSERT_EQUAL_STRING(url, client_url); } +static int disconnect_event_count = 0; + +static esp_err_t disconnect_event_handler(esp_http_client_event_t *evt) +{ + if (evt->event_id == HTTP_EVENT_DISCONNECTED) { + disconnect_event_count++; + } + return ESP_OK; +} + +TEST_CASE("esp_http_client_close() and cleanup() should not dispatch duplicate disconnect events", "[esp_http_client]") +{ + esp_http_client_config_t config = { + .url = "http://httpbin.org/get", + .event_handler = disconnect_event_handler, + }; + + // Reset event counter + disconnect_event_count = 0; + + esp_http_client_handle_t client = esp_http_client_init(&config); + TEST_ASSERT_NOT_NULL(client); + + // Close the client first + esp_err_t err = esp_http_client_close(client); + TEST_ASSERT_EQUAL(ESP_OK, err); + + // Then cleanup - this should not dispatch another disconnect event + err = esp_http_client_cleanup(client); + TEST_ASSERT_EQUAL(ESP_OK, err); + + // Verify that only one disconnect event was dispatched (or none if client was never connected) + TEST_ASSERT_LESS_OR_EQUAL(1, disconnect_event_count); +} + void app_main(void) { unity_run_menu();