From fb227494e0d89287c7d7448feae7575c4565aa27 Mon Sep 17 00:00:00 2001 From: Jackson Ming Hu Date: Wed, 7 May 2025 10:14:53 +1000 Subject: [PATCH 1/2] fix(websocket): add missing logics on setting up external transport --- .../esp_websocket_client/esp_websocket_client.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/components/esp_websocket_client/esp_websocket_client.c b/components/esp_websocket_client/esp_websocket_client.c index cae2b4d32c..c3fade8dfb 100644 --- a/components/esp_websocket_client/esp_websocket_client.c +++ b/components/esp_websocket_client/esp_websocket_client.c @@ -496,7 +496,13 @@ static esp_err_t esp_websocket_client_create_transport(esp_websocket_client_hand client->transport_list = esp_transport_list_init(); ESP_WS_CLIENT_MEM_CHECK(TAG, client->transport_list, return ESP_ERR_NO_MEM); if (strcasecmp(client->config->scheme, WS_OVER_TCP_SCHEME) == 0) { - esp_transport_handle_t tcp = esp_transport_tcp_init(); + esp_transport_handle_t tcp = NULL; + if (client->config->ext_transport == NULL) { + tcp = esp_transport_tcp_init(); + } else { + tcp = client->config->ext_transport; + } + ESP_WS_CLIENT_MEM_CHECK(TAG, tcp, return ESP_ERR_NO_MEM); esp_transport_set_default_port(tcp, WEBSOCKET_TCP_DEFAULT_PORT); @@ -515,7 +521,13 @@ static esp_err_t esp_websocket_client_create_transport(esp_websocket_client_hand esp_transport_list_add(client->transport_list, ws, WS_OVER_TCP_SCHEME); ESP_WS_CLIENT_ERR_OK_CHECK(TAG, set_websocket_transport_optional_settings(client, WS_OVER_TCP_SCHEME), return ESP_FAIL;) } else if (strcasecmp(client->config->scheme, WS_OVER_TLS_SCHEME) == 0) { - esp_transport_handle_t ssl = esp_transport_ssl_init(); + esp_transport_handle_t ssl = NULL; + if (client->config->ext_transport == NULL) { + ssl = esp_transport_ssl_init(); + } else { + ssl = client->config->ext_transport; + } + ESP_WS_CLIENT_MEM_CHECK(TAG, ssl, return ESP_ERR_NO_MEM); esp_transport_set_default_port(ssl, WEBSOCKET_SSL_DEFAULT_PORT); From 76b475e56debe4823ccba931731df15401ebd801 Mon Sep 17 00:00:00 2001 From: Jackson Ming Hu Date: Wed, 7 May 2025 11:01:10 +1000 Subject: [PATCH 2/2] fix(websocket): skip esp_transport_{tcp|ssl}_set_xxxxx() calls for external transport --- .../esp_websocket_client.c | 27 ++++++++++++------- .../include/esp_websocket_client.h | 2 +- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/components/esp_websocket_client/esp_websocket_client.c b/components/esp_websocket_client/esp_websocket_client.c index c3fade8dfb..a3d2f808e6 100644 --- a/components/esp_websocket_client/esp_websocket_client.c +++ b/components/esp_websocket_client/esp_websocket_client.c @@ -501,6 +501,13 @@ static esp_err_t esp_websocket_client_create_transport(esp_websocket_client_hand tcp = esp_transport_tcp_init(); } else { tcp = client->config->ext_transport; + + esp_transport_handle_t ws = esp_transport_ws_init(tcp); + ESP_WS_CLIENT_MEM_CHECK(TAG, ws, return ESP_ERR_NO_MEM); + esp_transport_set_default_port(ws, WEBSOCKET_TCP_DEFAULT_PORT); + esp_transport_list_add(client->transport_list, ws, WS_OVER_TCP_SCHEME); + ESP_WS_CLIENT_ERR_OK_CHECK(TAG, set_websocket_transport_optional_settings(client, WS_OVER_TCP_SCHEME), return ESP_FAIL;) + return ESP_OK; } ESP_WS_CLIENT_MEM_CHECK(TAG, tcp, return ESP_ERR_NO_MEM); @@ -526,6 +533,13 @@ static esp_err_t esp_websocket_client_create_transport(esp_websocket_client_hand ssl = esp_transport_ssl_init(); } else { ssl = client->config->ext_transport; + + esp_transport_handle_t wss = esp_transport_ws_init(ssl); + ESP_WS_CLIENT_MEM_CHECK(TAG, wss, return ESP_ERR_NO_MEM); + esp_transport_set_default_port(wss, WEBSOCKET_SSL_DEFAULT_PORT); + esp_transport_list_add(client->transport_list, wss, WS_OVER_TLS_SCHEME); + ESP_WS_CLIENT_ERR_OK_CHECK(TAG, set_websocket_transport_optional_settings(client, WS_OVER_TLS_SCHEME), return ESP_FAIL;) + return ESP_OK; } ESP_WS_CLIENT_MEM_CHECK(TAG, ssl, return ESP_ERR_NO_MEM); @@ -998,9 +1012,7 @@ static void esp_websocket_client_task(void *pv) client->run = true; //get transport by scheme - if (client->transport == NULL && client->config->ext_transport == NULL) { - client->transport = esp_transport_list_get_transport(client->transport_list, client->config->scheme); - } + client->transport = esp_transport_list_get_transport(client->transport_list, client->config->scheme); if (client->transport == NULL) { ESP_LOGE(TAG, "There are no transports valid, stop websocket client"); @@ -1167,12 +1179,9 @@ esp_err_t esp_websocket_client_start(esp_websocket_client_handle_t client) return ESP_FAIL; } - client->transport = client->config->ext_transport; - if (!client->transport) { - if (esp_websocket_client_create_transport(client) != ESP_OK) { - ESP_LOGE(TAG, "Failed to create websocket transport"); - return ESP_FAIL; - } + if (esp_websocket_client_create_transport(client) != ESP_OK) { + ESP_LOGE(TAG, "Failed to create websocket transport"); + return ESP_FAIL; } if (xTaskCreate(esp_websocket_client_task, client->config->task_name ? client->config->task_name : "websocket_task", diff --git a/components/esp_websocket_client/include/esp_websocket_client.h b/components/esp_websocket_client/include/esp_websocket_client.h index 9923676aeb..4844318c86 100644 --- a/components/esp_websocket_client/include/esp_websocket_client.h +++ b/components/esp_websocket_client/include/esp_websocket_client.h @@ -133,7 +133,7 @@ typedef struct { int network_timeout_ms; /*!< Abort network operation if it is not completed after this value, in milliseconds (defaults to 10s) */ size_t ping_interval_sec; /*!< Websocket ping interval, defaults to 10 seconds if not set */ struct ifreq *if_name; /*!< The name of interface for data to go through. Use the default interface without setting */ - esp_transport_handle_t ext_transport; /*!< External WebSocket tcp_transport handle to the client; or if null, the client will create its own transport handle. */ + esp_transport_handle_t ext_transport; /*!< External WebSocket tcp_transport handle to the client; or if null, the client will create its own transport handle. When external transport is used, socket options like if_name and keep_alive settings will be ignored, as it should be done when setting up the external transport. */ } esp_websocket_client_config_t; /**