|
1 | 1 | /* |
2 | | - * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD |
| 2 | + * SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD |
3 | 3 | * |
4 | 4 | * SPDX-License-Identifier: Apache-2.0 |
5 | 5 | */ |
@@ -80,6 +80,7 @@ typedef struct { |
80 | 80 | char *auth; |
81 | 81 | int port; |
82 | 82 | bool auto_reconnect; |
| 83 | + bool close_reconnect; |
83 | 84 | void *user_context; |
84 | 85 | int network_timeout_ms; |
85 | 86 | char *subprotocol; |
@@ -376,6 +377,7 @@ static esp_err_t esp_websocket_client_set_config(esp_websocket_client_handle_t c |
376 | 377 | if (config->disable_auto_reconnect) { |
377 | 378 | cfg->auto_reconnect = false; |
378 | 379 | } |
| 380 | + cfg->close_reconnect = config->enable_close_reconnect; |
379 | 381 |
|
380 | 382 | if (config->disable_pingpong_discon) { |
381 | 383 | cfg->pingpong_timeout_sec = 0; |
@@ -1128,10 +1130,21 @@ static void esp_websocket_client_task(void *pv) |
1128 | 1130 | } else if (ret < 0) { |
1129 | 1131 | ESP_LOGW(TAG, "Connection terminated while waiting for clean TCP close"); |
1130 | 1132 | } |
1131 | | - client->run = false; |
1132 | | - client->state = WEBSOCKET_STATE_UNKNOW; |
1133 | | - esp_websocket_client_dispatch_event(client, WEBSOCKET_EVENT_CLOSED, NULL, 0); |
1134 | | - break; |
| 1133 | + if (client->config->close_reconnect && xSemaphoreTakeRecursive(client->lock, lock_timeout) == pdPASS) { |
| 1134 | + client->state = WEBSOCKET_STATE_WAIT_TIMEOUT; |
| 1135 | + client->error_handle.error_type = WEBSOCKET_ERROR_TYPE_SERVER_CLOSE; |
| 1136 | + esp_transport_close(client->transport); |
| 1137 | + esp_websocket_client_dispatch_event(client, WEBSOCKET_EVENT_CLOSED, NULL, 0); |
| 1138 | + client->reconnect_tick_ms = _tick_get_ms(); |
| 1139 | + ESP_LOGI(TAG, "Reconnect after %d ms", client->wait_timeout_ms); |
| 1140 | + xEventGroupClearBits(client->status_bits, STOPPED_BIT | CLOSE_FRAME_SENT_BIT); |
| 1141 | + xSemaphoreGiveRecursive(client->lock); |
| 1142 | + } else { |
| 1143 | + client->run = false; |
| 1144 | + client->state = WEBSOCKET_STATE_UNKNOW; |
| 1145 | + esp_websocket_client_dispatch_event(client, WEBSOCKET_EVENT_CLOSED, NULL, 0); |
| 1146 | + break; |
| 1147 | + } |
1135 | 1148 | } |
1136 | 1149 | } |
1137 | 1150 |
|
|
0 commit comments