mirror of
https://github.com/espressif/esp-protocols.git
synced 2025-07-17 04:22:14 +02:00
ws_client: removed dependency on internal tcp_transport header
* Original commit: espressif/esp-idf@d1433564ec
This commit is contained in:
@ -19,7 +19,6 @@
|
|||||||
#include "esp_transport_tcp.h"
|
#include "esp_transport_tcp.h"
|
||||||
#include "esp_transport_ssl.h"
|
#include "esp_transport_ssl.h"
|
||||||
#include "esp_transport_ws.h"
|
#include "esp_transport_ws.h"
|
||||||
#include "esp_transport_utils.h"
|
|
||||||
/* using uri parser */
|
/* using uri parser */
|
||||||
#include "http_parser.h"
|
#include "http_parser.h"
|
||||||
#include "freertos/task.h"
|
#include "freertos/task.h"
|
||||||
@ -42,6 +41,11 @@ static const char *TAG = "WEBSOCKET_CLIENT";
|
|||||||
#define WEBSOCKET_EVENT_QUEUE_SIZE (1)
|
#define WEBSOCKET_EVENT_QUEUE_SIZE (1)
|
||||||
#define WEBSOCKET_SEND_EVENT_TIMEOUT_MS (1000/portTICK_RATE_MS)
|
#define WEBSOCKET_SEND_EVENT_TIMEOUT_MS (1000/portTICK_RATE_MS)
|
||||||
|
|
||||||
|
#define ESP_WS_CLIENT_MEM_CHECK(TAG, a, action) if (!(a)) { \
|
||||||
|
ESP_LOGE(TAG,"%s:%d (%s): %s", __FILE__, __LINE__, __FUNCTION__, "Memory exhausted"); \
|
||||||
|
action; \
|
||||||
|
}
|
||||||
|
|
||||||
const static int STOPPED_BIT = BIT0;
|
const static int STOPPED_BIT = BIT0;
|
||||||
|
|
||||||
ESP_EVENT_DEFINE_BASE(WEBSOCKET_EVENTS);
|
ESP_EVENT_DEFINE_BASE(WEBSOCKET_EVENTS);
|
||||||
@ -139,7 +143,7 @@ static esp_err_t esp_websocket_client_set_config(esp_websocket_client_handle_t c
|
|||||||
|
|
||||||
if (config->host) {
|
if (config->host) {
|
||||||
cfg->host = strdup(config->host);
|
cfg->host = strdup(config->host);
|
||||||
ESP_TRANSPORT_MEM_CHECK(TAG, cfg->host, return ESP_ERR_NO_MEM);
|
ESP_WS_CLIENT_MEM_CHECK(TAG, cfg->host, return ESP_ERR_NO_MEM);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (config->port) {
|
if (config->port) {
|
||||||
@ -149,7 +153,7 @@ static esp_err_t esp_websocket_client_set_config(esp_websocket_client_handle_t c
|
|||||||
if (config->username) {
|
if (config->username) {
|
||||||
free(cfg->username);
|
free(cfg->username);
|
||||||
cfg->username = strdup(config->username);
|
cfg->username = strdup(config->username);
|
||||||
ESP_TRANSPORT_MEM_CHECK(TAG, cfg->username, {
|
ESP_WS_CLIENT_MEM_CHECK(TAG, cfg->username, {
|
||||||
free(cfg->host);
|
free(cfg->host);
|
||||||
return ESP_ERR_NO_MEM;
|
return ESP_ERR_NO_MEM;
|
||||||
});
|
});
|
||||||
@ -158,7 +162,7 @@ static esp_err_t esp_websocket_client_set_config(esp_websocket_client_handle_t c
|
|||||||
if (config->password) {
|
if (config->password) {
|
||||||
free(cfg->password);
|
free(cfg->password);
|
||||||
cfg->password = strdup(config->password);
|
cfg->password = strdup(config->password);
|
||||||
ESP_TRANSPORT_MEM_CHECK(TAG, cfg->password, {
|
ESP_WS_CLIENT_MEM_CHECK(TAG, cfg->password, {
|
||||||
free(cfg->host);
|
free(cfg->host);
|
||||||
free(cfg->username);
|
free(cfg->username);
|
||||||
return ESP_ERR_NO_MEM;
|
return ESP_ERR_NO_MEM;
|
||||||
@ -168,7 +172,7 @@ static esp_err_t esp_websocket_client_set_config(esp_websocket_client_handle_t c
|
|||||||
if (config->uri) {
|
if (config->uri) {
|
||||||
free(cfg->uri);
|
free(cfg->uri);
|
||||||
cfg->uri = strdup(config->uri);
|
cfg->uri = strdup(config->uri);
|
||||||
ESP_TRANSPORT_MEM_CHECK(TAG, cfg->uri, {
|
ESP_WS_CLIENT_MEM_CHECK(TAG, cfg->uri, {
|
||||||
free(cfg->host);
|
free(cfg->host);
|
||||||
free(cfg->username);
|
free(cfg->username);
|
||||||
free(cfg->password);
|
free(cfg->password);
|
||||||
@ -178,7 +182,7 @@ static esp_err_t esp_websocket_client_set_config(esp_websocket_client_handle_t c
|
|||||||
if (config->path) {
|
if (config->path) {
|
||||||
free(cfg->path);
|
free(cfg->path);
|
||||||
cfg->path = strdup(config->path);
|
cfg->path = strdup(config->path);
|
||||||
ESP_TRANSPORT_MEM_CHECK(TAG, cfg->path, {
|
ESP_WS_CLIENT_MEM_CHECK(TAG, cfg->path, {
|
||||||
free(cfg->uri);
|
free(cfg->uri);
|
||||||
free(cfg->host);
|
free(cfg->host);
|
||||||
free(cfg->username);
|
free(cfg->username);
|
||||||
@ -222,7 +226,7 @@ static esp_err_t esp_websocket_client_destroy_config(esp_websocket_client_handle
|
|||||||
esp_websocket_client_handle_t esp_websocket_client_init(const esp_websocket_client_config_t *config)
|
esp_websocket_client_handle_t esp_websocket_client_init(const esp_websocket_client_config_t *config)
|
||||||
{
|
{
|
||||||
esp_websocket_client_handle_t client = calloc(1, sizeof(struct esp_websocket_client));
|
esp_websocket_client_handle_t client = calloc(1, sizeof(struct esp_websocket_client));
|
||||||
ESP_TRANSPORT_MEM_CHECK(TAG, client, return NULL);
|
ESP_WS_CLIENT_MEM_CHECK(TAG, client, return NULL);
|
||||||
|
|
||||||
esp_event_loop_args_t event_args = {
|
esp_event_loop_args_t event_args = {
|
||||||
.queue_size = WEBSOCKET_EVENT_QUEUE_SIZE,
|
.queue_size = WEBSOCKET_EVENT_QUEUE_SIZE,
|
||||||
@ -236,30 +240,30 @@ esp_websocket_client_handle_t esp_websocket_client_init(const esp_websocket_clie
|
|||||||
}
|
}
|
||||||
|
|
||||||
client->lock = xSemaphoreCreateMutex();
|
client->lock = xSemaphoreCreateMutex();
|
||||||
ESP_TRANSPORT_MEM_CHECK(TAG, client->lock, goto _websocket_init_fail);
|
ESP_WS_CLIENT_MEM_CHECK(TAG, client->lock, goto _websocket_init_fail);
|
||||||
|
|
||||||
client->transport_list = esp_transport_list_init();
|
client->transport_list = esp_transport_list_init();
|
||||||
ESP_TRANSPORT_MEM_CHECK(TAG, client->transport_list, goto _websocket_init_fail);
|
ESP_WS_CLIENT_MEM_CHECK(TAG, client->transport_list, goto _websocket_init_fail);
|
||||||
|
|
||||||
esp_transport_handle_t tcp = esp_transport_tcp_init();
|
esp_transport_handle_t tcp = esp_transport_tcp_init();
|
||||||
ESP_TRANSPORT_MEM_CHECK(TAG, tcp, goto _websocket_init_fail);
|
ESP_WS_CLIENT_MEM_CHECK(TAG, tcp, goto _websocket_init_fail);
|
||||||
|
|
||||||
esp_transport_set_default_port(tcp, WEBSOCKET_TCP_DEFAULT_PORT);
|
esp_transport_set_default_port(tcp, WEBSOCKET_TCP_DEFAULT_PORT);
|
||||||
esp_transport_list_add(client->transport_list, tcp, "_tcp"); // need to save to transport list, for cleanup
|
esp_transport_list_add(client->transport_list, tcp, "_tcp"); // need to save to transport list, for cleanup
|
||||||
|
|
||||||
|
|
||||||
esp_transport_handle_t ws = esp_transport_ws_init(tcp);
|
esp_transport_handle_t ws = esp_transport_ws_init(tcp);
|
||||||
ESP_TRANSPORT_MEM_CHECK(TAG, ws, goto _websocket_init_fail);
|
ESP_WS_CLIENT_MEM_CHECK(TAG, ws, goto _websocket_init_fail);
|
||||||
|
|
||||||
esp_transport_set_default_port(ws, WEBSOCKET_TCP_DEFAULT_PORT);
|
esp_transport_set_default_port(ws, WEBSOCKET_TCP_DEFAULT_PORT);
|
||||||
esp_transport_list_add(client->transport_list, ws, "ws");
|
esp_transport_list_add(client->transport_list, ws, "ws");
|
||||||
if (config->transport == WEBSOCKET_TRANSPORT_OVER_TCP) {
|
if (config->transport == WEBSOCKET_TRANSPORT_OVER_TCP) {
|
||||||
asprintf(&client->config->scheme, "ws");
|
asprintf(&client->config->scheme, "ws");
|
||||||
ESP_TRANSPORT_MEM_CHECK(TAG, client->config->scheme, goto _websocket_init_fail);
|
ESP_WS_CLIENT_MEM_CHECK(TAG, client->config->scheme, goto _websocket_init_fail);
|
||||||
}
|
}
|
||||||
|
|
||||||
esp_transport_handle_t ssl = esp_transport_ssl_init();
|
esp_transport_handle_t ssl = esp_transport_ssl_init();
|
||||||
ESP_TRANSPORT_MEM_CHECK(TAG, ssl, goto _websocket_init_fail);
|
ESP_WS_CLIENT_MEM_CHECK(TAG, ssl, goto _websocket_init_fail);
|
||||||
|
|
||||||
esp_transport_set_default_port(ssl, WEBSOCKET_SSL_DEFAULT_PORT);
|
esp_transport_set_default_port(ssl, WEBSOCKET_SSL_DEFAULT_PORT);
|
||||||
if (config->cert_pem) {
|
if (config->cert_pem) {
|
||||||
@ -268,18 +272,18 @@ esp_websocket_client_handle_t esp_websocket_client_init(const esp_websocket_clie
|
|||||||
esp_transport_list_add(client->transport_list, ssl, "_ssl"); // need to save to transport list, for cleanup
|
esp_transport_list_add(client->transport_list, ssl, "_ssl"); // need to save to transport list, for cleanup
|
||||||
|
|
||||||
esp_transport_handle_t wss = esp_transport_ws_init(ssl);
|
esp_transport_handle_t wss = esp_transport_ws_init(ssl);
|
||||||
ESP_TRANSPORT_MEM_CHECK(TAG, wss, goto _websocket_init_fail);
|
ESP_WS_CLIENT_MEM_CHECK(TAG, wss, goto _websocket_init_fail);
|
||||||
|
|
||||||
esp_transport_set_default_port(wss, WEBSOCKET_SSL_DEFAULT_PORT);
|
esp_transport_set_default_port(wss, WEBSOCKET_SSL_DEFAULT_PORT);
|
||||||
|
|
||||||
esp_transport_list_add(client->transport_list, wss, "wss");
|
esp_transport_list_add(client->transport_list, wss, "wss");
|
||||||
if (config->transport == WEBSOCKET_TRANSPORT_OVER_TCP) {
|
if (config->transport == WEBSOCKET_TRANSPORT_OVER_TCP) {
|
||||||
asprintf(&client->config->scheme, "wss");
|
asprintf(&client->config->scheme, "wss");
|
||||||
ESP_TRANSPORT_MEM_CHECK(TAG, client->config->scheme, goto _websocket_init_fail);
|
ESP_WS_CLIENT_MEM_CHECK(TAG, client->config->scheme, goto _websocket_init_fail);
|
||||||
}
|
}
|
||||||
|
|
||||||
client->config = calloc(1, sizeof(websocket_config_storage_t));
|
client->config = calloc(1, sizeof(websocket_config_storage_t));
|
||||||
ESP_TRANSPORT_MEM_CHECK(TAG, client->config, goto _websocket_init_fail);
|
ESP_WS_CLIENT_MEM_CHECK(TAG, client->config, goto _websocket_init_fail);
|
||||||
|
|
||||||
if (config->uri) {
|
if (config->uri) {
|
||||||
if (esp_websocket_client_set_uri(client, config->uri) != ESP_OK) {
|
if (esp_websocket_client_set_uri(client, config->uri) != ESP_OK) {
|
||||||
@ -295,7 +299,7 @@ esp_websocket_client_handle_t esp_websocket_client_init(const esp_websocket_clie
|
|||||||
|
|
||||||
if (client->config->scheme == NULL) {
|
if (client->config->scheme == NULL) {
|
||||||
asprintf(&client->config->scheme, "ws");
|
asprintf(&client->config->scheme, "ws");
|
||||||
ESP_TRANSPORT_MEM_CHECK(TAG, client->config->scheme, goto _websocket_init_fail);
|
ESP_WS_CLIENT_MEM_CHECK(TAG, client->config->scheme, goto _websocket_init_fail);
|
||||||
}
|
}
|
||||||
|
|
||||||
client->keepalive_tick_ms = _tick_get_ms();
|
client->keepalive_tick_ms = _tick_get_ms();
|
||||||
@ -307,15 +311,15 @@ esp_websocket_client_handle_t esp_websocket_client_init(const esp_websocket_clie
|
|||||||
buffer_size = WEBSOCKET_BUFFER_SIZE_BYTE;
|
buffer_size = WEBSOCKET_BUFFER_SIZE_BYTE;
|
||||||
}
|
}
|
||||||
client->rx_buffer = malloc(buffer_size);
|
client->rx_buffer = malloc(buffer_size);
|
||||||
ESP_TRANSPORT_MEM_CHECK(TAG, client->rx_buffer, {
|
ESP_WS_CLIENT_MEM_CHECK(TAG, client->rx_buffer, {
|
||||||
goto _websocket_init_fail;
|
goto _websocket_init_fail;
|
||||||
});
|
});
|
||||||
client->tx_buffer = malloc(buffer_size);
|
client->tx_buffer = malloc(buffer_size);
|
||||||
ESP_TRANSPORT_MEM_CHECK(TAG, client->tx_buffer, {
|
ESP_WS_CLIENT_MEM_CHECK(TAG, client->tx_buffer, {
|
||||||
goto _websocket_init_fail;
|
goto _websocket_init_fail;
|
||||||
});
|
});
|
||||||
client->status_bits = xEventGroupCreate();
|
client->status_bits = xEventGroupCreate();
|
||||||
ESP_TRANSPORT_MEM_CHECK(TAG, client->status_bits, {
|
ESP_WS_CLIENT_MEM_CHECK(TAG, client->status_bits, {
|
||||||
goto _websocket_init_fail;
|
goto _websocket_init_fail;
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -366,20 +370,20 @@ esp_err_t esp_websocket_client_set_uri(esp_websocket_client_handle_t client, con
|
|||||||
if (puri.field_data[UF_SCHEMA].len) {
|
if (puri.field_data[UF_SCHEMA].len) {
|
||||||
free(client->config->scheme);
|
free(client->config->scheme);
|
||||||
asprintf(&client->config->scheme, "%.*s", puri.field_data[UF_SCHEMA].len, uri + puri.field_data[UF_SCHEMA].off);
|
asprintf(&client->config->scheme, "%.*s", puri.field_data[UF_SCHEMA].len, uri + puri.field_data[UF_SCHEMA].off);
|
||||||
ESP_TRANSPORT_MEM_CHECK(TAG, client->config->scheme, return ESP_ERR_NO_MEM);
|
ESP_WS_CLIENT_MEM_CHECK(TAG, client->config->scheme, return ESP_ERR_NO_MEM);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (puri.field_data[UF_HOST].len) {
|
if (puri.field_data[UF_HOST].len) {
|
||||||
free(client->config->host);
|
free(client->config->host);
|
||||||
asprintf(&client->config->host, "%.*s", puri.field_data[UF_HOST].len, uri + puri.field_data[UF_HOST].off);
|
asprintf(&client->config->host, "%.*s", puri.field_data[UF_HOST].len, uri + puri.field_data[UF_HOST].off);
|
||||||
ESP_TRANSPORT_MEM_CHECK(TAG, client->config->host, return ESP_ERR_NO_MEM);
|
ESP_WS_CLIENT_MEM_CHECK(TAG, client->config->host, return ESP_ERR_NO_MEM);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (puri.field_data[UF_PATH].len) {
|
if (puri.field_data[UF_PATH].len) {
|
||||||
free(client->config->path);
|
free(client->config->path);
|
||||||
asprintf(&client->config->path, "%.*s", puri.field_data[UF_PATH].len, uri + puri.field_data[UF_PATH].off);
|
asprintf(&client->config->path, "%.*s", puri.field_data[UF_PATH].len, uri + puri.field_data[UF_PATH].off);
|
||||||
ESP_TRANSPORT_MEM_CHECK(TAG, client->config->path, return ESP_ERR_NO_MEM);
|
ESP_WS_CLIENT_MEM_CHECK(TAG, client->config->path, return ESP_ERR_NO_MEM);
|
||||||
|
|
||||||
esp_transport_handle_t trans = esp_transport_list_get_transport(client->transport_list, "ws");
|
esp_transport_handle_t trans = esp_transport_list_get_transport(client->transport_list, "ws");
|
||||||
if (trans) {
|
if (trans) {
|
||||||
@ -404,11 +408,11 @@ esp_err_t esp_websocket_client_set_uri(esp_websocket_client_handle_t client, con
|
|||||||
pass ++;
|
pass ++;
|
||||||
free(client->config->password);
|
free(client->config->password);
|
||||||
client->config->password = strdup(pass);
|
client->config->password = strdup(pass);
|
||||||
ESP_TRANSPORT_MEM_CHECK(TAG, client->config->password, return ESP_ERR_NO_MEM);
|
ESP_WS_CLIENT_MEM_CHECK(TAG, client->config->password, return ESP_ERR_NO_MEM);
|
||||||
}
|
}
|
||||||
free(client->config->username);
|
free(client->config->username);
|
||||||
client->config->username = strdup(user_info);
|
client->config->username = strdup(user_info);
|
||||||
ESP_TRANSPORT_MEM_CHECK(TAG, client->config->username, return ESP_ERR_NO_MEM);
|
ESP_WS_CLIENT_MEM_CHECK(TAG, client->config->username, return ESP_ERR_NO_MEM);
|
||||||
free(user_info);
|
free(user_info);
|
||||||
} else {
|
} else {
|
||||||
return ESP_ERR_NO_MEM;
|
return ESP_ERR_NO_MEM;
|
||||||
|
Reference in New Issue
Block a user