2626
2727#include "shared-bindings/socketpool/Socket.h"
2828
29+ #include "lib/utils/interrupt_char.h"
2930#include "py/mperrno.h"
3031#include "py/runtime.h"
32+ #include "supervisor/shared/tick.h"
33+
34+ #include "esp_log.h"
35+ static const char * TAG = "socket" ;
3136
3237void common_hal_socketpool_socket_settimeout (socketpool_socket_obj_t * self , mp_uint_t timeout_ms ) {
3338 self -> timeout_ms = timeout_ms ;
@@ -43,13 +48,15 @@ bool common_hal_socketpool_socket_connect(socketpool_socket_obj_t* self, const c
4348 tls_config = & self -> ssl_context -> ssl_config ;
4449 }
4550 int result = esp_tls_conn_new_sync (host , hostlen , port , tls_config , self -> tcp );
51+ ESP_EARLY_LOGW (TAG , "connect result %d" , result );
4652 self -> connected = result >= 0 ;
4753 if (result < 0 ) {
4854 int esp_tls_code ;
49- esp_tls_get_and_clear_last_error (self -> tcp -> error_handle , & esp_tls_code , NULL );
55+ int flags ;
56+ esp_err_t err = esp_tls_get_and_clear_last_error (self -> tcp -> error_handle , & esp_tls_code , & flags );
5057
5158 // mp_raise_espidf_MemoryError
52- mp_raise_OSError_msg_varg (translate ("Unhandled ESP TLS error %d" ), esp_tls_code );
59+ mp_raise_OSError_msg_varg (translate ("Unhandled ESP TLS error %d %d %x " ), esp_tls_code , flags , err );
5360 }
5461 return self -> connected ;
5562}
@@ -68,19 +75,44 @@ mp_uint_t common_hal_socketpool_socket_send(socketpool_socket_obj_t* self, const
6875}
6976
7077mp_uint_t common_hal_socketpool_socket_recv_into (socketpool_socket_obj_t * self , const uint8_t * buf , mp_uint_t len ) {
71- size_t received = esp_tls_conn_read (self -> tcp , (void * ) buf , len );
78+ size_t received = 0 ;
79+ ssize_t last_read = 1 ;
80+ uint64_t start_ticks = supervisor_ticks_ms64 ();
81+ while (received < len &&
82+ last_read > 0 &&
83+ (self -> timeout_ms == 0 || supervisor_ticks_ms64 () - start_ticks <= self -> timeout_ms ) &&
84+ !mp_hal_is_interrupted ()) {
85+ RUN_BACKGROUND_TASKS ;
86+ size_t available = esp_tls_get_bytes_avail (self -> tcp );
87+ ESP_EARLY_LOGW (TAG , "available %d" , available );
88+ size_t remaining = len - received ;
89+ if (available > remaining ) {
90+ available = remaining ;
91+ }
92+ if (true || available > 0 ) {
93+ if (available == 0 ) {
94+ available = len - received ;
95+ }
96+ last_read = esp_tls_conn_read (self -> tcp , (void * ) buf + received , available );
97+ ESP_EARLY_LOGW (TAG , "read %d out of %d" , last_read , available );
98+ received += last_read ;
99+ }
100+ }
72101
73- if (received == 0 ) {
102+ if (last_read == 0 ) {
74103 // socket closed
104+ ESP_EARLY_LOGW (TAG , "receive close %d %d" , received , len );
75105 common_hal_socketpool_socket_close (self );
76106 }
77- if (received < 0 ) {
107+ if (last_read < 0 ) {
108+ // ESP_EARLY_LOGI(TAG, "received %d", received);
78109 mp_raise_BrokenPipeError ();
79110 }
80111 return received ;
81112}
82113
83114void common_hal_socketpool_socket_close (socketpool_socket_obj_t * self ) {
115+ // ESP_EARLY_LOGW(TAG, "close");
84116 if (self -> connected ) {
85117 self -> connected = false;
86118 }
@@ -95,5 +127,6 @@ void common_hal_socketpool_socket_close(socketpool_socket_obj_t* self) {
95127}
96128
97129bool common_hal_socketpool_socket_get_closed (socketpool_socket_obj_t * self ) {
130+ // ESP_EARLY_LOGW(TAG, "tcp %p", self->tcp);
98131 return self -> tcp == NULL ;
99132}
0 commit comments