From 29df67be24586ee28c789ea08d674f46039b1673 Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Tue, 11 Jun 2024 14:35:17 +0300 Subject: [PATCH 1/4] fix(client): Implement readBytes in NetworkClient for faster downloads --- libraries/Network/src/NetworkClient.cpp | 8 ++++++++ libraries/Network/src/NetworkClient.h | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/libraries/Network/src/NetworkClient.cpp b/libraries/Network/src/NetworkClient.cpp index 7e59d2aa3f3..7b9935c1cd8 100644 --- a/libraries/Network/src/NetworkClient.cpp +++ b/libraries/Network/src/NetworkClient.cpp @@ -479,6 +479,14 @@ int NetworkClient::read(uint8_t *buf, size_t size) { return res; } +size_t NetworkClient::readBytes(char *buffer, size_t length) { + int r = read((uint8_t*)buffer, length); + if (r < 0) { + return 0; + } + return (size_t)r; +} + int NetworkClient::peek() { int res = -1; if (fd() >= 0 && _rxBuffer) { diff --git a/libraries/Network/src/NetworkClient.h b/libraries/Network/src/NetworkClient.h index cb92a805900..572292a7a99 100644 --- a/libraries/Network/src/NetworkClient.h +++ b/libraries/Network/src/NetworkClient.h @@ -60,6 +60,10 @@ class NetworkClient : public ESPLwIPClient { int available(); int read(); int read(uint8_t *buf, size_t size); + size_t readBytes(char *buffer, size_t length); + size_t readBytes(uint8_t *buffer, size_t length) { + return readBytes((char *)buffer, length); + } int peek(); void clear(); // clear rx void stop(); From 2a5a7c5810f44faaf03d50bfcc5525bb591c7688 Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Wed, 12 Jun 2024 10:25:30 +0300 Subject: [PATCH 2/4] fix(client): Implement readBytes to obey the client timeout --- libraries/Network/src/NetworkClient.cpp | 28 +++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/libraries/Network/src/NetworkClient.cpp b/libraries/Network/src/NetworkClient.cpp index 7b9935c1cd8..4cd7b47fd00 100644 --- a/libraries/Network/src/NetworkClient.cpp +++ b/libraries/Network/src/NetworkClient.cpp @@ -480,11 +480,31 @@ int NetworkClient::read(uint8_t *buf, size_t size) { } size_t NetworkClient::readBytes(char *buffer, size_t length) { - int r = read((uint8_t*)buffer, length); - if (r < 0) { - return 0; + size_t left = length, sofar = 0; + int r = 0, to = millis() + _timeout; + while (left) { + r = read((uint8_t*)buffer+sofar, left); + if (r < 0) { + // Error has occurred + break; + } + if (r > 0) { + // We got some data + left -= r; + sofar += r; + to = millis() + _timeout; + } else { + // We got no data + if (millis() >= to) { + // We have waited for data enough + log_w("Timeout waiting for data on fd %d", fd()); + break; + } + // Allow other tasks to run + delay(2); + } } - return (size_t)r; + return sofar; } int NetworkClient::peek() { From 8c1804d0170413b2706e3feae5df8b4e60baface Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Wed, 12 Jun 2024 11:22:52 +0300 Subject: [PATCH 3/4] fix(clieant): use getTimeout() instead --- libraries/Network/src/NetworkClient.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/Network/src/NetworkClient.cpp b/libraries/Network/src/NetworkClient.cpp index 4cd7b47fd00..70342689757 100644 --- a/libraries/Network/src/NetworkClient.cpp +++ b/libraries/Network/src/NetworkClient.cpp @@ -481,7 +481,7 @@ int NetworkClient::read(uint8_t *buf, size_t size) { size_t NetworkClient::readBytes(char *buffer, size_t length) { size_t left = length, sofar = 0; - int r = 0, to = millis() + _timeout; + int r = 0, to = millis() + getTimeout(); while (left) { r = read((uint8_t*)buffer+sofar, left); if (r < 0) { @@ -492,7 +492,7 @@ size_t NetworkClient::readBytes(char *buffer, size_t length) { // We got some data left -= r; sofar += r; - to = millis() + _timeout; + to = millis() + getTimeout(); } else { // We got no data if (millis() >= to) { From 3eb2390dc18740bbe5b26d9886a08a6fb6d6b2df Mon Sep 17 00:00:00 2001 From: "pre-commit-ci-lite[bot]" <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Date: Thu, 13 Jun 2024 05:16:09 +0000 Subject: [PATCH 4/4] ci(pre-commit): Apply automatic fixes --- libraries/Network/src/NetworkClient.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/Network/src/NetworkClient.cpp b/libraries/Network/src/NetworkClient.cpp index 70342689757..1fe89da4492 100644 --- a/libraries/Network/src/NetworkClient.cpp +++ b/libraries/Network/src/NetworkClient.cpp @@ -483,7 +483,7 @@ size_t NetworkClient::readBytes(char *buffer, size_t length) { size_t left = length, sofar = 0; int r = 0, to = millis() + getTimeout(); while (left) { - r = read((uint8_t*)buffer+sofar, left); + r = read((uint8_t *)buffer + sofar, left); if (r < 0) { // Error has occurred break;