@@ -107,6 +107,7 @@ typedef enum {
107107struct esp_websocket_client {
108108 esp_event_loop_handle_t event_handle ;
109109 TaskHandle_t task_handle ;
110+ esp_websocket_error_codes_t error_handle ;
110111 esp_transport_list_handle_t transport_list ;
111112 esp_transport_handle_t transport ;
112113 websocket_config_storage_t * config ;
@@ -196,6 +197,16 @@ static esp_err_t esp_websocket_client_dispatch_event(esp_websocket_client_handle
196197 event_data .payload_len = client -> payload_len ;
197198 event_data .payload_offset = client -> payload_offset ;
198199
200+ if (client -> error_handle .error_type == WEBSOCKET_ERROR_TYPE_TCP_TRANSPORT ) {
201+ event_data .error_handle .esp_tls_last_esp_err = esp_tls_get_and_clear_last_error (esp_transport_get_error_handle (client -> transport ),
202+ & client -> error_handle .esp_tls_stack_err ,
203+ & client -> error_handle .esp_tls_cert_verify_flags );
204+ event_data .error_handle .esp_transport_sock_errno = esp_transport_get_errno (client -> transport );
205+ }
206+ event_data .error_handle .error_type = client -> error_handle .error_type ;
207+ event_data .error_handle .esp_ws_handshake_status_code = client -> error_handle .esp_ws_handshake_status_code ;
208+
209+
199210 if ((err = esp_event_post_to (client -> event_handle ,
200211 WEBSOCKET_EVENTS , event ,
201212 & event_data ,
@@ -206,7 +217,7 @@ static esp_err_t esp_websocket_client_dispatch_event(esp_websocket_client_handle
206217 return esp_event_loop_run (client -> event_handle , 0 );
207218}
208219
209- static esp_err_t esp_websocket_client_abort_connection (esp_websocket_client_handle_t client )
220+ static esp_err_t esp_websocket_client_abort_connection (esp_websocket_client_handle_t client , esp_websocket_error_type_t error_type )
210221{
211222 ESP_WS_CLIENT_STATE_CHECK (TAG , client , return ESP_FAIL );
212223 esp_transport_close (client -> transport );
@@ -215,6 +226,8 @@ static esp_err_t esp_websocket_client_abort_connection(esp_websocket_client_hand
215226 client -> reconnect_tick_ms = _tick_get_ms ();
216227 ESP_LOGI (TAG , "Reconnect after %d ms" , client -> wait_timeout_ms );
217228 }
229+
230+ client -> error_handle .error_type = error_type ;
218231 client -> state = WEBSOCKET_STATE_WAIT_TIMEOUT ;
219232 esp_websocket_client_dispatch_event (client , WEBSOCKET_EVENT_DISCONNECTED , NULL , 0 );
220233 return ESP_OK ;
@@ -725,6 +738,19 @@ esp_err_t esp_websocket_client_set_uri(esp_websocket_client_handle_t client, con
725738 return ESP_OK ;
726739}
727740
741+ esp_err_t esp_websocket_client_set_headers (esp_websocket_client_handle_t client , const char * headers )
742+ {
743+ if (client == NULL || client -> state != WEBSOCKET_STATE_CONNECTED || headers == NULL ) {
744+ return ESP_ERR_INVALID_ARG ;
745+ }
746+
747+ xSemaphoreTakeRecursive (client -> lock , portMAX_DELAY );
748+ esp_err_t ret = esp_transport_ws_set_headers (client -> transport , headers );
749+ xSemaphoreGiveRecursive (client -> lock );
750+
751+ return ret ;
752+ }
753+
728754static esp_err_t esp_websocket_client_recv (esp_websocket_client_handle_t client )
729755{
730756 int rlen ;
@@ -739,14 +765,10 @@ static esp_err_t esp_websocket_client_recv(esp_websocket_client_handle_t client)
739765 esp_websocket_free_buf (client , false);
740766 esp_tls_error_handle_t error_handle = esp_transport_get_error_handle (client -> transport );
741767 if (error_handle ) {
742- ESP_LOGE (TAG , "esp_transport_read() failed with %d, last_error=%s, tls_error_code=%i, tls_flags=%i, errno=%d" ,
743- rlen , esp_err_to_name (error_handle -> last_error ), error_handle -> esp_tls_error_code ,
744- error_handle -> esp_tls_flags , errno );
745- esp_websocket_client_error (client , "esp_transport_read() failed with %d, last_error=%s, tls_error_code=%i, tls_flags=%i, errno=%d" ,
768+ esp_websocket_client_error (client , "esp_transport_read() failed with %d, transport_error=%s, tls_error_code=%i, tls_flags=%i, errno=%d" ,
746769 rlen , esp_err_to_name (error_handle -> last_error ), error_handle -> esp_tls_error_code ,
747770 error_handle -> esp_tls_flags , errno );
748771 } else {
749- ESP_LOGE (TAG , "esp_transport_read() failed with %d, errno=%d" , rlen , errno );
750772 esp_websocket_client_error (client , "esp_transport_read() failed with %d, errno=%d" , rlen , errno );
751773 }
752774 return ESP_FAIL ;
@@ -817,32 +839,32 @@ static void esp_websocket_client_task(void *pv)
817839 client -> run = false;
818840 break ;
819841 }
842+ esp_websocket_client_dispatch_event (client , WEBSOCKET_EVENT_BEFORE_CONNECT , NULL , 0 );
820843 int result = esp_transport_connect (client -> transport ,
821844 client -> config -> host ,
822845 client -> config -> port ,
823846 client -> config -> network_timeout_ms );
824847 if (result < 0 ) {
825848 esp_tls_error_handle_t error_handle = esp_transport_get_error_handle (client -> transport );
849+ client -> error_handle .esp_ws_handshake_status_code = esp_transport_ws_get_upgrade_request_status (client -> transport );
826850 if (error_handle ) {
827- ESP_LOGE (TAG , "esp_transport_connect() failed with %d, last_error=%s, tls_error_code=%i, tls_flags=%i, errno=%d" ,
828- result , esp_err_to_name (error_handle -> last_error ), error_handle -> esp_tls_error_code ,
829- error_handle -> esp_tls_flags , errno );
830- esp_websocket_client_error (client , "esp_transport_connect() failed with %d, last_error=%s, tls_error_code=%i, tls_flags=%i, errno=%d" ,
851+ esp_websocket_client_error (client , "esp_transport_connect() failed with %d,\
852+ transport_error=%s, tls_error_code=%i, tls_flags=%i, esp_ws_handshake_status_code=%d, errno=%d" ,
831853 result , esp_err_to_name (error_handle -> last_error ), error_handle -> esp_tls_error_code ,
832- error_handle -> esp_tls_flags , errno );
854+ error_handle -> esp_tls_flags , client -> error_handle . esp_ws_handshake_status_code , errno );
833855 } else {
834- ESP_LOGE ( TAG , "esp_transport_connect() failed with %d, errno =%d" , result , errno );
835- esp_websocket_client_error ( client , "esp_transport_connect() failed with %d, errno=%d" , result , errno );
856+ esp_websocket_client_error ( client , "esp_transport_connect() failed with %d, esp_ws_handshake_status_code =%d, errno=%d" ,
857+ result , client -> error_handle . esp_ws_handshake_status_code , errno );
836858 }
837- esp_websocket_client_abort_connection (client );
859+ esp_websocket_client_abort_connection (client , WEBSOCKET_ERROR_TYPE_TCP_TRANSPORT );
838860 break ;
839861 }
840862 ESP_LOGD (TAG , "Transport connected to %s://%s:%d" , client -> config -> scheme , client -> config -> host , client -> config -> port );
841863
842864 client -> state = WEBSOCKET_STATE_CONNECTED ;
843865 client -> wait_for_pong_resp = false;
866+ client -> error_handle .error_type = WEBSOCKET_ERROR_TYPE_NONE ;
844867 esp_websocket_client_dispatch_event (client , WEBSOCKET_EVENT_CONNECTED , NULL , 0 );
845-
846868 break ;
847869 case WEBSOCKET_STATE_CONNECTED :
848870 if ((CLOSE_FRAME_SENT_BIT & xEventGroupGetBits (client -> status_bits )) == 0 ) { // only send and check for PING
@@ -860,14 +882,14 @@ static void esp_websocket_client_task(void *pv)
860882
861883 if ( _tick_get_ms () - client -> pingpong_tick_ms > client -> config -> pingpong_timeout_sec * 1000 ) {
862884 if (client -> wait_for_pong_resp ) {
863- ESP_LOGE (TAG , "Error, no PONG received for more than %d seconds after PING" , client -> config -> pingpong_timeout_sec );
864885 esp_websocket_client_error (client , "Error, no PONG received for more than %d seconds after PING" , client -> config -> pingpong_timeout_sec );
865- esp_websocket_client_abort_connection (client );
886+ esp_websocket_client_abort_connection (client , WEBSOCKET_ERROR_TYPE_PONG_TIMEOUT );
866887 break ;
867888 }
868889 }
869890 }
870891
892+
871893 if (read_select == 0 ) {
872894 ESP_LOGV (TAG , "Read poll timeout: skipping esp_transport_read()..." );
873895 break ;
@@ -876,7 +898,7 @@ static void esp_websocket_client_task(void *pv)
876898
877899 if (esp_websocket_client_recv (client ) == ESP_FAIL ) {
878900 ESP_LOGE (TAG , "Error receive data" );
879- esp_websocket_client_abort_connection (client );
901+ esp_websocket_client_abort_connection (client , WEBSOCKET_ERROR_TYPE_TCP_TRANSPORT );
880902 break ;
881903 }
882904 break ;
@@ -910,17 +932,13 @@ static void esp_websocket_client_task(void *pv)
910932 if (read_select < 0 ) {
911933 esp_tls_error_handle_t error_handle = esp_transport_get_error_handle (client -> transport );
912934 if (error_handle ) {
913- ESP_LOGE (TAG , "esp_transport_poll_read() returned %d, last_error=%s, tls_error_code=%i, tls_flags=%i, errno=%d" ,
914- read_select , esp_err_to_name (error_handle -> last_error ), error_handle -> esp_tls_error_code ,
915- error_handle -> esp_tls_flags , errno );
916- esp_websocket_client_error (client , "esp_transport_poll_read() returned %d, last_error=%s, tls_error_code=%i, tls_flags=%i, errno=%d" ,
935+ esp_websocket_client_error (client , "esp_transport_poll_read() returned %d, transport_error=%s, tls_error_code=%i, tls_flags=%i, errno=%d" ,
917936 read_select , esp_err_to_name (error_handle -> last_error ), error_handle -> esp_tls_error_code ,
918937 error_handle -> esp_tls_flags , errno );
919938 } else {
920- ESP_LOGE (TAG , "esp_transport_poll_read() returned %d, errno=%d" , read_select , errno );
921939 esp_websocket_client_error (client , "esp_transport_poll_read() returned %d, errno=%d" , read_select , errno );
922940 }
923- esp_websocket_client_abort_connection (client );
941+ esp_websocket_client_abort_connection (client , WEBSOCKET_ERROR_TYPE_TCP_TRANSPORT );
924942 }
925943 } else if (WEBSOCKET_STATE_WAIT_TIMEOUT == client -> state ) {
926944 // waiting for reconnecting...
@@ -1120,17 +1138,13 @@ int esp_websocket_client_send_with_opcode(esp_websocket_client_handle_t client,
11201138 esp_websocket_free_buf (client , true);
11211139 esp_tls_error_handle_t error_handle = esp_transport_get_error_handle (client -> transport );
11221140 if (error_handle ) {
1123- ESP_LOGE (TAG , "esp_transport_write() returned %d, last_error=%s, tls_error_code=%i, tls_flags=%i, errno=%d" ,
1124- ret , esp_err_to_name (error_handle -> last_error ), error_handle -> esp_tls_error_code ,
1125- error_handle -> esp_tls_flags , errno );
1126- esp_websocket_client_error (client , "esp_transport_write() returned %d, last_error=%s, tls_error_code=%i, tls_flags=%i, errno=%d" ,
1141+ esp_websocket_client_error (client , "esp_transport_write() returned %d, transport_error=%s, tls_error_code=%i, tls_flags=%i, errno=%d" ,
11271142 ret , esp_err_to_name (error_handle -> last_error ), error_handle -> esp_tls_error_code ,
11281143 error_handle -> esp_tls_flags , errno );
11291144 } else {
1130- ESP_LOGE (TAG , "esp_transport_write() returned %d, errno=%d" , ret , errno );
11311145 esp_websocket_client_error (client , "esp_transport_write() returned %d, errno=%d" , ret , errno );
11321146 }
1133- esp_websocket_client_abort_connection (client );
1147+ esp_websocket_client_abort_connection (client , WEBSOCKET_ERROR_TYPE_TCP_TRANSPORT );
11341148 goto unlock_and_return ;
11351149 }
11361150 current_opcode = 0 ;
0 commit comments