From bc79feb2175d29c12638fc7a9da835d99c1405e9 Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Thu, 13 Jun 2024 08:39:04 +0300 Subject: [PATCH] fix(client): Implement readBytes in NetworkClient for faster downloads (#9824) * fix(client): Implement readBytes in NetworkClient for faster downloads * fix(client): Implement readBytes to obey the client timeout * fix(clieant): use getTimeout() instead * ci(pre-commit): Apply automatic fixes --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- libraries/Network/src/NetworkClient.cpp | 28 +++++++++++++++++++++++++ libraries/Network/src/NetworkClient.h | 4 ++++ 2 files changed, 32 insertions(+) diff --git a/libraries/Network/src/NetworkClient.cpp b/libraries/Network/src/NetworkClient.cpp index 7e59d2aa3..1fe89da44 100644 --- a/libraries/Network/src/NetworkClient.cpp +++ b/libraries/Network/src/NetworkClient.cpp @@ -479,6 +479,34 @@ int NetworkClient::read(uint8_t *buf, size_t size) { return res; } +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); + if (r < 0) { + // Error has occurred + break; + } + if (r > 0) { + // We got some data + left -= r; + sofar += r; + to = millis() + getTimeout(); + } 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 sofar; +} + 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 cb92a8059..572292a7a 100644 --- a/libraries/Network/src/NetworkClient.h +++ b/libraries/Network/src/NetworkClient.h @@ -60,6 +60,10 @@ public: 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();