@@ -57,7 +57,6 @@ static int s_pk_refcnt = 0;
5757uint8_t * default_certificate = 0 ;
5858uint32_t default_certificate_len = 0 ;
5959static bool default_certificate_dynamic = false ;
60- static ClientContext* s_io_ctx = nullptr ;
6160
6261static void clear_private_key ();
6362static void clear_certificate ();
@@ -82,6 +81,8 @@ class SSLContext {
8281 if (_ssl_ctx_refcnt == 0 ) {
8382 ssl_ctx_free (_ssl_ctx);
8483 }
84+
85+ s_io_ctx = nullptr ;
8586 }
8687
8788 void ref () {
@@ -95,6 +96,7 @@ class SSLContext {
9596 }
9697
9798 void connect (ClientContext* ctx, const char * hostName, uint32_t timeout_ms) {
99+ s_io_ctx = ctx;
98100 _ssl = ssl_client_new (_ssl_ctx, 0 , nullptr , 0 , hostName);
99101 uint32_t t = millis ();
100102
@@ -107,6 +109,10 @@ class SSLContext {
107109 }
108110 }
109111
112+ void stop () {
113+ s_io_ctx = nullptr ;
114+ }
115+
110116 bool connected () {
111117 return _ssl != nullptr && ssl_handshake_status (_ssl) == SSL_OK;
112118 }
@@ -173,6 +179,10 @@ class SSLContext {
173179 return _ssl;
174180 }
175181
182+ static ClientContext* getIOContext (int fd) {
183+ return s_io_ctx;
184+ }
185+
176186protected:
177187 int _readAll () {
178188 if (!_ssl)
@@ -201,18 +211,18 @@ class SSLContext {
201211 int _refcnt = 0 ;
202212 const uint8_t * _read_ptr = nullptr ;
203213 size_t _available = 0 ;
214+ static ClientContext* s_io_ctx;
204215};
205216
206217SSL_CTX* SSLContext::_ssl_ctx = nullptr ;
207218int SSLContext::_ssl_ctx_refcnt = 0 ;
208-
219+ ClientContext* SSLContext::s_io_ctx = nullptr ;
209220
210221WiFiClientSecure::WiFiClientSecure () {
211222 ++s_pk_refcnt;
212223}
213224
214225WiFiClientSecure::~WiFiClientSecure () {
215- s_io_ctx = nullptr ;
216226 if (_ssl) {
217227 _ssl->unref ();
218228 }
@@ -264,8 +274,6 @@ int WiFiClientSecure::_connectSSL(const char* hostName) {
264274 _ssl = nullptr ;
265275 }
266276
267- s_io_ctx = _client;
268-
269277 _ssl = new SSLContext;
270278 _ssl->ref ();
271279 _ssl->connect (_client, hostName, 5000 );
@@ -371,7 +379,9 @@ uint8_t WiFiClientSecure::connected() {
371379}
372380
373381void WiFiClientSecure::stop () {
374- s_io_ctx = nullptr ;
382+ if (_ssl) {
383+ _ssl->stop ();
384+ }
375385 WiFiClient::stop ();
376386}
377387
@@ -525,7 +535,7 @@ static void clear_certificate() {
525535}
526536
527537extern " C" int ax_port_read (int fd, uint8_t * buffer, size_t count) {
528- ClientContext* _client = s_io_ctx ;
538+ ClientContext* _client = SSLContext::getIOContext (fd) ;
529539 if (!_client || _client->state () != ESTABLISHED && !_client->getSize ()) {
530540 errno = EIO;
531541 return -1 ;
@@ -542,7 +552,7 @@ extern "C" int ax_port_read(int fd, uint8_t* buffer, size_t count) {
542552}
543553
544554extern " C" int ax_port_write (int fd, uint8_t * buffer, size_t count) {
545- ClientContext* _client = s_io_ctx ;
555+ ClientContext* _client = SSLContext::getIOContext (fd) ;
546556 if (!_client || _client->state () != ESTABLISHED) {
547557 errno = EIO;
548558 return -1 ;
0 commit comments