From 88f2397bc5116e88b082cc19af0e0dc03bef3358 Mon Sep 17 00:00:00 2001
From: Krzysiek S <chris.streh@gmail.com>
Date: Fri, 14 Oct 2022 09:25:18 +0200
Subject: [PATCH 1/3] Fix hostByName to avoid asking DNS when valid IP is
 passed via hostname param

---
 libraries/WiFi/src/WiFiGeneric.cpp | 35 ++++++++++++++++--------------
 1 file changed, 19 insertions(+), 16 deletions(-)

diff --git a/libraries/WiFi/src/WiFiGeneric.cpp b/libraries/WiFi/src/WiFiGeneric.cpp
index e64ac631020..330f4487e0e 100644
--- a/libraries/WiFi/src/WiFiGeneric.cpp
+++ b/libraries/WiFi/src/WiFiGeneric.cpp
@@ -1414,28 +1414,31 @@ static void wifi_dns_found_callback(const char *name, const ip_addr_t *ipaddr, v
 }
 
 /**
- * Resolve the given hostname to an IP address.
- * @param aHostname     Name to be resolved
+ * Resolve the given hostname to an IP address. If passed hostname is an IP address, it will be parsed into IPAddress structure.
+ * @param aHostname     Name to be resolved or string containing IP address
  * @param aResult       IPAddress structure to store the returned IP address
  * @return 1 if aIPAddrString was successfully converted to an IP address,
  *          else error code
  */
 int WiFiGenericClass::hostByName(const char* aHostname, IPAddress& aResult)
 {
-    ip_addr_t addr;
-    aResult = static_cast<uint32_t>(0);
-    waitStatusBits(WIFI_DNS_IDLE_BIT, 16000);
-    clearStatusBits(WIFI_DNS_IDLE_BIT | WIFI_DNS_DONE_BIT);
-    err_t err = dns_gethostbyname(aHostname, &addr, &wifi_dns_found_callback, &aResult);
-    if(err == ERR_OK && addr.u_addr.ip4.addr) {
-        aResult = addr.u_addr.ip4.addr;
-    } else if(err == ERR_INPROGRESS) {
-        waitStatusBits(WIFI_DNS_DONE_BIT, 15000);  //real internal timeout in lwip library is 14[s]
-        clearStatusBits(WIFI_DNS_DONE_BIT);
-    }
-    setStatusBits(WIFI_DNS_IDLE_BIT);
-    if((uint32_t)aResult == 0){
-        log_e("DNS Failed for %s", aHostname);
+    if (!aResult.fromString(aHostname))
+    {
+        ip_addr_t addr;
+        aResult = static_cast<uint32_t>(0);
+        waitStatusBits(WIFI_DNS_IDLE_BIT, 16000);
+        clearStatusBits(WIFI_DNS_IDLE_BIT | WIFI_DNS_DONE_BIT);
+        err_t err = dns_gethostbyname(aHostname, &addr, &wifi_dns_found_callback, &aResult);
+        if(err == ERR_OK && addr.u_addr.ip4.addr) {
+            aResult = addr.u_addr.ip4.addr;
+        } else if(err == ERR_INPROGRESS) {
+            waitStatusBits(WIFI_DNS_DONE_BIT, 15000);  //real internal timeout in lwip library is 14[s]
+            clearStatusBits(WIFI_DNS_DONE_BIT);
+        }
+        setStatusBits(WIFI_DNS_IDLE_BIT);
+        if((uint32_t)aResult == 0){
+            log_e("DNS Failed for %s", aHostname);
+        }
     }
     return (uint32_t)aResult != 0;
 }

From d3f62148ccf2170c6ad8c957effbb4617013593c Mon Sep 17 00:00:00 2001
From: Krzysiek S <chris.streh@gmail.com>
Date: Sat, 15 Oct 2022 11:23:08 +0200
Subject: [PATCH 2/3] Fix hanging in send_ssl_data

---
 libraries/WiFiClientSecure/src/ssl_client.cpp | 19 ++++++++++++++++---
 libraries/WiFiClientSecure/src/ssl_client.h   |  1 +
 2 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/libraries/WiFiClientSecure/src/ssl_client.cpp b/libraries/WiFiClientSecure/src/ssl_client.cpp
index 4333b3043b8..ed236dcc332 100644
--- a/libraries/WiFiClientSecure/src/ssl_client.cpp
+++ b/libraries/WiFiClientSecure/src/ssl_client.cpp
@@ -90,6 +90,8 @@ int start_ssl_client(sslclient_context *ssl_client, const char *host, uint32_t p
         timeout = 30000; // Milli seconds.
     }
 
+    ssl_client->socket_timeout = timeout;
+
     fd_set fdset;
     struct timeval tv;
     FD_ZERO(&fdset);
@@ -341,12 +343,15 @@ void stop_ssl_socket(sslclient_context *ssl_client, const char *rootCABuff, cons
     mbedtls_ctr_drbg_free(&ssl_client->drbg_ctx);
     mbedtls_entropy_free(&ssl_client->entropy_ctx);
     
-    // save only interesting field
-    int timeout = ssl_client->handshake_timeout;
+    // save only interesting fields
+    int handshake_timeout = ssl_client->handshake_timeout;
+    int socket_timeout = ssl_client->socket_timeout;
+
     // reset embedded pointers to zero
     memset(ssl_client, 0, sizeof(sslclient_context));
     
-    ssl_client->handshake_timeout = timeout;
+    ssl_client->handshake_timeout = handshake_timeout;
+    ssl_client->socket_timeout = socket_timeout;
 }
 
 
@@ -369,11 +374,19 @@ int send_ssl_data(sslclient_context *ssl_client, const uint8_t *data, size_t len
     log_v("Writing HTTP request with %d bytes...", len); //for low level debug
     int ret = -1;
 
+    unsigned long send_start_time=millis();
+
     while ((ret = mbedtls_ssl_write(&ssl_client->ssl_ctx, data, len)) <= 0) {
+        if((millis()-send_start_time)>ssl_client->socket_timeout) {
+            log_v("SSL write timeout.");
+            return -1;
+        }
+
         if (ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE && ret < 0) {
             log_v("Handling error %d", ret); //for low level debug
             return handle_error(ret);
         }
+        
         //wait for space to become available
         vTaskDelay(2);
     }
diff --git a/libraries/WiFiClientSecure/src/ssl_client.h b/libraries/WiFiClientSecure/src/ssl_client.h
index ea89e6bb50a..1f4179c98dd 100644
--- a/libraries/WiFiClientSecure/src/ssl_client.h
+++ b/libraries/WiFiClientSecure/src/ssl_client.h
@@ -24,6 +24,7 @@ typedef struct sslclient_context {
     mbedtls_x509_crt client_cert;
     mbedtls_pk_context client_key;
 
+    unsigned long socket_timeout;
     unsigned long handshake_timeout;
 } sslclient_context;
 

From 93c06399868901d8253d5919ef0949e6791a9826 Mon Sep 17 00:00:00 2001
From: Krzysiek S <chris.streh@gmail.com>
Date: Mon, 17 Oct 2022 11:31:04 +0200
Subject: [PATCH 3/3] Change variable name in send_ssl_data

---
 libraries/WiFiClientSecure/src/ssl_client.cpp | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/libraries/WiFiClientSecure/src/ssl_client.cpp b/libraries/WiFiClientSecure/src/ssl_client.cpp
index ed236dcc332..95e4f023d93 100644
--- a/libraries/WiFiClientSecure/src/ssl_client.cpp
+++ b/libraries/WiFiClientSecure/src/ssl_client.cpp
@@ -374,11 +374,11 @@ int send_ssl_data(sslclient_context *ssl_client, const uint8_t *data, size_t len
     log_v("Writing HTTP request with %d bytes...", len); //for low level debug
     int ret = -1;
 
-    unsigned long send_start_time=millis();
+    unsigned long write_start_time=millis();
 
     while ((ret = mbedtls_ssl_write(&ssl_client->ssl_ctx, data, len)) <= 0) {
-        if((millis()-send_start_time)>ssl_client->socket_timeout) {
-            log_v("SSL write timeout.");
+        if((millis()-write_start_time)>ssl_client->socket_timeout) {
+            log_v("SSL write timed out.");
             return -1;
         }