kopia lustrzana https://github.com/Aircoookie/WLED
Merge pull request #3828 from willmmiles/0_15-asyncwebserver-2.2.0-features
ESPAsyncWebServer 2.2.0 + featurespull/3810/head^2
commit
f1987b9544
|
@ -144,7 +144,7 @@ lib_deps =
|
|||
fastled/FastLED @ 3.6.0
|
||||
IRremoteESP8266 @ 2.8.2
|
||||
makuna/NeoPixelBus @ 2.7.5
|
||||
https://github.com/Aircoookie/ESPAsyncWebServer.git @ ^2.1.0
|
||||
https://github.com/Aircoookie/ESPAsyncWebServer.git @ ^2.2.0
|
||||
# for I2C interface
|
||||
;Wire
|
||||
# ESP-NOW library
|
||||
|
|
|
@ -434,7 +434,6 @@ void handleSerial();
|
|||
void updateBaudRate(uint32_t rate);
|
||||
|
||||
//wled_server.cpp
|
||||
String getFileContentType(String &filename);
|
||||
void createEditHandler(bool enable);
|
||||
void initServer();
|
||||
void serveMessage(AsyncWebServerRequest* request, uint16_t code, const String& headl, const String& subl="", byte optionT=255);
|
||||
|
|
|
@ -375,6 +375,7 @@ void updateFSInfo() {
|
|||
#endif
|
||||
}
|
||||
|
||||
|
||||
#if defined(BOARD_HAS_PSRAM) && defined(WLED_USE_PSRAM)
|
||||
// caching presets in PSRAM may prevent occasional flashes seen when HomeAssitant polls WLED
|
||||
// original idea by @akaricchi (https://github.com/Akaricchi)
|
||||
|
@ -420,26 +421,19 @@ bool handleFileRead(AsyncWebServerRequest* request, String path){
|
|||
DEBUG_PRINT(F("WS FileRead: ")); DEBUG_PRINTLN(path);
|
||||
if(path.endsWith("/")) path += "index.htm";
|
||||
if(path.indexOf(F("sec")) > -1) return false;
|
||||
String contentType = getFileContentType(path);
|
||||
if(request->hasArg(F("download"))) contentType = F("application/octet-stream");
|
||||
/*String pathWithGz = path + ".gz";
|
||||
if(WLED_FS.exists(pathWithGz)){
|
||||
request->send(WLED_FS, pathWithGz, contentType);
|
||||
return true;
|
||||
}*/
|
||||
#if defined(BOARD_HAS_PSRAM) && defined(WLED_USE_PSRAM)
|
||||
if (path.endsWith(FPSTR(getPresetsFileName()))) {
|
||||
size_t psize;
|
||||
const uint8_t *presets = getPresetCache(psize);
|
||||
if (presets) {
|
||||
AsyncWebServerResponse *response = request->beginResponse_P(200, contentType, presets, psize);
|
||||
AsyncWebServerResponse *response = request->beginResponse_P(200, FPSTR(CONTENT_TYPE_JSON), presets, psize);
|
||||
request->send(response);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if(WLED_FS.exists(path)) {
|
||||
request->send(WLED_FS, path, contentType);
|
||||
if(WLED_FS.exists(path) || WLED_FS.exists(path + ".gz")) {
|
||||
request->send(WLED_FS, path, String(), request->hasArg(F("download")));
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
|
|
@ -1063,7 +1063,7 @@ void serveJson(AsyncWebServerRequest* request)
|
|||
}
|
||||
#endif
|
||||
else if (url.indexOf("pal") > 0) {
|
||||
request->send_P(200, "application/json", JSON_palette_names); // contentType defined in AsyncJson-v6.h
|
||||
request->send_P(200, FPSTR(CONTENT_TYPE_JSON), JSON_palette_names);
|
||||
return;
|
||||
}
|
||||
else if (url.indexOf(F("cfg")) > 0 && handleFileRead(request, F("/cfg.json"))) {
|
||||
|
@ -1150,10 +1150,10 @@ bool serveLiveLeds(AsyncWebServerRequest* request, uint32_t wsClient)
|
|||
}
|
||||
#endif
|
||||
|
||||
char buffer[2048]; // shoud be enough for 256 LEDs [RRGGBB] + all other text (9+25)
|
||||
strcpy_P(buffer, PSTR("{\"leds\":["));
|
||||
obuf = buffer; // assign buffer for oappnd() functions
|
||||
olen = 9;
|
||||
DynamicBuffer buffer(9 + (9*(1+(used/n))) + 7 + 5 + 6 + 5 + 6 + 5 + 2);
|
||||
char* buf = buffer.data(); // assign buffer for oappnd() functions
|
||||
strncpy_P(buffer.data(), PSTR("{\"leds\":["), buffer.size());
|
||||
buf += 9; // sizeof(PSTR()) from last line
|
||||
|
||||
for (size_t i = 0; i < used; i += n)
|
||||
{
|
||||
|
@ -1168,29 +1168,27 @@ bool serveLiveLeds(AsyncWebServerRequest* request, uint32_t wsClient)
|
|||
r = scale8(qadd8(w, r), strip.getBrightness()); //R, add white channel to RGB channels as a simple RGBW -> RGB map
|
||||
g = scale8(qadd8(w, g), strip.getBrightness()); //G
|
||||
b = scale8(qadd8(w, b), strip.getBrightness()); //B
|
||||
olen += sprintf_P(obuf + olen, PSTR("\"%06X\","), RGBW32(r,g,b,0));
|
||||
buf += sprintf_P(buf, PSTR("\"%06X\","), RGBW32(r,g,b,0));
|
||||
}
|
||||
olen -= 1;
|
||||
oappend((const char*)F("],\"n\":"));
|
||||
oappendi(n);
|
||||
buf--; // remove last comma
|
||||
buf += sprintf_P(buf, PSTR("],\"n\":%d"), n);
|
||||
#ifndef WLED_DISABLE_2D
|
||||
if (strip.isMatrix) {
|
||||
oappend((const char*)F(",\"w\":"));
|
||||
oappendi(Segment::maxWidth/n);
|
||||
oappend((const char*)F(",\"h\":"));
|
||||
oappendi(Segment::maxHeight/n);
|
||||
buf += sprintf_P(buf, PSTR(",\"w\":%d"), Segment::maxWidth/n);
|
||||
buf += sprintf_P(buf, PSTR(",\"h\":%d"), Segment::maxHeight/n);
|
||||
}
|
||||
#endif
|
||||
oappend("}");
|
||||
(*buf++) = '}';
|
||||
(*buf++) = 0;
|
||||
|
||||
if (request) {
|
||||
request->send(200, "application/json", buffer); // contentType defined in AsyncJson-v6.h
|
||||
request->send(200, FPSTR(CONTENT_TYPE_JSON), toString(std::move(buffer)));
|
||||
}
|
||||
#ifdef WLED_ENABLE_WEBSOCKETS
|
||||
else {
|
||||
wsc->text(obuf, olen);
|
||||
wsc->text(toString(std::move(buffer)));
|
||||
}
|
||||
#endif
|
||||
obuf = nullptr;
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -21,8 +21,6 @@
|
|||
#define DYNAMIC_JSON_DOCUMENT_SIZE 16384
|
||||
#endif
|
||||
|
||||
constexpr const char* JSON_MIMETYPE = "application/json";
|
||||
|
||||
/*
|
||||
* Json Response
|
||||
* */
|
||||
|
@ -66,7 +64,7 @@ class AsyncJsonResponse: public AsyncAbstractResponse {
|
|||
|
||||
AsyncJsonResponse(JsonDocument *ref, bool isArray=false) : _jsonBuffer(1), _isValid{false} {
|
||||
_code = 200;
|
||||
_contentType = JSON_MIMETYPE;
|
||||
_contentType = FPSTR(CONTENT_TYPE_JSON);
|
||||
if(isArray)
|
||||
_root = ref->to<JsonArray>();
|
||||
else
|
||||
|
@ -75,7 +73,7 @@ class AsyncJsonResponse: public AsyncAbstractResponse {
|
|||
|
||||
AsyncJsonResponse(size_t maxJsonBufferSize = DYNAMIC_JSON_DOCUMENT_SIZE, bool isArray=false) : _jsonBuffer(maxJsonBufferSize), _isValid{false} {
|
||||
_code = 200;
|
||||
_contentType = JSON_MIMETYPE;
|
||||
_contentType = FPSTR(CONTENT_TYPE_JSON);
|
||||
if(isArray)
|
||||
_root = _jsonBuffer.createNestedArray();
|
||||
else
|
||||
|
|
|
@ -18,36 +18,6 @@ static const char s_unlock_ota [] PROGMEM = "Please unlock OTA in security setti
|
|||
static const char s_unlock_cfg [] PROGMEM = "Please unlock settings using PIN code!";
|
||||
static const char s_notimplemented[] PROGMEM = "Not implemented";
|
||||
static const char s_accessdenied[] PROGMEM = "Access Denied";
|
||||
static const char s_javascript[] PROGMEM = "application/javascript";
|
||||
static const char s_json[] = "application/json"; // AsyncJson-v6.h
|
||||
static const char s_html[] PROGMEM = "text/html";
|
||||
static const char s_plain[] = "text/plain"; // Espalexa.h
|
||||
static const char s_css[] PROGMEM = "text/css";
|
||||
static const char s_png[] PROGMEM = "image/png";
|
||||
static const char s_gif[] PROGMEM = "image/gif";
|
||||
static const char s_jpg[] PROGMEM = "image/jpeg";
|
||||
static const char s_ico[] PROGMEM = "image/x-icon";
|
||||
//static const char s_xml[] PROGMEM = "text/xml";
|
||||
//static const char s_pdf[] PROGMEM = "application/x-pdf";
|
||||
//static const char s_zip[] PROGMEM = "application/x-zip";
|
||||
//static const char s_gz[] PROGMEM = "application/x-gzip";
|
||||
|
||||
String getFileContentType(String &filename) {
|
||||
if (filename.endsWith(F(".htm"))) return FPSTR(s_html);
|
||||
else if (filename.endsWith(F(".html"))) return FPSTR(s_html);
|
||||
else if (filename.endsWith(F(".css"))) return FPSTR(s_css);
|
||||
else if (filename.endsWith(F(".js"))) return FPSTR(s_javascript);
|
||||
else if (filename.endsWith(F(".json"))) return s_json;
|
||||
else if (filename.endsWith(F(".png"))) return FPSTR(s_png);
|
||||
else if (filename.endsWith(F(".gif"))) return FPSTR(s_gif);
|
||||
else if (filename.endsWith(F(".jpg"))) return FPSTR(s_jpg);
|
||||
else if (filename.endsWith(F(".ico"))) return FPSTR(s_ico);
|
||||
// else if (filename.endsWith(F(".xml"))) return FPSTR(s_xml);
|
||||
// else if (filename.endsWith(F(".pdf"))) return FPSTR(s_pdf);
|
||||
// else if (filename.endsWith(F(".zip"))) return FPSTR(s_zip);
|
||||
// else if (filename.endsWith(F(".gz"))) return FPSTR(s_gz);
|
||||
return s_plain;
|
||||
}
|
||||
|
||||
//Is this an IP?
|
||||
static bool isIp(String str) {
|
||||
|
@ -183,7 +153,7 @@ static String msgProcessor(const String& var)
|
|||
|
||||
static void handleUpload(AsyncWebServerRequest *request, const String& filename, size_t index, uint8_t *data, size_t len, bool final) {
|
||||
if (!correctPIN) {
|
||||
if (final) request->send(401, FPSTR(s_plain), FPSTR(s_unlock_cfg));
|
||||
if (final) request->send(401, FPSTR(CONTENT_TYPE_PLAIN), FPSTR(s_unlock_cfg));
|
||||
return;
|
||||
}
|
||||
if (!index) {
|
||||
|
@ -204,10 +174,10 @@ static void handleUpload(AsyncWebServerRequest *request, const String& filename,
|
|||
request->_tempFile.close();
|
||||
if (filename.indexOf(F("cfg.json")) >= 0) { // check for filename with or without slash
|
||||
doReboot = true;
|
||||
request->send(200, FPSTR(s_plain), F("Configuration restore successful.\nRebooting..."));
|
||||
request->send(200, FPSTR(CONTENT_TYPE_PLAIN), F("Configuration restore successful.\nRebooting..."));
|
||||
} else {
|
||||
if (filename.indexOf(F("palette")) >= 0 && filename.indexOf(F(".json")) >= 0) strip.loadCustomPalettes();
|
||||
request->send(200, FPSTR(s_plain), F("File Uploaded!"));
|
||||
request->send(200, FPSTR(CONTENT_TYPE_PLAIN), F("File Uploaded!"));
|
||||
}
|
||||
cacheInvalidate++;
|
||||
}
|
||||
|
@ -259,24 +229,24 @@ void initServer()
|
|||
|
||||
#ifdef WLED_ENABLE_WEBSOCKETS
|
||||
#ifndef WLED_DISABLE_2D
|
||||
server.on(SET_F("/liveview2D"), HTTP_GET, [](AsyncWebServerRequest *request) {
|
||||
handleStaticContent(request, "", 200, FPSTR(s_html), PAGE_liveviewws2D, PAGE_liveviewws2D_length);
|
||||
server.on(F("/liveview2D"), HTTP_GET, [](AsyncWebServerRequest *request) {
|
||||
handleStaticContent(request, "", 200, FPSTR(CONTENT_TYPE_HTML), PAGE_liveviewws2D, PAGE_liveviewws2D_length);
|
||||
});
|
||||
#endif
|
||||
#endif
|
||||
server.on(SET_F("/liveview"), HTTP_GET, [](AsyncWebServerRequest *request) {
|
||||
handleStaticContent(request, "", 200, FPSTR(s_html), PAGE_liveview, PAGE_liveview_length);
|
||||
server.on(F("/liveview"), HTTP_GET, [](AsyncWebServerRequest *request) {
|
||||
handleStaticContent(request, "", 200, FPSTR(CONTENT_TYPE_HTML), PAGE_liveview, PAGE_liveview_length);
|
||||
});
|
||||
|
||||
//settings page
|
||||
server.on(SET_F("/settings"), HTTP_GET, [](AsyncWebServerRequest *request){
|
||||
server.on(F("/settings"), HTTP_GET, [](AsyncWebServerRequest *request){
|
||||
serveSettings(request);
|
||||
});
|
||||
|
||||
// "/settings/settings.js&p=x" request also handled by serveSettings()
|
||||
static const char _style_css[] PROGMEM = "/style.css";
|
||||
server.on(_style_css, HTTP_GET, [](AsyncWebServerRequest *request) {
|
||||
handleStaticContent(request, FPSTR(_style_css), 200, FPSTR(s_css), PAGE_settingsCss, PAGE_settingsCss_length);
|
||||
handleStaticContent(request, FPSTR(_style_css), 200, FPSTR(CONTENT_TYPE_CSS), PAGE_settingsCss, PAGE_settingsCss_length);
|
||||
});
|
||||
|
||||
static const char _favicon_ico[] PROGMEM = "/favicon.ico";
|
||||
|
@ -287,28 +257,29 @@ void initServer()
|
|||
static const char _skin_css[] PROGMEM = "/skin.css";
|
||||
server.on(_skin_css, HTTP_GET, [](AsyncWebServerRequest *request) {
|
||||
if (handleFileRead(request, FPSTR(_skin_css))) return;
|
||||
AsyncWebServerResponse *response = request->beginResponse(200, FPSTR(s_css));
|
||||
AsyncWebServerResponse *response = request->beginResponse(200, FPSTR(CONTENT_TYPE_CSS));
|
||||
request->send(response);
|
||||
});
|
||||
|
||||
server.on(SET_F("/welcome"), HTTP_GET, [](AsyncWebServerRequest *request){
|
||||
server.on(F("/welcome"), HTTP_GET, [](AsyncWebServerRequest *request){
|
||||
serveSettings(request);
|
||||
});
|
||||
|
||||
server.on(SET_F("/reset"), HTTP_GET, [](AsyncWebServerRequest *request){
|
||||
server.on(F("/reset"), HTTP_GET, [](AsyncWebServerRequest *request){
|
||||
serveMessage(request, 200,F("Rebooting now..."),F("Please wait ~10 seconds..."),129);
|
||||
doReboot = true;
|
||||
});
|
||||
|
||||
server.on(SET_F("/settings"), HTTP_POST, [](AsyncWebServerRequest *request){
|
||||
server.on(F("/settings"), HTTP_POST, [](AsyncWebServerRequest *request){
|
||||
serveSettings(request, true);
|
||||
});
|
||||
|
||||
server.on(SET_F("/json"), HTTP_GET, [](AsyncWebServerRequest *request){
|
||||
const static char _json[] PROGMEM = "/json";
|
||||
server.on(FPSTR(_json), HTTP_GET, [](AsyncWebServerRequest *request){
|
||||
serveJson(request);
|
||||
});
|
||||
|
||||
AsyncCallbackJsonWebHandler* handler = new AsyncCallbackJsonWebHandler(F("/json"), [](AsyncWebServerRequest *request) {
|
||||
AsyncCallbackJsonWebHandler* handler = new AsyncCallbackJsonWebHandler(FPSTR(_json), [](AsyncWebServerRequest *request) {
|
||||
bool verboseResponse = false;
|
||||
bool isConfig = false;
|
||||
|
||||
|
@ -356,33 +327,33 @@ void initServer()
|
|||
doSerializeConfig = true; //serializeConfig(); //Save new settings to FS
|
||||
}
|
||||
}
|
||||
request->send(200, s_json, F("{\"success\":true}"));
|
||||
request->send(200, CONTENT_TYPE_JSON, F("{\"success\":true}"));
|
||||
}, JSON_BUFFER_SIZE);
|
||||
server.addHandler(handler);
|
||||
|
||||
server.on(SET_F("/version"), HTTP_GET, [](AsyncWebServerRequest *request){
|
||||
request->send(200, FPSTR(s_plain), (String)VERSION);
|
||||
server.on(F("/version"), HTTP_GET, [](AsyncWebServerRequest *request){
|
||||
request->send(200, FPSTR(CONTENT_TYPE_PLAIN), (String)VERSION);
|
||||
});
|
||||
|
||||
server.on(SET_F("/uptime"), HTTP_GET, [](AsyncWebServerRequest *request){
|
||||
request->send(200, FPSTR(s_plain), (String)millis());
|
||||
server.on(F("/uptime"), HTTP_GET, [](AsyncWebServerRequest *request){
|
||||
request->send(200, FPSTR(CONTENT_TYPE_PLAIN), (String)millis());
|
||||
});
|
||||
|
||||
server.on(SET_F("/freeheap"), HTTP_GET, [](AsyncWebServerRequest *request){
|
||||
request->send(200, FPSTR(s_plain), (String)ESP.getFreeHeap());
|
||||
server.on(F("/freeheap"), HTTP_GET, [](AsyncWebServerRequest *request){
|
||||
request->send(200, FPSTR(CONTENT_TYPE_PLAIN), (String)ESP.getFreeHeap());
|
||||
});
|
||||
|
||||
#ifdef WLED_ENABLE_USERMOD_PAGE
|
||||
server.on("/u", HTTP_GET, [](AsyncWebServerRequest *request) {
|
||||
handleStaticContent(request, "", 200, FPSTR(s_html), PAGE_usermod, PAGE_usermod_length);
|
||||
handleStaticContent(request, "", 200, FPSTR(CONTENT_TYPE_HTML), PAGE_usermod, PAGE_usermod_length);
|
||||
});
|
||||
#endif
|
||||
|
||||
server.on(SET_F("/teapot"), HTTP_GET, [](AsyncWebServerRequest *request){
|
||||
server.on(F("/teapot"), HTTP_GET, [](AsyncWebServerRequest *request){
|
||||
serveMessage(request, 418, F("418. I'm a teapot."), F("(Tangible Embedded Advanced Project Of Twinkling)"), 254);
|
||||
});
|
||||
|
||||
server.on(SET_F("/upload"), HTTP_POST, [](AsyncWebServerRequest *request) {},
|
||||
server.on(F("/upload"), HTTP_POST, [](AsyncWebServerRequest *request) {},
|
||||
[](AsyncWebServerRequest *request, const String& filename, size_t index, uint8_t *data,
|
||||
size_t len, bool final) {handleUpload(request, filename, index, data, len, final);}
|
||||
);
|
||||
|
@ -453,7 +424,7 @@ void initServer()
|
|||
|
||||
#ifdef WLED_ENABLE_DMX
|
||||
server.on(SET_F("/dmxmap"), HTTP_GET, [](AsyncWebServerRequest *request){
|
||||
request->send_P(200, FPSTR(s_html), PAGE_dmxmap , dmxProcessor);
|
||||
request->send_P(200, FPSTR(CONTENT_TYPE_HTML), PAGE_dmxmap , dmxProcessor);
|
||||
});
|
||||
#else
|
||||
server.on(SET_F("/dmxmap"), HTTP_GET, [](AsyncWebServerRequest *request){
|
||||
|
@ -464,7 +435,7 @@ void initServer()
|
|||
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) {
|
||||
if (captivePortal(request)) return;
|
||||
if (!showWelcomePage || request->hasArg(F("sliders"))) {
|
||||
handleStaticContent(request, F("/index.htm"), 200, FPSTR(s_html), PAGE_index, PAGE_index_L);
|
||||
handleStaticContent(request, F("/index.htm"), 200, FPSTR(CONTENT_TYPE_HTML), PAGE_index, PAGE_index_L);
|
||||
} else {
|
||||
serveSettings(request);
|
||||
}
|
||||
|
@ -473,20 +444,20 @@ void initServer()
|
|||
#ifdef WLED_ENABLE_PIXART
|
||||
static const char _pixart_htm[] PROGMEM = "/pixart.htm";
|
||||
server.on(_pixart_htm, HTTP_GET, [](AsyncWebServerRequest *request) {
|
||||
handleStaticContent(request, FPSTR(_pixart_htm), 200, FPSTR(s_html), PAGE_pixart, PAGE_pixart_L);
|
||||
handleStaticContent(request, FPSTR(_pixart_htm), 200, FPSTR(CONTENT_TYPE_HTML), PAGE_pixart, PAGE_pixart_L);
|
||||
});
|
||||
#endif
|
||||
|
||||
#ifndef WLED_DISABLE_PXMAGIC
|
||||
static const char _pxmagic_htm[] PROGMEM = "/pxmagic.htm";
|
||||
server.on(_pxmagic_htm, HTTP_GET, [](AsyncWebServerRequest *request) {
|
||||
handleStaticContent(request, FPSTR(_pxmagic_htm), 200, FPSTR(s_html), PAGE_pxmagic, PAGE_pxmagic_L);
|
||||
handleStaticContent(request, FPSTR(_pxmagic_htm), 200, FPSTR(CONTENT_TYPE_HTML), PAGE_pxmagic, PAGE_pxmagic_L);
|
||||
});
|
||||
#endif
|
||||
|
||||
static const char _cpal_htm[] PROGMEM = "/cpal.htm";
|
||||
server.on(_cpal_htm, HTTP_GET, [](AsyncWebServerRequest *request) {
|
||||
handleStaticContent(request, FPSTR(_cpal_htm), 200, FPSTR(s_html), PAGE_cpal, PAGE_cpal_L);
|
||||
handleStaticContent(request, FPSTR(_cpal_htm), 200, FPSTR(CONTENT_TYPE_HTML), PAGE_cpal, PAGE_cpal_L);
|
||||
});
|
||||
|
||||
#ifdef WLED_ENABLE_WEBSOCKETS
|
||||
|
@ -511,7 +482,7 @@ void initServer()
|
|||
#ifndef WLED_DISABLE_ALEXA
|
||||
if(espalexa.handleAlexaApiCall(request)) return;
|
||||
#endif
|
||||
handleStaticContent(request, request->url(), 404, FPSTR(s_html), PAGE_404, PAGE_404_length);
|
||||
handleStaticContent(request, request->url(), 404, FPSTR(CONTENT_TYPE_HTML), PAGE_404, PAGE_404_length);
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -522,7 +493,7 @@ void serveMessage(AsyncWebServerRequest* request, uint16_t code, const String& h
|
|||
messageSub = subl;
|
||||
optionType = optionT;
|
||||
|
||||
request->send_P(code, FPSTR(s_html), PAGE_msg, msgProcessor);
|
||||
request->send_P(code, FPSTR(CONTENT_TYPE_HTML), PAGE_msg, msgProcessor);
|
||||
}
|
||||
|
||||
|
||||
|
@ -530,7 +501,7 @@ void serveJsonError(AsyncWebServerRequest* request, uint16_t code, uint16_t erro
|
|||
{
|
||||
AsyncJsonResponse *response = new AsyncJsonResponse(64);
|
||||
if (error < ERR_NOT_IMPL) response->addHeader(F("Retry-After"), F("1"));
|
||||
response->setContentType(s_json);
|
||||
response->setContentType(CONTENT_TYPE_JSON);
|
||||
response->setCode(code);
|
||||
JsonObject obj = response->getRoot();
|
||||
obj[F("error")] = error;
|
||||
|
@ -546,12 +517,12 @@ void serveSettingsJS(AsyncWebServerRequest* request)
|
|||
byte subPage = request->arg(F("p")).toInt();
|
||||
if (subPage > 10) {
|
||||
strcpy_P(buf, PSTR("alert('Settings for this request are not implemented.');"));
|
||||
request->send(501, FPSTR(s_javascript), buf);
|
||||
request->send(501, FPSTR(CONTENT_TYPE_JAVASCRIPT), buf);
|
||||
return;
|
||||
}
|
||||
if (subPage > 0 && !correctPIN && strlen(settingsPIN)>0) {
|
||||
strcpy_P(buf, PSTR("alert('PIN incorrect.');"));
|
||||
request->send(401, FPSTR(s_javascript), buf);
|
||||
request->send(401, FPSTR(CONTENT_TYPE_JAVASCRIPT), buf);
|
||||
return;
|
||||
}
|
||||
strcat_P(buf,PSTR("function GetV(){var d=document;"));
|
||||
|
@ -559,7 +530,7 @@ void serveSettingsJS(AsyncWebServerRequest* request)
|
|||
strcat_P(buf,PSTR("}"));
|
||||
|
||||
AsyncWebServerResponse *response;
|
||||
response = request->beginResponse(200, FPSTR(s_javascript), buf);
|
||||
response = request->beginResponse(200, FPSTR(CONTENT_TYPE_JAVASCRIPT), buf);
|
||||
response->addHeader(F("Cache-Control"), F("no-store"));
|
||||
response->addHeader(F("Expires"), F("0"));
|
||||
request->send(response);
|
||||
|
@ -640,7 +611,7 @@ void serveSettings(AsyncWebServerRequest* request, bool post) {
|
|||
}
|
||||
|
||||
int code = 200;
|
||||
String contentType = FPSTR(s_html);
|
||||
String contentType = FPSTR(CONTENT_TYPE_HTML);
|
||||
const uint8_t* content;
|
||||
size_t len;
|
||||
|
||||
|
@ -666,7 +637,7 @@ void serveSettings(AsyncWebServerRequest* request, bool post) {
|
|||
return;
|
||||
}
|
||||
case SUBPAGE_PINREQ : content = PAGE_settings_pin; len = PAGE_settings_pin_length; code = 401; break;
|
||||
case SUBPAGE_CSS : content = PAGE_settingsCss; len = PAGE_settingsCss_length; contentType = FPSTR(s_css); break;
|
||||
case SUBPAGE_CSS : content = PAGE_settingsCss; len = PAGE_settingsCss_length; contentType = FPSTR(CONTENT_TYPE_CSS); break;
|
||||
case SUBPAGE_JS : serveSettingsJS(request); return;
|
||||
case SUBPAGE_WELCOME : content = PAGE_welcome; len = PAGE_welcome_length; break;
|
||||
default: content = PAGE_settings; len = PAGE_settings_length; break;
|
||||
|
|
|
@ -102,7 +102,6 @@ void wsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventTyp
|
|||
void sendDataWs(AsyncWebSocketClient * client)
|
||||
{
|
||||
if (!ws.count()) return;
|
||||
AsyncWebSocketMessageBuffer * buffer;
|
||||
|
||||
if (!requestJSONBufferLock(12)) {
|
||||
if (client) {
|
||||
|
@ -129,7 +128,7 @@ void sendDataWs(AsyncWebSocketClient * client)
|
|||
return;
|
||||
}
|
||||
#endif
|
||||
buffer = ws.makeBuffer(len); // will not allocate correct memory sometimes on ESP8266
|
||||
AsyncWebSocketBuffer buffer(len);
|
||||
#ifdef ESP8266
|
||||
size_t heap2 = ESP.getFreeHeap();
|
||||
DEBUG_PRINT(F("heap ")); DEBUG_PRINTLN(ESP.getFreeHeap());
|
||||
|
@ -141,23 +140,18 @@ void sendDataWs(AsyncWebSocketClient * client)
|
|||
DEBUG_PRINTLN(F("WS buffer allocation failed."));
|
||||
ws.closeAll(1013); //code 1013 = temporary overload, try again later
|
||||
ws.cleanupClients(0); //disconnect all clients to release memory
|
||||
ws._cleanBuffers();
|
||||
return; //out of memory
|
||||
}
|
||||
|
||||
buffer->lock();
|
||||
serializeJson(*pDoc, (char *)buffer->get(), len);
|
||||
serializeJson(*pDoc, (char *)buffer.data(), len);
|
||||
|
||||
DEBUG_PRINT(F("Sending WS data "));
|
||||
if (client) {
|
||||
client->text(buffer);
|
||||
client->text(std::move(buffer));
|
||||
DEBUG_PRINTLN(F("to a single client."));
|
||||
} else {
|
||||
ws.textAll(buffer);
|
||||
ws.textAll(std::move(buffer));
|
||||
DEBUG_PRINTLN(F("to multiple clients."));
|
||||
}
|
||||
buffer->unlock();
|
||||
ws._cleanBuffers();
|
||||
|
||||
releaseJSONBufferLock();
|
||||
}
|
||||
|
@ -187,11 +181,10 @@ bool sendLiveLedsWs(uint32_t wsClient)
|
|||
#endif
|
||||
size_t bufSize = pos + (used/n)*3;
|
||||
|
||||
AsyncWebSocketMessageBuffer * wsBuf = ws.makeBuffer(bufSize);
|
||||
AsyncWebSocketBuffer wsBuf(bufSize);
|
||||
if (!wsBuf) return false; //out of memory
|
||||
uint8_t* buffer = wsBuf->get();
|
||||
uint8_t* buffer = reinterpret_cast<uint8_t*>(wsBuf.data());
|
||||
if (!buffer) return false; //out of memory
|
||||
wsBuf->lock(); // protect buffer from being cleaned by another WS instance
|
||||
buffer[0] = 'L';
|
||||
buffer[1] = 1; //version
|
||||
|
||||
|
@ -218,9 +211,7 @@ bool sendLiveLedsWs(uint32_t wsClient)
|
|||
buffer[pos++] = scale8(qadd8(w, b), strip.getBrightness()); //B
|
||||
}
|
||||
|
||||
wsc->binary(wsBuf);
|
||||
wsBuf->unlock(); // un-protect buffer
|
||||
ws._cleanBuffers();
|
||||
wsc->binary(std::move(wsBuf));
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue