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
This commit is contained in:
nilesh.kale
2025-07-10 16:13:35 +05:30
parent 9984cc4aab
commit 7edb4fae49
2 changed files with 36 additions and 1 deletions

View File

@@ -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;

View File

@@ -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();