feat(ws_transport): Merged set_header_hook and set_header_userp functions

This commit is contained in:
glmfe
2025-09-01 20:19:08 -03:00
committed by Rocha Euripedes
parent 58befcae26
commit 11f8534266
2 changed files with 19 additions and 38 deletions

View File

@@ -29,7 +29,7 @@ typedef enum ws_transport_opcodes {
* from the API esp_transport_ws_get_read_opcode() */ * from the API esp_transport_ws_get_read_opcode() */
} ws_transport_opcodes_t; } ws_transport_opcodes_t;
typedef void (*ws_header_hook)(void * userp, const char * line, int line_len); typedef void (*ws_header_hook_t)(void * user_context, const char * line, int line_len);
/** /**
* WS transport configuration structure * WS transport configuration structure
@@ -39,8 +39,8 @@ typedef struct {
const char *sub_protocol; /*!< WS subprotocol */ const char *sub_protocol; /*!< WS subprotocol */
const char *user_agent; /*!< WS user agent */ const char *user_agent; /*!< WS user agent */
const char *headers; /*!< WS additional headers */ const char *headers; /*!< WS additional headers */
ws_header_hook header_hook; /*!< WS received header */ ws_header_hook_t header_hook; /*!< WS received header */
void *header_userp; /*!< WS received header user-pointer */ void *header_user_context; /*!< WS received header user-context pointer */
const char *auth; /*!< HTTP authorization header */ const char *auth; /*!< HTTP authorization header */
char *response_headers; /*!< The buffer to copy the http response header */ char *response_headers; /*!< The buffer to copy the http response header */
size_t response_headers_len; /*!< The length of the http response header */ size_t response_headers_len; /*!< The length of the http response header */
@@ -104,29 +104,17 @@ esp_err_t esp_transport_ws_set_user_agent(esp_transport_handle_t t, const char *
esp_err_t esp_transport_ws_set_headers(esp_transport_handle_t t, const char *headers); esp_err_t esp_transport_ws_set_headers(esp_transport_handle_t t, const char *headers);
/** /**
* @brief Set websocket header callback * @brief Set websocket header callback and user-pointer
* *
* @param t websocket transport handle * @param t websocket transport handle
* @param hook call function on header received. NULL to disable. * @param hook call function on header received. NULL to disable.
* @param user_context caller-controlled argument to pass to ws_header_hook_t
* *
* @return * @return
* - ESP_OK on success * - ESP_OK on success
* - One of the error codes * - One of the error codes
*/ */
esp_err_t esp_transport_ws_set_header_hook(esp_transport_handle_t t, ws_header_hook hook); esp_err_t esp_transport_ws_set_header_hook(esp_transport_handle_t t, ws_header_hook_t hook, void * user_context);
/**
* @brief Set websocket header callback user-pointer
*
* @param t websocket transport handle
* @param userp caller-controlled argument to ws_header_hook
*
* @return
* - ESP_OK on success
* - One of the error codes
*/
esp_err_t esp_transport_ws_set_header_userp(esp_transport_handle_t t, void * userp);
/** /**
* @brief Set websocket authorization headers * @brief Set websocket authorization headers

View File

@@ -63,8 +63,8 @@ typedef struct {
char *sub_protocol; char *sub_protocol;
char *user_agent; char *user_agent;
char *headers; char *headers;
ws_header_hook header_hook; ws_header_hook_t header_hook;
void * header_userp; void * header_user_context;
char *auth; char *auth;
char *buffer; /*!< Initial HTTP connection buffer, which may include data beyond the handshake headers, such as the next WebSocket packet*/ char *buffer; /*!< Initial HTTP connection buffer, which may include data beyond the handshake headers, such as the next WebSocket packet*/
size_t buffer_len; /*!< The buffer length */ size_t buffer_len; /*!< The buffer length */
@@ -328,7 +328,7 @@ static int ws_connect(esp_transport_handle_t t, const char *host, int port, int
server_key_len = line_len - header_sec_websocket_accept_len; server_key_len = line_len - header_sec_websocket_accept_len;
} }
else if (ws->header_hook) { else if (ws->header_hook) {
ws->header_hook(ws->header_userp, header_cursor, line_len); ws->header_hook(ws->header_user_context, header_cursor, line_len);
} }
// Check for Location: header // Check for Location: header
@@ -878,23 +878,20 @@ esp_err_t esp_transport_ws_set_headers(esp_transport_handle_t t, const char *hea
return ESP_OK; return ESP_OK;
} }
esp_err_t esp_transport_ws_set_header_hook(esp_transport_handle_t t, ws_header_hook hook) esp_err_t esp_transport_ws_set_header_hook(esp_transport_handle_t t, ws_header_hook_t hook, void * user_context)
{ {
if (t == NULL) { if (t == NULL) {
return ESP_ERR_INVALID_ARG; return ESP_ERR_INVALID_ARG;
} }
if (hook == NULL) {
ESP_LOGE(TAG, "Header hook is NULL");
return ESP_ERR_INVALID_ARG;
}
ESP_LOGV(TAG, "User has context: %s", user_context != NULL ? "true" : "false");
transport_ws_t *ws = esp_transport_get_context_data(t); transport_ws_t *ws = esp_transport_get_context_data(t);
ws->header_hook = hook; ws->header_hook = hook;
return ESP_OK; ws->header_user_context = user_context;
}
esp_err_t esp_transport_ws_set_header_userp(esp_transport_handle_t t, void * userp)
{
if (t == NULL) {
return ESP_ERR_INVALID_ARG;
}
transport_ws_t *ws = esp_transport_get_context_data(t);
ws->header_userp = userp;
return ESP_OK; return ESP_OK;
} }
@@ -963,14 +960,10 @@ esp_err_t esp_transport_ws_set_config(esp_transport_handle_t t, const esp_transp
err = esp_transport_ws_set_headers(t, config->headers); err = esp_transport_ws_set_headers(t, config->headers);
ESP_TRANSPORT_ERR_OK_CHECK(TAG, err, return err;) ESP_TRANSPORT_ERR_OK_CHECK(TAG, err, return err;)
} }
if (config->header_hook) { if (config->header_hook || config->header_user_context) {
err = esp_transport_ws_set_header_hook(t, config->header_hook); err = esp_transport_ws_set_header_hook(t, config->header_hook, config->header_user_context);
ESP_TRANSPORT_ERR_OK_CHECK(TAG, err, return err;) ESP_TRANSPORT_ERR_OK_CHECK(TAG, err, return err;)
} }
if (config->header_userp) {
err = esp_transport_ws_set_header_userp(t, config->header_userp);
ESP_TRANSPORT_ERR_OK_CHECK(TAG, err, return err;)
}
if (config->auth) { if (config->auth) {
err = esp_transport_ws_set_auth(t, config->auth); err = esp_transport_ws_set_auth(t, config->auth);
ESP_TRANSPORT_ERR_OK_CHECK(TAG, err, return err;) ESP_TRANSPORT_ERR_OK_CHECK(TAG, err, return err;)