Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(websocket): Add websocket HTTP redirect #771

Draft
wants to merge 1 commit into
base: master
Choose a base branch
from
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 36 additions & 13 deletions components/esp_websocket_client/esp_websocket_client.c
Original file line number Diff line number Diff line change
Expand Up @@ -586,6 +586,23 @@ static esp_err_t esp_websocket_client_create_transport(esp_websocket_client_hand
return ESP_OK;
}

static void esp_websocket_client_prepare_transport(esp_websocket_client_handle_t client)
{
//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);
}

if (client->transport == NULL) {
ESP_LOGE(TAG, "There are no transports valid, stop websocket client");
client->run = false;
}
//default port
if (client->config->port == 0) {
client->config->port = esp_transport_get_default_port(client->transport);
}
}

static int esp_websocket_client_send_with_exact_opcode(esp_websocket_client_handle_t client, ws_transport_opcodes_t opcode, const uint8_t *data, int len, TickType_t timeout)
{
int ret = -1;
Expand Down Expand Up @@ -985,19 +1002,7 @@ static void esp_websocket_client_task(void *pv)
esp_websocket_client_handle_t client = (esp_websocket_client_handle_t) 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);
}

if (client->transport == NULL) {
ESP_LOGE(TAG, "There are no transports valid, stop websocket client");
client->run = false;
}
//default port
if (client->config->port == 0) {
client->config->port = esp_transport_get_default_port(client->transport);
}
esp_websocket_client_prepare_transport(client);

client->state = WEBSOCKET_STATE_INIT;
xEventGroupClearBits(client->status_bits, STOPPED_BIT | CLOSE_FRAME_SENT_BIT);
Expand All @@ -1024,6 +1029,24 @@ static void esp_websocket_client_task(void *pv)
esp_tls_error_handle_t error_handle = esp_transport_get_error_handle(client->transport);
client->error_handle.esp_ws_handshake_status_code = esp_transport_ws_get_upgrade_request_status(client->transport);
if (error_handle) {
#ifdef ESP_TRANSPORT_WS_SUPPORTED_FEATURE_REDIRECT
if (client->error_handle.esp_ws_handshake_status_code == WS_TRANSPORT_RESPONSE_REDIR) {
client->config->port = 0;
client->config->uri = esp_transport_ws_get_redir_uri(client->transport);
if (client->config->uri != NULL) {
ESP_LOGI(TAG, "Redirecting to %s", client->config->uri);
esp_websocket_client_set_uri(client, client->config->uri);
esp_websocket_client_prepare_transport(client);

// Rerun the connection with the redir uri.
client->state = WEBSOCKET_STATE_INIT;
break;
} else {
// No redir uri found, continue with error and abort.
ESP_LOGE(TAG, "There are no redirect uri");
}
}
#endif
esp_websocket_client_error(client, "esp_transport_connect() failed with %d, "
"transport_error=%s, tls_error_code=%i, tls_flags=%i, esp_ws_handshake_status_code=%d, errno=%d",
result, esp_err_to_name(error_handle->last_error), error_handle->esp_tls_error_code,
Expand Down
Loading