multiple pages requesting parallel -> Browser in load loop
Hi, i simplified my script as much as possible to show the problem ;) The ESPAsyncServer has problems to deliver multiple requests in parallel. Sometimes the ESP8266 chrashes with a OOM error (Unhandled C++ exception: OOM), sometimes not.
In my example below, the Browser requests all 5 pages (root page, css, javascript, JSParam ans JSAjax), can load 3 pages and the other 2 hangs in load loop. In my testcase the dynamic pages are very small ( approx 500byte) and css, javascript, JSParam are PROGMEM variables from 1000 - 12000bytes.
If i reduce progmem variables and rootpage to very very small amount of data, the chance increases that the ESP delivers all pages correctly. I´m able to load each page per single request correctly without any problems, the biggest javascript.js file with 12.000 bytes too. :) But all pages in parallel not.
I´m lost and i dont know what i can do. Switch to ESP32 with more RAM? But only because the webservice?
server->on("/style.css", HTTP_GET, std::bind(&MyWebServer::handleCSS, this, std::placeholders::_1));
server->on("/javascript.js", HTTP_GET, std::bind(&MyWebServer::handleJS, this, std::placeholders::_1));
server->on("/jsajax.js", HTTP_GET, std::bind(&MyWebServer::handleJsAjax, this, std::placeholders::_1));
server->on("/parameter.js", HTTP_GET, std::bind(&MyWebServer::handleJSParam, this, std::placeholders::_1));
AsyncResponseStream *response = request->beginResponseStream("text/html");
response->addHeader("Server","ESP Async Web Server");
response->printf("<!DOCTYPE html><html><head><meta name='viewport' content='width=device-width, initial-scale=1.0'/>\n");
response->printf("<meta charset='utf-8'>\n");
response->printf("<link rel='stylesheet' type='text/css' href='/style.css'>\n");
response->printf("<script language='javascript' type='text/javascript' src='/parameter.js'></script>\n");
response->printf("<script language='javascript' type='text/javascript' src='/javascript.js'></script>\n");
response->printf("<script language='javascript' type='text/javascript' src='/jsajax.js'></script>\n");
response->printf("<title>Bewässerungssteuerung</title></head>\n");
response->printf("<body>\n");
request->send(response);
}
void MyWebServer::handleCSS(AsyncWebServerRequest *request) {
AsyncWebServerResponse *response = request->beginResponse_P(200, "text/css", STYLE_CSS);
response->addHeader("Server","ESP Async Web Server");
request->send(response);
}
void MyWebServer::handleJS(AsyncWebServerRequest *request) {
AsyncWebServerResponse *response = request->beginResponse_P(200, "text/javascript", JAVASCRIPT);
response->addHeader("Server","ESP Async Web Server");
request->send(response);
}
void MyWebServer::handleJsAjax(AsyncWebServerRequest *request) {
AsyncWebServerResponse *response = request->beginResponse_P(200, "text/javascript", JSAJAX);
response->addHeader("Server","ESP Async Web Server");
request->send(response);
}
void MyWebServer::handleJSParam(AsyncWebServerRequest *request) {
AsyncResponseStream *response = request->beginResponseStream("text/javascript");
response->addHeader("Server","ESP Async Web Server");
response->println("Print whatever as javascript 1");
response->println("Print whatever as javascript 2");
request->send(response);
}
I guess related issue #1330 . You should check if you run out of heap. You could also implement those changes here #1116 to improve stability. Another way to save some memory is to send larger files ie your js stuff as a .gz file.