diff --git a/components/esp_http_client/esp_http_client.c b/components/esp_http_client/esp_http_client.c index 889997c379..7e278b6f73 100644 --- a/components/esp_http_client/esp_http_client.c +++ b/components/esp_http_client/esp_http_client.c @@ -1808,7 +1808,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 309e948b7f..2c9d2128b0 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 @@ -186,6 +186,41 @@ TEST_CASE("esp_http_client_set_header() should not return error if header value esp_http_client_cleanup(client); } +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();