From 912c0db0910752d029d329ad20cbff8316a1db08 Mon Sep 17 00:00:00 2001
From: Dave <47106837+sislakd@users.noreply.github.com>
Date: Sun, 19 May 2019 22:38:24 +0200
Subject: [PATCH] Remove deadlock when server is not acking our data (#6107)

* Use bounded waiting instead of infinite one to avoid deadlock

* Reduce timeout to fail much sooner if server is not acking our data

* Return timeout to 15 seconds on every disconnect

* Add comment to introduced delay to make it super clear
---
 libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp | 4 ++++
 libraries/ESP8266WiFi/src/include/ClientContext.h     | 3 ++-
 2 files changed, 6 insertions(+), 1 deletion(-)

diff --git a/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp b/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp
index 7ae53e6b9..b71a5fa7b 100644
--- a/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp
+++ b/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp
@@ -248,6 +248,7 @@ void WiFiClientSecure::_freeSSL() {
   _recvapp_len = 0;
   // This connection is toast
   _handshake_done = false;
+  _timeout = 15000;
 }
 
 bool WiFiClientSecure::_clientConnected() {
@@ -1009,6 +1010,9 @@ bool WiFiClientSecure::_connectSSL(const char* hostName) {
   _x509_insecure = nullptr;
   _x509_knownkey = nullptr;
 
+  // reduce timeout after successful handshake to fail fast if server stop accepting our data for whathever reason
+  if (ret) _timeout = 5000;
+
   return ret;
 }
 
diff --git a/libraries/ESP8266WiFi/src/include/ClientContext.h b/libraries/ESP8266WiFi/src/include/ClientContext.h
index 0126621a6..2f2891510 100644
--- a/libraries/ESP8266WiFi/src/include/ClientContext.h
+++ b/libraries/ESP8266WiFi/src/include/ClientContext.h
@@ -456,7 +456,8 @@ protected:
             }
 
             _send_waiting = true;
-            esp_yield();
+            // This delay will be interrupted by esp_schedule on next received ack
+            delay(_timeout_ms);
         } while(true);
         _send_waiting = false;