Skip to content

Commit c74bda9

Browse files
committed
feat(websocket): Add ws get HTTP response headers
1 parent d2e94e5 commit c74bda9

File tree

3 files changed

+33
-1
lines changed

3 files changed

+33
-1
lines changed

components/esp_websocket_client/esp_websocket_client.c

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ typedef struct {
101101
const char *cert_common_name;
102102
esp_err_t (*crt_bundle_attach)(void *conf);
103103
esp_transport_handle_t ext_transport;
104+
char *response_headers;
105+
size_t response_headers_len;
104106
} websocket_config_storage_t;
105107

106108
typedef enum {
@@ -215,6 +217,9 @@ static esp_err_t esp_websocket_client_dispatch_event(esp_websocket_client_handle
215217
event_data.error_handle.error_type = client->error_handle.error_type;
216218
event_data.error_handle.esp_ws_handshake_status_code = client->error_handle.esp_ws_handshake_status_code;
217219

220+
// Add response headers to event data
221+
event_data.response_headers = client->config->response_headers;
222+
event_data.response_headers_len = client->config->response_headers_len;
218223

219224
if ((err = esp_event_post_to(client->event_handle,
220225
WEBSOCKET_EVENTS, event,
@@ -420,6 +425,7 @@ static esp_err_t esp_websocket_client_destroy_config(esp_websocket_client_handle
420425
free(cfg->subprotocol);
421426
free(cfg->user_agent);
422427
free(cfg->headers);
428+
free(cfg->response_headers);
423429
memset(cfg, 0, sizeof(websocket_config_storage_t));
424430
free(client->config);
425431
client->config = NULL;
@@ -474,7 +480,11 @@ static esp_err_t set_websocket_transport_optional_settings(esp_websocket_client_
474480
.user_agent = client->config->user_agent,
475481
.headers = client->config->headers,
476482
.auth = client->config->auth,
477-
.propagate_control_frames = true
483+
.propagate_control_frames = true,
484+
#if WS_TRANSPORT_STORE_RESPONSE_HEADERS
485+
.response_headers = client->config->response_headers,
486+
.response_headers_len = client->config->response_headers_len
487+
#endif
478488
};
479489
return esp_transport_ws_set_config(trans, &config);
480490
}
@@ -726,6 +736,17 @@ esp_websocket_client_handle_t esp_websocket_client_init(const esp_websocket_clie
726736
client->config->crt_bundle_attach = config->crt_bundle_attach;
727737
client->config->ext_transport = config->ext_transport;
728738

739+
// Allocate memory for response_headers if length is specified
740+
if (config->response_headers_len > 0) {
741+
client->config->response_headers = malloc(config->response_headers_len);
742+
ESP_WS_CLIENT_MEM_CHECK(TAG, client->config->response_headers, goto _websocket_init_fail);
743+
memset(client->config->response_headers, 0, config->response_headers_len);
744+
client->config->response_headers_len = config->response_headers_len;
745+
} else {
746+
client->config->response_headers = NULL;
747+
client->config->response_headers_len = 0;
748+
}
749+
729750
if (config->uri) {
730751
if (esp_websocket_client_set_uri(client, config->uri) != ESP_OK) {
731752
ESP_LOGE(TAG, "Invalid uri");

components/esp_websocket_client/examples/target/main/websocket_example.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#include <cJSON.h>
3333

3434
#define NO_DATA_TIMEOUT_SEC 5
35+
#define WS_HANDSHAKE_RESPONSE_HEADERS_MAX_SIZE 1024
3536

3637
static const char *TAG = "websocket";
3738

@@ -79,6 +80,10 @@ static void websocket_event_handler(void *handler_args, esp_event_base_t base, i
7980
break;
8081
case WEBSOCKET_EVENT_CONNECTED:
8182
ESP_LOGI(TAG, "WEBSOCKET_EVENT_CONNECTED");
83+
/* WebSocket handshake response headers if available */
84+
if (data->response_headers && data->response_headers_len > 0) {
85+
ESP_LOGI(TAG, "WebSocket response headers:\n%.*s", (int)data->response_headers_len, data->response_headers);
86+
}
8287
break;
8388
case WEBSOCKET_EVENT_DISCONNECTED:
8489
ESP_LOGI(TAG, "WEBSOCKET_EVENT_DISCONNECTED");
@@ -177,6 +182,8 @@ static void websocket_app_start(void)
177182
#if CONFIG_WS_OVER_TLS_SKIP_COMMON_NAME_CHECK
178183
websocket_cfg.skip_cert_common_name_check = true;
179184
#endif
185+
websocket_cfg.response_headers = NULL;
186+
websocket_cfg.response_headers_len = WS_HANDSHAKE_RESPONSE_HEADERS_MAX_SIZE;
180187

181188
ESP_LOGI(TAG, "Connecting to %s...", websocket_cfg.uri);
182189

components/esp_websocket_client/include/esp_websocket_client.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ typedef struct {
7979
int payload_len; /*!< Total payload length, payloads exceeding buffer will be posted through multiple events */
8080
int payload_offset; /*!< Actual offset for the data associated with this event */
8181
esp_websocket_error_codes_t error_handle; /*!< esp-websocket error handle including esp-tls errors as well as internal websocket errors */
82+
const char *response_headers; /*!< WebSocket handshake response headers */
83+
size_t response_headers_len; /*!< WebSocket handshake response headers length */
8284
} esp_websocket_event_data_t;
8385

8486
/**
@@ -134,6 +136,8 @@ typedef struct {
134136
size_t ping_interval_sec; /*!< Websocket ping interval, defaults to 10 seconds if not set */
135137
struct ifreq *if_name; /*!< The name of interface for data to go through. Use the default interface without setting */
136138
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. */
139+
char *response_headers; /*!< WebSocket handshake response headers */
140+
size_t response_headers_len; /*!< WebSocket handshake response headers length */
137141
} esp_websocket_client_config_t;
138142

139143
/**

0 commit comments

Comments
 (0)