From 95e9f9a75140fdbf18df8b473c7e1423d4c8526d Mon Sep 17 00:00:00 2001 From: Alex Hope-O'Connor Date: Wed, 6 May 2026 00:44:56 +1000 Subject: [PATCH] Stream portal templates via TemplateEngineAsyncWeb chunked wrapper Use the DFTE async integration helper so portal HTML chunk callbacks handle zero-length buffers and no-progress retries without terminating transfers early on constrained hosts. --- lib/WiFiManager/src/WiFiManagerHandlers.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/lib/WiFiManager/src/WiFiManagerHandlers.cpp b/lib/WiFiManager/src/WiFiManagerHandlers.cpp index c5c4346..8488ac4 100644 --- a/lib/WiFiManager/src/WiFiManagerHandlers.cpp +++ b/lib/WiFiManager/src/WiFiManagerHandlers.cpp @@ -12,6 +12,7 @@ #include "templates/RootShell.h" #include "templates/PortalAppJS.h" #include +#include #include #if defined(ESP8266) || defined(ESP32) @@ -95,9 +96,16 @@ AsyncWebServerResponse* beginTemplateResponse(AsyncWebServerRequest* request, const char* templateData) { bundle->context.setRegistry(&bundle->registry); TemplateRenderer::initializeContext(bundle->context, templateData); - return request->beginChunkedResponse(String(FPSTR(HTTP_HEAD_CT)), - [bundle](uint8_t *buffer, size_t maxLen, size_t /*index*/) -> size_t { - return TemplateRenderer::renderNextChunk(bundle->context, buffer, maxLen); + return TemplateEngineAsyncWeb::beginSafeChunkedResponse( + request, + String(FPSTR(HTTP_HEAD_CT)), + bundle, + [](BundleT& responseBundle, uint8_t *buffer, size_t maxLen, size_t /*index*/) -> size_t { + return TemplateEngineAsyncWeb::renderTemplateChunkWithRetries( + responseBundle.context, buffer, maxLen, 128); + }, + [](const BundleT& responseBundle) -> bool { + return TemplateEngineAsyncWeb::isTemplateTerminal(responseBundle.context); } ); }