Where communities thrive

  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
Repo info
  • Jan 20 15:20
    zekageri commented #1110
  • Jan 19 22:18
    pedros89 commented #1022
  • Jan 19 12:36
    stale[bot] unlabeled #1022
  • Jan 19 12:36
    stale[bot] commented #1022
  • Jan 19 12:35
    perotom commented #1022
  • Jan 18 21:04
    udiFi commented #975
  • Jan 18 14:22
    jmattioni opened #1112
  • Jan 18 11:22
    openedhardware commented #435
  • Jan 17 19:52
    alixti commented #1087
  • Jan 16 18:07
    marcpascualsanchez edited #1111
  • Jan 16 18:03
    marcpascualsanchez edited #1111
  • Jan 16 17:52
    marcpascualsanchez edited #1111
  • Jan 15 21:32
    marcpascualsanchez opened #1111
  • Jan 13 14:21
    PabloASua opened #1110
  • Jan 13 14:04
    weoiss1998 commented #1085
  • Jan 13 13:22
    stale[bot] unlabeled #979
  • Jan 13 13:22
    stale[bot] commented #979
  • Jan 13 13:22
    MoJo2600 commented #979
  • Jan 13 11:10
    videojedi commented #936
  • Jan 13 11:08
    videojedi commented #936
im activated external interrupt and cant connect wifi
how to fix that
how do use rtos on async web server
Ramses Garcia Dilone
hello world
i tried use this lib with w5500
is possible?

Using AsyncWebServer on ESP32 I'm getting frequent Guru Meditation Errors:
Core 1 panic'ed (LoadProhibited). Exception was unhandled.
Core 1 register dump:
PC : 0x400d7e7c PS : 0x00060430 A0 : 0x800d7f1a A1 : 0x3ffb1f00
A2 : 0x3ffd31bc A3 : 0x3ffd2f84 A4 : 0x00000026 A5 : 0x3ffd2caa
A6 : 0x00000a0d A7 : 0x3a617461 A8 : 0x800d7e88 A9 : 0x3ffb1ee0
A10 : 0xe0088080 A11 : 0x00000026 A12 : 0x00000026 A13 : 0x00000026
A14 : 0x00000000 A15 : 0x00000000 SAR : 0x0000000a EXCCAUSE: 0x0000001c
EXCVADDR: 0xe0088088 LBEG : 0x4000c2e0 LEND : 0x4000c2f6 LCOUNT : 0xffffffff

ELF file SHA256: 0000000000000000

Backtrace: 0x400d7e7c:0x3ffb1f00 0x400d7f17:0x3ffb1f20 0x400d7f37:0x3ffb1f40 0x400d7f8d:0x3ffb1f60 0x400d17d3:0x3ffb1f90 0x400df329:0x3ffb1fb0 0x40089afa:0x3ffb1fd0

the backtrace shows
Decoding 7 results
0x400d7e7c: AsyncEventSourceClient::_runQueue() at c:\arduinoideportable\portable\packages\esp32\tools\xtensa-esp32-elf-gcc\1.22.0-97-gc752ad5-5.2.0\xtensa-esp32-elf\include\c++\5.2.0/functional line 1858
0x400d7f17: AsyncEventSourceClient::_queueMessage(AsyncEventSourceMessage) at c:\arduinoideportable\portable\packages\esp32\tools\xtensa-esp32-elf-gcc\1.22.0-97-gc752ad5-5.2.0\xtensa-esp32-elf\include\c++\5.2.0/functional line 1858
0x400d7f37: AsyncEventSourceClient::write(char const
, unsigned int) at c:\arduinoideportable\portable\packages\esp32\tools\xtensa-esp32-elf-gcc\1.22.0-97-gc752ad5-5.2.0\xtensa-esp32-elf\include\c++\5.2.0/functional line 1858
0x400d7f8d: AsyncEventSource::send(char const, char const, unsigned int, unsigned int) at c:\arduinoideportable\portable\packages\esp32\tools\xtensa-esp32-elf-gcc\1.22.0-97-gc752ad5-5.2.0\xtensa-esp32-elf\include\c++\5.2.0/functional line 1858
0x400d17d3: loop() at C:\ArduinoIDEPortable\portable\sketchbook\ESP32\SolarLoggerJune12/SolarLoggerJune12.ino line 151
0x400df329: loopTask(void*) at C:\ArduinoIDEPortable\portable\packages\esp32\hardware\esp32\1.0.6\cores\esp32/main.cpp line 23
0x40089afa: vPortTaskWrapper at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/freertos/port.c line 355 (discriminator 1)

referring to this line in my code

151: events.send( mycWatts , "cwatts", millis());

It doesntt happen every time but its realy giving me a headache. Any ideas?

Rolf Wedermann
Hello everyone, will the ESP Async web server be further developed or is the project idle?
Seems idle
Tom Sciano
how can I send a fetch/post request to itself using javascript
i keep getting a cors error
` const button = document.getElementById("post-btn");
    button.addEventListener("click", async(_) => {
        try {
            const response = await fetch("board", {
                method: "post",
                body: {
            console.log("Completed!", response);
        } catch (err) {
            console.error(`Error: ${err}`);
    }); `
Tom Sciano
+and this is how my post starts
AsyncCallbackJsonWebHandler *handler = new AsyncCallbackJsonWebHandler("/board", [](AsyncWebServerRequest *request, JsonVariant &json) {
also tried with adding this before server begin
DefaultHeaders::Instance().addHeader("Access-Control-Allow-Origin", "*"); DefaultHeaders::Instance().addHeader("Access-Control-Allow-Headers", "Content-Type");
Re my message above I have found that my code is much more stable - ie less frequent guru errors - with a delay between events.send calls.
I've implemented this with a state machine and have not had a guru error in 24 hours continuous running (but there is time yet!)

I'm trying to let ESPAsynchWebServer on an ESP32 serve all JPG-Images in SPIFFS as follows:

server->on("^(([/|.|\w|\s])*)\.jpg$", HTTP_GET, [] (AsyncWebServerRequest *request) { String name = request->pathArg(0) + ".jpg"; request->send(SPIFFS, name, "image/jpg"); });

Unfortunatel, it never serves the images.

I added compiler.cpp.extra_flags=-DDASYNCWEBSERVER_REGEX to platforms.local.txt
The files are called like «aed3.jpg» oder «bcd.jpg».
If anyone sees how I sould change the regex to mach my needs, please help me.

Thank you very much, Dani

@ld21 Have you tried the server.serveStatic setup? I have used that for some time now and find it the best way to serve files. You should be able to just serve the files from a specific directory (I have not tried, I always use the root directory), and you could put your .jpg in there. See here for an example usage in one of my projects: https://github.com/sillyfrog/PrettyLights2/blob/bbed6c986609ad2b17e7be4eaa7f512c87c81b75/src/main.cpp#L839 (this code allows you to change between LittleFS and SPIFFS - now SPIFFS is EOL I would suggest moving to LittleFS for a new project).
@sillyfrog Great ideas, thanks a lot – I think they will solve my problems in a very elegant way. And thanks for pointing out LittleFS, I havent's heard of it so far and it really seems to be the future of ESP32-FSs.
Ora Prints
Ora prints is one of the best printing and packaging platforms where different kinds of Gift boxes and depictions are made. https://oraprints.com/


I am running the interface on the local server using the asyncy web server library. no problem here

but 2 or more esp32s are connecting to each other, the server esp32 needs to send data to the client esp32, for this they need to send data between themselves via http post. How can I do this?

Baba Boota
Baba boota is best online shopping website in Pakistan, where you get all of your daily need products with one click. We provide you with all the things at a reasonable price and good quality, so sit back and order your stuff from Baba Boota.com https://bababoota.com
Pavel Baranov
guys, does anyone tried to use ESP32 miniz lib to compress files on sd card?
maybe someone can provide a simple working example?
Sloata George

Are there any examples of dynamic web pages using ESPAsyncWebServer ?
I would like to GET and POST data without having to reload the page every time.

Right now each request ends with redirect which reloads the page:

  server.on("/settings", HTTP_POST, [](AsyncWebServerRequest *request)
              if (request->hasArg("save_output"))
                // do something with the received data

But request->redirect("/settings"); reloads the page.
Can I change this behavior ?

Hi I am new to programing and Arduino can you please anyone help me out I'm stuck on this error code :
C:\Users----\Documents\Arduino\libraries\ESPAsyncTCP-master\src\SyncClient.cpp:25:24: fatal error: interrupts.h: No such file or directory
compilation terminated.
exit status 1
Error compiling for board ESP32 Dev Module.
This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.
I downloaded * ArduinoJson (Request Pool Version 2.6)
What did I not include or configure?
I'm using a ESP32s wroom board 38pin. Sorry if I seem to be spamming I'm just trying to include the information needed to complete compilation and understand the libraries for the sketch to verify so I can then upload.
Mick Percy

@GeorgeFlorian you need to exchange data between server and client using websockets. This means you need to create your own protocols for exchanging data and updating the DOM.

I'm currently doing this on a project that I am working on... https://github.com/DeeEmm/DIY-Flow-Bench/tree/ESP32

The way that I have done this is that both the browser and ESP32 have websocket listen events. I'm exchanging JSON data and adding a header value to each JSON object before transmission. The header acts as a simple protocol to let the receiving side know what to do. When websocket data is received the JSON 'header' value is decoded and the relevant action taken. Some transmissions only have a header value, others have the header value with additional data. This data exchange is both bidirectional and asynchronous so falls outside of the main loop.

On the browser side you can update the DOM using simple document.getElementById statements

Check out the index.html / javascript.js files for the client implementation and the Webserver::ProcessWebSocketMessage method in Webserver.cpp for the ESP side.

For an example of the JSON data I am using take a look in data/config.json

Using JSON makes the data exchange nice and easy on both sides as there are already tools available for both the browser (native javascript) and ESP32 (ArduinoJson library) to manage JSON data objects. It also makes storing configuration data in SPIFFS nice and easy too.

There is one caveat to this - file uploads - Traditionally they are handled via POST vars and require a navigation event (file / form submit) to transmit them. HTML5 does have a transport method that does not require this but I have not played with it (yet) so cannot comment. However it appears that this method is not backwards compatible in older browsers.


Mick Percy
@GeorgeFlorian In your example you show 'settings'. The way that I have dealt with this is to use a modal dialog that is hidden. This is unhidden using simple javascript trigger by a user on-click event. In fact there are several such dialogs / tabs that are all within the one index.html page and are hidden / unhidden accordingly. This gives the impression of navigation without any form of redirect or page reload.
Apoorva Singh
Hello everyone,
Is there any example that shows how to setup a loopback connection to a server built using ESPAsyncWebServer.
I tried using the IP address of the device using the ESP8266's WiFiClient library. But for some reason it's unable to connect to the server.
My goal is to run a server as well as have a client connection on the same ESP8266 that forwards HTTP requests from a different source to ESPAsyncWebServer. If you guys can point me towards some resources, it would be very helpful. Thank you!
Sloata George


I encountered this project: https://github.com/DroneBridge/ESP32 and I saw that the web-page works flawlessly and the information on page change without refreshing the page even on submit.

I am using this web-server for my projects and each time I submit data (POST) to the server I redirect to the same page, meaning that I reload the page.

This is a GET handler:

    server.on("/home", HTTP_GET, [](AsyncWebServerRequest *request)
              { request->send(SPIFFS, "/index.html", "text/html", false, processor); });

This is a POST handler:

  server.on("/home", HTTP_POST, [](AsyncWebServerRequest *request)
              if (request->hasArg("send_data_when_submit_btn_pressed"))
                int params = request->params();
                for (int i = 0; i < params - 1; i++)
                  AsyncWebParameter *p = request->getParam(i);
                  if (p->isPost() && p->value().length() > 0 && p->value() != "#000000")
                    if (p->name() == "brightness")
                      Brightness = p->value();
              else if (request->hasArg("toggle_btn"))
                outputFlag = !outputFlag;
                String str = outputFlag ? "On" : "Off";
            }); // server.on("/home", HTTP_POST, [](AsyncWebServerRequest * request)

As you can see, for each action I am required to use request->redirect("/home"); which reloads the page when redirecting.

Also, I am currently using AJAX calls to refresh or change data on the page without reloading the page:

var text_box = document.querySelector('.text_box');

if (text_box != null || rs1 != null || rs2 != null) {
    function refresh() {
        setTimeout(function () {
            if ($('.text_box').length) $('.text_box').load('events_placeholder.html');
        }, 1000);

    $(document).ready(function () {
        if ($('.text_box').length) $('.text_box').load('events_placeholder.html');

This makes a call to the events_placeholder.html each second and it seems resource consuming.
Is there a better way of doing this ?

Is it possible to implement a framework like VueJS for example on this web-server ?

Louis Lewis

Hi everyone,

I have looked at the documentation regarding handling post requests, but I cannot seem to find the answers I am looking for.
I am porting some code which was using the plain WebServer implementation. With that implementation I have multiple post requests being used like this

this->webServer->on("/api/configuration/wifi", HTTP_POST, [this]()
    String data = this->webServer->arg("plain");

    DynamicJsonDocument doc(500);
    DeserializationError error = deserializeJson(doc, data);

        // rest of code omitted.......

this->webServer->on("/api/configuration/timer", HTTP_POST, [this]()
    String data = this->webServer->arg("plain");

    DynamicJsonDocument doc(500);
    DeserializationError error = deserializeJson(doc, data);

        // rest of code omitted.......

I was reading about the onRequestBody method, which I tried using.

this->webServer.onRequestBody([this](AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total)
  if (request->url() == "/api/configuration/wifi")
      this->HandleWifiConfig(request, data);

With the above, In the HandleWifiConfig method does indeed get called, it does return a response, using

 request->send(200, "application/json", "testing");

However the onNotFound handler still gets called.

Am I still meant to register a handler using "webServer.on(......"?
If so, what would the signature look like?

On the client side, I am doing a normal http post request, with the body being set to json.
I am not too keen on using the Json handler as documented, I would rather stick to my manual parsing for the moment, its been working for a year.


Louis Lewis
Louis Lewis

Good evening,

I ran into an issue, hopefully someone can assist.
I have two endpoints

    this->webServer.on("/api/configuration/wifi", HTTP_GET, [this](AsyncWebServerRequest *request)
                           AsyncWebServerResponse *response = request->beginResponse(200, "application/json", wifiManager.GetConfigurationAsString());
                           response->addHeader("Access-Control-Allow-Origin", "*");


    this->webServer.on("/api/configuration/wifi/status", HTTP_GET, [this](AsyncWebServerRequest *request)
                           WiFiStatus wifiStatus = wifiManager.GetStatus();

                           AsyncWebServerResponse *response = request->beginResponse(200, "application/json", wifiStatus.ToString());
                           response->addHeader("Access-Control-Allow-Origin", "*");


I am calling this endpoint
Which should map to the second endpoint above, however it is the first one that gets executed.

Am I doing something wrong?

Mike Dunston
swap the order of them
put the /api/configuration/wifi/status one first
Louis Lewis
Awesome, thanks once again Mike.
Worked like a charm
Mike Dunston
Brad Nelson
What is the easiest way to determine if a client has connected to Espasyncwebserver?
Sloata George

How can I serve the css and js files without an actual path ? Let's say we have the following handler:

  server.on("/script.js", HTTP_GET, [](AsyncWebServerRequest *request)
              AsyncWebServerResponse *response = request->beginResponse(SPIFFS, "/script.js.gz", "text/javascript");
              response->addHeader("Content-Encoding", "gzip");

If the user goes to /script.js he will have access to the file and this seems like a security issue.

1 reply
vijay seshu ravankol

I am using ESPAsyncWebServer for a server application. Will receive WiFi credentials Through POST request. Now I want to send response to client only after WiFi is connected. if i try to connect to wifi within



Im getting WGT error if credentials are wrong. How can i use request->send out of this block? or any other suggestions?
Thanks in advance.

Hi Everyone, I'm trying to figure out when to use AsyncWebServerRequest->send vs. when to use AsyncWebServerRequest->send_P . What's the difference between the two? I just want to serve simple HTML.
2 replies
Tomas Hübner
Hey everyone, I'm woking on a clock using pinball score reels based on an ESP32, and I'm storing some data in an I2C eeprom that happened to be on the same module as the DS1307 used to keep time when power is off.
I've added a page with a simple form to change the config. I did have major issues writing data to the eeprom in a callback from the ESPAsyncWebServer - as it turned out there were some yield()s in the lib I use for eeprom access. At least I think that was what caused the problems.
However, being well aware that assumption is the mother of all fuckups, I just wanted to check if anyone knows if there is anything in ESPAsyncWebServer that actually would interfere with the TwoWire implementation?
2 replies

hi everyone, i have random wdt.
E (285848) task_wdt: Task watchdog got triggered. The following tasks did not reset the watchdog in time:
E (285848) task_wdt: - IDLE0 (CPU 0)
E (285848) task_wdt: Tasks currently running:
E (285848) task_wdt: CPU 0: Task0
E (285848) task_wdt: CPU 1: IDLE1
E (285848) task_wdt: Aborting.
abort() was called at PC 0x40174258 on core 0

ELF file SHA256: 0000000000000000

Backtrace: 0x400887e8:0x3ffbfa70 0x40088a65:0x3ffbfa90 0x40174258:0x3ffbfab0 0x40086f25:0x3ffbfad0 0x4000bfed:0x3ffdb970 0x4008abe9:0x3ffdb980 0x400894e1:0x3ffdb9a0 0x40166866:0x3ffdb9e0 0x4015633c:0x3ffdba00 0x400d8981:0x3ffdba20 0x400d89e6:0x3ffdba50 0x400d8a55:0x3ffdba70 0x400d8e96:0x3ffdba90 0x4018afb6:0x3ffdbac0 0x400ea915:0x3ffdbaf0 0x400ea9ad:0x3ffdbb10 0x400de266:0x3ffdbb30 0x400dc9e9:0x3ffdbcf0 0x400d82e2:0x3ffdbd40 0x400d3b00:0x3ffdbd60 0x40089a76:0x3ffdbd80

ets Jun 8 2016 00:22:57

rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
mode:DIO, clock div:2
2021-10-26 12:15:37.713
entry 0x400806a8

Decoding stack results
0x400887e8: invoke_abort at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/esp32/panic.c line 156
0x40088a65: abort at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/esp32/panic.c line 171
0x40174258: task_wdt_isr at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/esp32/task_wdt.c line 174
0x4008abe9: vTaskExitCritical at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/freertos/tasks.c line 4274
0x400894e1: xQueueGenericSend at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/freertos/queue.c line 828
0x40166866: sys_mutex_unlock at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/lwip/port/esp32/freertos/sys_arch.c line 93
0x4015633c: lwip_ioctl_r at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/lwip/lwip/src/api/sockets.c line 3489
0x400d8981: WiFiClientRxBuffer::r_available() at C:.platformio\packages\framework-arduinoespressif32\libraries\WiFi\src\WiFiClient.cpp line 49
0x400d89e6: WiFiClientRxBuffer::fillBuffer() at C:.platformio\packages\framework-arduinoespressif32\libraries\WiFi\src\WiFiClient.cpp line 71
0x400d8a55: WiFiClientRxBuffer::read(unsigned char, unsigned int) at C:.platformio\packages\framework-arduinoespressif32\libraries\WiFi\src\WiFiClient.cpp line 107
0x400d8e96: WiFiClient::read(unsigned char
, unsigned int) at C:.platformio\packages\framework-arduinoespressif32\libraries\WiFi\src\WiFiClient.cpp line 437
0x4018afb6: WiFiClient::read() at C:.platformio\packages\framework-arduinoespressif32\libraries\WiFi\src\WiFiClient.cpp line 345
0x400ea915: Stream::timedRead() at C:.platformio\packages\framework-arduinoespressif32\cores\esp32\Stream.cpp line 36
0x400ea9ad: Stream::readStringUntil(char) at C:.platformio\packages\framework-arduinoespressif32\cores\esp32\Stream.cpp line 330
0x400de266: WebServer::_parseRequest(WiFiClient&) at C:.platformio\packages\framework-arduinoespressif32\libraries\WebServer\src\Parsing.cpp line 78
0x400dc9e9: WebServer::handleClient() at C:.platformio\packages\framework-arduinoespressif32\libraries\WebServer\src\WebServer.cpp line 310
0x400d82e2: webserver_loop() at src\webserver_pro.cpp line 312
0x400d3b00: Task0code(void*) at src\main.cpp line 41
0x40089a76: vPortTaskWrapper at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/freertos/port.c line 143

but don't know how to fix.

it happens randomly. 1 day or several days.
Hi all. I am reading an value continously in my code and writing it in a global varibal. in my server.on callback i am reading this value and returning it to the clients browser. for sure its crashing when i write it the same time.
Q1: how is the best way to avoid this (i am using a locked-variable at the moment).
Q2: since its async somehow, is there task scheduling and running on different cores@esp32 involved? Best way to exchange "data"/share aviables between "global code" and webserver(callbacks?
Hope im not mixing things too much - and sri for some rookie questening stuff :) Tnx for your support. M.
GitHub King

Can it handle multipart form? I browsed the readme, but the only thing I could find was multipart() that returns true/false. I want to know whether it can read values from a multipart POST. I confirmed that my POST code works correctly by posting it to https://httpbin.org/post; it returned

    "args": {}, 
    "data": "", 
    "files": {}, 
    "form": {
        "cat": "\u0001\u0002\u0000\u0003\u0004", 
        "dog": "hello"
    "headers": {
        "Content-Length": "265", 
        "Content-Type": "multipart/form-data; boundary=\"8a9f2dc0-11a8-451a-9d5e-376624de7af7\"", 
        "Host": "httpbin.org",  .....

So, I want to get that "dog" and "cat" in my ESP. But when I listed all arguments using the readme code:

          //List all parameters (Compatibility)
          int args = request->args();
          for (int i = 0; i < args; i++)
            Serial.printf("ARG[%s]: %s\n", request->argName(i).c_str(), request->arg(i).c_str());

what I got was:

    ARG[a]: ␁␂

So, how can I get the string "hello" for the "dog" argument, and { 0x01, 0x02, 0x00, 0x03, 0x04 } for the "cat" argument? Is it supported? Any example?

5 replies
Also, it does not seem a good idea to use this chat site where everyone's posts are mixed together for "help and support" for the library. Github provides "Discussions" (for example: https://github.com/zadam/trilium/discussions ) which is a LOT better for this purpose, in my opinion. Why not use that instead?