|
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;
|
@@ -1127,10 +1129,21 @@ static void esp_websocket_client_task(void *pv)
|
1127 | 1129 | } else if (ret < 0) {
|
1128 | 1130 | ESP_LOGW(TAG, "Connection terminated while waiting for clean TCP close");
|
1129 | 1131 | }
|
1130 |
| - client->run = false; |
1131 |
| - client->state = WEBSOCKET_STATE_UNKNOW; |
1132 |
| - esp_websocket_client_dispatch_event(client, WEBSOCKET_EVENT_CLOSED, NULL, 0); |
1133 |
| - break; |
| 1132 | + if (client->config->close_reconnect && xSemaphoreTakeRecursive(client->lock, lock_timeout) == pdPASS) { |
| 1133 | + client->state = WEBSOCKET_STATE_WAIT_TIMEOUT; |
| 1134 | + client->error_handle.error_type = WEBSOCKET_ERROR_TYPE_SERVER_CLOSE; |
| 1135 | + esp_transport_close(client->transport); |
| 1136 | + esp_websocket_client_dispatch_event(client, WEBSOCKET_EVENT_CLOSED, NULL, 0); |
| 1137 | + client->reconnect_tick_ms = _tick_get_ms(); |
| 1138 | + ESP_LOGI(TAG, "Reconnect after %d ms", client->wait_timeout_ms); |
| 1139 | + xEventGroupClearBits(client->status_bits, STOPPED_BIT | CLOSE_FRAME_SENT_BIT); |
| 1140 | + xSemaphoreGiveRecursive(client->lock); |
| 1141 | + } else { |
| 1142 | + client->run = false; |
| 1143 | + client->state = WEBSOCKET_STATE_UNKNOW; |
| 1144 | + esp_websocket_client_dispatch_event(client, WEBSOCKET_EVENT_CLOSED, NULL, 0); |
| 1145 | + break; |
| 1146 | + } |
1134 | 1147 | }
|
1135 | 1148 | }
|
1136 | 1149 |
|
|
0 commit comments