From 436b1ef7e0ffb3fb22635be266a391d8d65cb187 Mon Sep 17 00:00:00 2001
From: Mathieu Carbou <mathieu.carbou@gmail.com>
Date: Tue, 8 Apr 2025 15:49:24 +0200
Subject: [PATCH] fix(core): Improve StreamString::readBytes() speed with large
 buffers

---
 cores/esp32/StreamString.cpp | 20 ++++++++++++++++++++
 cores/esp32/StreamString.h   |  1 +
 2 files changed, 21 insertions(+)

diff --git a/cores/esp32/StreamString.cpp b/cores/esp32/StreamString.cpp
index d0117c399eb..6418044f8a4 100644
--- a/cores/esp32/StreamString.cpp
+++ b/cores/esp32/StreamString.cpp
@@ -53,6 +53,26 @@ int StreamString::read() {
   return -1;
 }
 
+size_t StreamString::readBytes(char *buffer, size_t buffLen) {
+  if (!buffLen || !buffer) {
+    return 0;
+  }
+  const uint32_t start = millis();
+  size_t count = 0;
+  do {
+    if (this->length()) {
+      const size_t available = min(buffLen - count, (size_t)this->length());
+      memcpy(buffer + count, c_str(), available);
+      remove(0, available);
+      count += available;
+    }
+    if (count == buffLen || _timeout == 0) {
+      return count;
+    }
+  } while (millis() - start < _timeout);
+  return count;
+}
+
 int StreamString::peek() {
   if (length()) {
     char c = charAt(0);
diff --git a/cores/esp32/StreamString.h b/cores/esp32/StreamString.h
index b4f20147277..036878852f0 100644
--- a/cores/esp32/StreamString.h
+++ b/cores/esp32/StreamString.h
@@ -31,6 +31,7 @@ class StreamString : public Stream, public String {
 
   int available() override;
   int read() override;
+  size_t readBytes(char *buffer, size_t count) override;
   int peek() override;
   void flush() override;
 };