From a507e89be23a589d5a40ee2071f29c323f20958c Mon Sep 17 00:00:00 2001 From: david gauchard Date: Wed, 31 Mar 2021 01:12:01 +0200 Subject: [PATCH 1/2] fix WiFiClient::write(flash or iram) --- libraries/ESP8266WiFi/src/WiFiClient.cpp | 14 +++++++++---- .../ESP8266WiFi/src/include/ClientContext.h | 21 ++----------------- 2 files changed, 12 insertions(+), 23 deletions(-) diff --git a/libraries/ESP8266WiFi/src/WiFiClient.cpp b/libraries/ESP8266WiFi/src/WiFiClient.cpp index 7a1c39e128..7686869b0b 100644 --- a/libraries/ESP8266WiFi/src/WiFiClient.cpp +++ b/libraries/ESP8266WiFi/src/WiFiClient.cpp @@ -212,7 +212,8 @@ size_t WiFiClient::write(const uint8_t *buf, size_t size) return 0; } _client->setTimeout(_timeout); - return _client->write(buf, size); + StreamConstPtr ptr(buf, size); + return _client->write(ptr); } size_t WiFiClient::write(Stream& stream, size_t unused) @@ -227,8 +228,12 @@ size_t WiFiClient::write(Stream& stream) { return 0; } - _client->setTimeout(_timeout); - return _client->write(stream); + if (stream.hasPeekBufferAPI()) + { + _client->setTimeout(_timeout); + return _client->write(stream); + } + return stream.sendAvailable(this); } size_t WiFiClient::write_P(PGM_P buf, size_t size) @@ -238,7 +243,8 @@ size_t WiFiClient::write_P(PGM_P buf, size_t size) return 0; } _client->setTimeout(_timeout); - return _client->write_P(buf, size); + StreamConstPtr nopeek(buf, size); + return nopeek.sendAll(this); } int WiFiClient::available() diff --git a/libraries/ESP8266WiFi/src/include/ClientContext.h b/libraries/ESP8266WiFi/src/include/ClientContext.h index 9eb81ec295..43ce731de0 100644 --- a/libraries/ESP8266WiFi/src/include/ClientContext.h +++ b/libraries/ESP8266WiFi/src/include/ClientContext.h @@ -31,6 +31,7 @@ extern "C" void esp_schedule(); #include #include +#include bool getDefaultPrivateGlobalSyncValue (); @@ -372,32 +373,15 @@ class ClientContext return _pcb->state; } - size_t write(const uint8_t* data, size_t size) - { - if (!_pcb) { - return 0; - } - StreamConstPtr ptr(data, size); - return _write_from_source(&ptr); - } - size_t write(Stream& stream) { if (!_pcb) { return 0; } + assert(stream.hasPeekBufferAPI()); return _write_from_source(&stream); } - size_t write_P(PGM_P buf, size_t size) - { - if (!_pcb) { - return 0; - } - StreamConstPtr ptr(buf, size); - return _write_from_source(&ptr); - } - void keepAlive (uint16_t idle_sec = TCP_DEFAULT_KEEPALIVE_IDLE_SEC, uint16_t intv_sec = TCP_DEFAULT_KEEPALIVE_INTERVAL_SEC, uint8_t count = TCP_DEFAULT_KEEPALIVE_COUNT) { if (idle_sec && intv_sec && count) { @@ -504,7 +488,6 @@ class ClientContext // Give scheduled functions a chance to run (e.g. Ethernet uses recurrent) delay(1); // will resume on timeout or when _write_some_from_cb or _notify_error fires - } _send_waiting = false; } while(true); From e429938f8a82d07bd06433b96ab85504fd3b823e Mon Sep 17 00:00:00 2001 From: david gauchard Date: Wed, 31 Mar 2021 01:42:40 +0200 Subject: [PATCH 2/2] fix emulation on host --- libraries/ESP8266WiFi/src/WiFiClient.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/ESP8266WiFi/src/WiFiClient.cpp b/libraries/ESP8266WiFi/src/WiFiClient.cpp index 7686869b0b..78df4bf85d 100644 --- a/libraries/ESP8266WiFi/src/WiFiClient.cpp +++ b/libraries/ESP8266WiFi/src/WiFiClient.cpp @@ -40,6 +40,7 @@ extern "C" #include "lwip/netif.h" #include #include "c_types.h" +#include uint16_t WiFiClient::_localPort = 0;