From 3557e67fb81a18769bbfcc2fcc897ec029455139 Mon Sep 17 00:00:00 2001 From: glmfe Date: Wed, 2 Apr 2025 08:07:04 -0300 Subject: [PATCH] feat(websocket): Add ws get HTTP response headers --- .../esp_websocket_client/esp_websocket_client.c | 11 +++++++++-- .../examples/target/main/websocket_example.c | 10 ++++++++++ .../include/esp_websocket_client.h | 2 ++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/components/esp_websocket_client/esp_websocket_client.c b/components/esp_websocket_client/esp_websocket_client.c index 3b6ec19934..be24f11d3b 100644 --- a/components/esp_websocket_client/esp_websocket_client.c +++ b/components/esp_websocket_client/esp_websocket_client.c @@ -101,6 +101,8 @@ typedef struct { const char *cert_common_name; esp_err_t (*crt_bundle_attach)(void *conf); esp_transport_handle_t ext_transport; + char *response_headers; + size_t response_headers_len; } websocket_config_storage_t; typedef enum { @@ -474,7 +476,11 @@ static esp_err_t set_websocket_transport_optional_settings(esp_websocket_client_ .user_agent = client->config->user_agent, .headers = client->config->headers, .auth = client->config->auth, - .propagate_control_frames = true + .propagate_control_frames = true, +#if WS_TRANSPORT_STORE_RESPONSE_HEADERS + .response_headers = client->config->response_headers, + .response_headers_len = client->config->response_headers_len +#endif }; return esp_transport_ws_set_config(trans, &config); } @@ -725,7 +731,8 @@ esp_websocket_client_handle_t esp_websocket_client_init(const esp_websocket_clie client->config->cert_common_name = config->cert_common_name; client->config->crt_bundle_attach = config->crt_bundle_attach; client->config->ext_transport = config->ext_transport; - + client->config->response_headers = config->response_headers; + client->config->response_headers_len = config->response_headers_len; if (config->uri) { if (esp_websocket_client_set_uri(client, config->uri) != ESP_OK) { ESP_LOGE(TAG, "Invalid uri"); diff --git a/components/esp_websocket_client/examples/target/main/websocket_example.c b/components/esp_websocket_client/examples/target/main/websocket_example.c index 31998527b5..25def15f9e 100644 --- a/components/esp_websocket_client/examples/target/main/websocket_example.c +++ b/components/esp_websocket_client/examples/target/main/websocket_example.c @@ -32,6 +32,7 @@ #include #define NO_DATA_TIMEOUT_SEC 5 +#define WS_HANDSHAKE_RESPONSE_HEADERS_MAX_SIZE 1024 static const char *TAG = "websocket"; @@ -177,6 +178,8 @@ static void websocket_app_start(void) #if CONFIG_WS_OVER_TLS_SKIP_COMMON_NAME_CHECK websocket_cfg.skip_cert_common_name_check = true; #endif + websocket_cfg.response_headers = malloc(WS_HANDSHAKE_RESPONSE_HEADERS_MAX_SIZE); + websocket_cfg.response_headers_len = WS_HANDSHAKE_RESPONSE_HEADERS_MAX_SIZE; ESP_LOGI(TAG, "Connecting to %s...", websocket_cfg.uri); @@ -189,6 +192,12 @@ static void websocket_app_start(void) int i = 0; while (i < 5) { if (esp_websocket_client_is_connected(client)) { + if (i == 0) { + /* WebSocket handshake response headers if available */ + if (websocket_cfg.response_headers) { + ESP_LOGI(TAG, "WebSocket response headers:\n%s", websocket_cfg.response_headers); + } + } int len = sprintf(data, "hello %04d", i++); ESP_LOGI(TAG, "Sending %s", data); esp_websocket_client_send_text(client, data, len, portMAX_DELAY); @@ -226,6 +235,7 @@ static void websocket_app_start(void) xSemaphoreTake(shutdown_sema, portMAX_DELAY); esp_websocket_client_close(client, portMAX_DELAY); + free(websocket_cfg.response_headers); ESP_LOGI(TAG, "Websocket Stopped"); esp_websocket_unregister_events(client, WEBSOCKET_EVENT_ANY, websocket_event_handler); esp_websocket_client_destroy(client); diff --git a/components/esp_websocket_client/include/esp_websocket_client.h b/components/esp_websocket_client/include/esp_websocket_client.h index 9923676aeb..f2b81e6ddc 100644 --- a/components/esp_websocket_client/include/esp_websocket_client.h +++ b/components/esp_websocket_client/include/esp_websocket_client.h @@ -134,6 +134,8 @@ typedef struct { 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. */ + char *response_headers; /*!< WebSocket handshake response headers */ + size_t response_headers_len; /*!< WebSocket handshake response headers length */ } esp_websocket_client_config_t; /**