summaryrefslogtreecommitdiff
path: root/libraries/ESP_Async_WebServer/examples/SlowChunkResponse
diff options
context:
space:
mode:
authorschererleander <leander@schererleander.de>2026-01-20 08:34:54 +0100
committerschererleander <leander@schererleander.de>2026-01-20 08:34:54 +0100
commit85ea4e995a75abe061f6fc375ea0481084dddd43 (patch)
tree7eb5d57653ecd8f041aeac4e68d7d554c1168681 /libraries/ESP_Async_WebServer/examples/SlowChunkResponse
initial commitHEADmain
Diffstat (limited to 'libraries/ESP_Async_WebServer/examples/SlowChunkResponse')
-rw-r--r--libraries/ESP_Async_WebServer/examples/SlowChunkResponse/SlowChunkResponse.ino152
1 files changed, 152 insertions, 0 deletions
diff --git a/libraries/ESP_Async_WebServer/examples/SlowChunkResponse/SlowChunkResponse.ino b/libraries/ESP_Async_WebServer/examples/SlowChunkResponse/SlowChunkResponse.ino
new file mode 100644
index 0000000..bbf70b6
--- /dev/null
+++ b/libraries/ESP_Async_WebServer/examples/SlowChunkResponse/SlowChunkResponse.ino
@@ -0,0 +1,152 @@
+// SPDX-License-Identifier: LGPL-3.0-or-later
+// Copyright 2016-2025 Hristo Gochkov, Mathieu Carbou, Emil Muratov
+
+//
+// Simulate a slow response in a chunk response (like file download from SD Card)
+// poll events will be throttled.
+//
+
+#include <Arduino.h>
+#ifdef ESP32
+#include <AsyncTCP.h>
+#include <WiFi.h>
+#elif defined(ESP8266)
+#include <ESP8266WiFi.h>
+#include <ESPAsyncTCP.h>
+#elif defined(TARGET_RP2040) || defined(TARGET_RP2350) || defined(PICO_RP2040) || defined(PICO_RP2350)
+#include <RPAsyncTCP.h>
+#include <WiFi.h>
+#endif
+
+#include <ESPAsyncWebServer.h>
+
+static AsyncWebServer server(80);
+
+static const char *htmlContent PROGMEM = R"(
+<!DOCTYPE html>
+<html>
+<head>
+ <title>Sample HTML</title>
+</head>
+<body>
+ <h1>Hello, World!</h1>
+ <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod
+ rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper
+ arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit
+ accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi.
+ Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo
+ dapibus elit, id varius sem dui id lacus.</p>
+ <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod
+ rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper
+ arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit
+ accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi.
+ Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo
+ dapibus elit, id varius sem dui id lacus.</p>
+ <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod
+ rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper
+ arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit
+ accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi.
+ Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo
+ dapibus elit, id varius sem dui id lacus.</p>
+ <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod
+ rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper
+ arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit
+ accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi.
+ Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo
+ dapibus elit, id varius sem dui id lacus.</p>
+ <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod
+ rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper
+ arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit
+ accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi.
+ Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo
+ dapibus elit, id varius sem dui id lacus.</p>
+ <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod
+ rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper
+ arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit
+ accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi.
+ Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo
+ dapibus elit, id varius sem dui id lacus.</p>
+ <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod
+ rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper
+ arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit
+ accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi.
+ Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo
+ dapibus elit, id varius sem dui id lacus.</p>
+ <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod
+ rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper
+ arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit
+ accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi.
+ Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo
+ dapibus elit, id varius sem dui id lacus.</p>
+</body>
+</html>
+)";
+
+static const size_t htmlContentLength = strlen_P(htmlContent);
+static constexpr char characters[] = "0123456789ABCDEF";
+static size_t charactersIndex = 0;
+
+void setup() {
+ Serial.begin(115200);
+
+#ifndef CONFIG_IDF_TARGET_ESP32H2
+ WiFi.mode(WIFI_AP);
+ WiFi.softAP("esp-captive");
+#endif
+
+ // curl -v http://192.168.4.1/
+ server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) {
+ // need to cast to uint8_t*
+ // if you do not, the const char* will be copied in a temporary String buffer
+ request->send(200, "text/html", (uint8_t *)htmlContent, htmlContentLength);
+ });
+
+ // IMPORTANT - DO NOT WRITE SUCH CODE IN PRODUCTON !
+ //
+ // This example simulates the slowdown that can happen when:
+ // - downloading a huge file from sdcard
+ // - doing some file listing on SDCard because it is horribly slow to get a file listing with file stats on SDCard.
+ // So in both cases, ESP would deadlock or TWDT would trigger.
+ //
+ // This example simulats that by slowing down the chunk callback:
+ // - d=2000 is the delay in ms in the callback
+ // - l=10000 is the length of the response
+ //
+ // time curl -N -v -G -d 'd=2000' -d 'l=10000' http://192.168.4.1/slow.html --output -
+ //
+ server.on("/slow.html", HTTP_GET, [](AsyncWebServerRequest *request) {
+ uint32_t d = request->getParam("d")->value().toInt();
+ uint32_t l = request->getParam("l")->value().toInt();
+ Serial.printf("d = %" PRIu32 ", l = %" PRIu32 "\n", d, l);
+ AsyncWebServerResponse *response = request->beginChunkedResponse("text/html", [d, l](uint8_t *buffer, size_t maxLen, size_t index) -> size_t {
+ Serial.printf("%u\n", index);
+ // finished ?
+ if (index >= l) {
+ return 0;
+ }
+
+ // slow down the task to simulate some heavy processing, like SD card reading
+ delay(d);
+
+ memset(buffer, characters[charactersIndex], 256);
+ charactersIndex = (charactersIndex + 1) % sizeof(characters);
+ return 256;
+ });
+
+ request->send(response);
+ });
+
+ server.begin();
+}
+
+static uint32_t lastHeap = 0;
+
+void loop() {
+#ifdef ESP32
+ uint32_t now = millis();
+ if (now - lastHeap >= 2000) {
+ Serial.printf("Free heap: %" PRIu32 "\n", ESP.getFreeHeap());
+ lastHeap = now;
+ }
+#endif
+}