mirror of
https://github.com/espressif/esp-idf.git
synced 2025-10-02 18:10:57 +02:00
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:
@@ -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)
|
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(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));
|
http_dispatch_event_to_event_loop(HTTP_EVENT_DISCONNECTED, &client, sizeof(esp_http_client_handle_t));
|
||||||
client->state = HTTP_STATE_INIT;
|
client->state = HTTP_STATE_INIT;
|
||||||
|
@@ -186,6 +186,41 @@ TEST_CASE("esp_http_client_set_header() should not return error if header value
|
|||||||
esp_http_client_cleanup(client);
|
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)
|
void app_main(void)
|
||||||
{
|
{
|
||||||
unity_run_menu();
|
unity_run_menu();
|
||||||
|
Reference in New Issue
Block a user