Skip to content

Commit d98ecab

Browse files
committed
feat(websocket): Add websocket HTTP redirect
- Handle 301 status (moved permanently) and redirect the connection to the new host.
1 parent f1a72ec commit d98ecab

File tree

1 file changed

+38
-17
lines changed

1 file changed

+38
-17
lines changed

components/esp_websocket_client/esp_websocket_client.c

Lines changed: 38 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -586,6 +586,23 @@ static esp_err_t esp_websocket_client_create_transport(esp_websocket_client_hand
586586
return ESP_OK;
587587
}
588588

589+
static void esp_websocket_client_prepare_transport(esp_websocket_client_handle_t client)
590+
{
591+
//get transport by scheme
592+
if (client->transport == NULL && client->config->ext_transport == NULL) {
593+
client->transport = esp_transport_list_get_transport(client->transport_list, client->config->scheme);
594+
}
595+
596+
if (client->transport == NULL) {
597+
ESP_LOGE(TAG, "There are no transports valid, stop websocket client");
598+
client->run = false;
599+
}
600+
//default port
601+
if (client->config->port == 0) {
602+
client->config->port = esp_transport_get_default_port(client->transport);
603+
}
604+
}
605+
589606
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)
590607
{
591608
int ret = -1;
@@ -985,19 +1002,7 @@ static void esp_websocket_client_task(void *pv)
9851002
esp_websocket_client_handle_t client = (esp_websocket_client_handle_t) pv;
9861003
client->run = true;
9871004

988-
//get transport by scheme
989-
if (client->transport == NULL && client->config->ext_transport == NULL) {
990-
client->transport = esp_transport_list_get_transport(client->transport_list, client->config->scheme);
991-
}
992-
993-
if (client->transport == NULL) {
994-
ESP_LOGE(TAG, "There are no transports valid, stop websocket client");
995-
client->run = false;
996-
}
997-
//default port
998-
if (client->config->port == 0) {
999-
client->config->port = esp_transport_get_default_port(client->transport);
1000-
}
1005+
esp_websocket_client_prepare_transport(client);
10011006

10021007
client->state = WEBSOCKET_STATE_INIT;
10031008
xEventGroupClearBits(client->status_bits, STOPPED_BIT | CLOSE_FRAME_SENT_BIT);
@@ -1024,10 +1029,26 @@ static void esp_websocket_client_task(void *pv)
10241029
esp_tls_error_handle_t error_handle = esp_transport_get_error_handle(client->transport);
10251030
client->error_handle.esp_ws_handshake_status_code = esp_transport_ws_get_upgrade_request_status(client->transport);
10261031
if (error_handle) {
1027-
esp_websocket_client_error(client, "esp_transport_connect() failed with %d, "
1028-
"transport_error=%s, tls_error_code=%i, tls_flags=%i, esp_ws_handshake_status_code=%d, errno=%d",
1029-
result, esp_err_to_name(error_handle->last_error), error_handle->esp_tls_error_code,
1030-
error_handle->esp_tls_flags, client->error_handle.esp_ws_handshake_status_code, errno);
1032+
if (client->error_handle.esp_ws_handshake_status_code == WS_TRANSPORT_RESPONSE_REDIR) {
1033+
client->config->port = 0;
1034+
client->config->uri = esp_transport_ws_get_redir_uri(client->transport);
1035+
if (client->config->uri == NULL) {
1036+
ESP_LOGE(TAG, "There are no redirect uri");
1037+
} else {
1038+
ESP_LOGI(TAG, "Redirecting to %s", client->config->uri);
1039+
esp_websocket_client_set_uri(client, client->config->uri);
1040+
esp_websocket_client_prepare_transport(client);
1041+
1042+
// Rerun the connection with the redir uri.
1043+
client->state = WEBSOCKET_STATE_INIT;
1044+
break;
1045+
}
1046+
} else {
1047+
esp_websocket_client_error(client, "esp_transport_connect() failed with %d, "
1048+
"transport_error=%s, tls_error_code=%i, tls_flags=%i, esp_ws_handshake_status_code=%d, errno=%d",
1049+
result, esp_err_to_name(error_handle->last_error), error_handle->esp_tls_error_code,
1050+
error_handle->esp_tls_flags, client->error_handle.esp_ws_handshake_status_code, errno);
1051+
}
10311052
} else {
10321053
esp_websocket_client_error(client, "esp_transport_connect() failed with %d, esp_ws_handshake_status_code=%d, errno=%d",
10331054
result, client->error_handle.esp_ws_handshake_status_code, errno);

0 commit comments

Comments
 (0)