#include #include #include #include #include #include #include #include "webserver.h" #include "config.h" #include "gui/screenshot.h" AsyncWebServer asyncserver( WEBSERVERPORT ); TaskHandle_t _WEBSERVER_Task; void handleUpdate( AsyncWebServerRequest *request, const String& filename, size_t index, uint8_t *data, size_t len, bool final) { if (!index){ /* * if filename includes spiffs, update the spiffs partition */ int cmd = (filename.indexOf("spiffs") > 0) ? U_SPIFFS : U_FLASH; if (!Update.begin(UPDATE_SIZE_UNKNOWN, cmd)) { Update.printError(Serial); } } /* * Write Data an type message if fail */ if (Update.write(data, len) != len) { Update.printError(Serial); } /* * After write Update restart */ if (final) { AsyncWebServerResponse *response = request->beginResponse(302, "text/plain", "Please wait while the switch reboots"); response->addHeader("Refresh", "20"); response->addHeader("Location", "/"); request->send(response); if (!Update.end(true)){ Update.printError(Serial); } else { Serial.println("Update complete"); Serial.flush(); ESP.restart(); } } } /* * */ void asyncwebserver_setup(void){ asyncserver.on("/info", HTTP_GET, [](AsyncWebServerRequest * request) { request->send(200, "text/plain", "Firmwarestand: " __DATE__ " " __TIME__ "\r\nGCC-Version: " __VERSION__ "\r\n" ); }); asyncserver.on("/shot", HTTP_GET, [](AsyncWebServerRequest * request) { request->send(200, "text/plain", "screen is taken\r\n" ); screenshot_take(); screenshot_save(); }); asyncserver.addHandler(new SPIFFSEditor(SPIFFS)); asyncserver.serveStatic("/", SPIFFS, "/").setDefaultFile("index.htm"); asyncserver.onNotFound([](AsyncWebServerRequest *request){ Serial.printf( "NOT_FOUND: "); if(request->method() == HTTP_GET) Serial.printf( "GET"); else if(request->method() == HTTP_POST) Serial.printf( "POST"); else if(request->method() == HTTP_DELETE) Serial.printf( "DELETE"); else if(request->method() == HTTP_PUT) Serial.printf( "PUT"); else if(request->method() == HTTP_PATCH) Serial.printf( "PATCH"); else if(request->method() == HTTP_HEAD) Serial.printf( "HEAD"); else if(request->method() == HTTP_OPTIONS) Serial.printf( "OPTIONS"); else Serial.printf( "UNKNOWN"); Serial.printf( " http://%s%s\n", request->host().c_str(), request->url().c_str()); if(request->contentLength()){ Serial.printf( "_CONTENT_TYPE: %s\n", request->contentType().c_str()); Serial.printf( "_CONTENT_LENGTH: %u\n", request->contentLength()); } int headers = request->headers(); int i; for(i=0;igetHeader(i); Serial.printf( "_HEADER[%s]: %s\n", h->name().c_str(), h->value().c_str()); } int params = request->params(); for(i=0;igetParam(i); if(p->isFile()){ Serial.printf( "_FILE[%s]: %s, size: %u\n", p->name().c_str(), p->value().c_str(), p->size()); } else if(p->isPost()){ Serial.printf( "_POST[%s]: %s\n", p->name().c_str(), p->value().c_str()); } else { Serial.printf( "_GET[%s]: %s\n", p->name().c_str(), p->value().c_str()); } } request->send(404); }); asyncserver.onFileUpload([](AsyncWebServerRequest *request, const String& filename, size_t index, uint8_t *data, size_t len, bool final){ if(!index) Serial.printf( "UploadStart: %s\n", filename.c_str()); Serial.printf("%s", (const char*)data); if(final) Serial.printf( "UploadEnd: %s (%u)\n", filename.c_str(), index+len); }); asyncserver.onRequestBody([](AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total){ if(!index) { Serial.printf( "BodyStart: %u\n", total); } Serial.printf( "%s", (const char*)data); if(index + len == total) { Serial.printf( "BodyEnd: %u\n", total); } }); asyncserver.on("/reset", HTTP_GET, []( AsyncWebServerRequest * request ) { request->send(200, "text/plain", "Reset\r\n" ); delay(3000); ESP.restart(); }); asyncserver.on("/update", HTTP_POST, [](AsyncWebServerRequest *request) {}, [](AsyncWebServerRequest *request, const String& filename, size_t index, uint8_t *data, size_t len, bool final) { handleUpdate(request, filename, index, data, len, final); } ); asyncserver.begin(); }