mirror of
https://github.com/IoTManagerProject/IoTManager.git
synced 2026-03-26 14:12:16 +03:00
236 lines
7.7 KiB
C++
236 lines
7.7 KiB
C++
#include "StandWebServer.h"
|
||
#ifdef STANDARD_WEB_SERVER
|
||
|
||
File fsUploadFile;
|
||
|
||
void standWebServerInit() {
|
||
// Кэшировать файлы для быстрой работы
|
||
HTTP.serveStatic("/bundle.js", FileFS, "/", "max-age=31536000"); // кеширование на 1 год
|
||
HTTP.serveStatic("/bundle.css", FileFS, "/", "max-age=31536000"); // кеширование на 1 год
|
||
HTTP.serveStatic("/bundle.js.gz", FileFS, "/", "max-age=31536000"); // кеширование на 1 год
|
||
HTTP.serveStatic("/bundle.css.gz", FileFS, "/", "max-age=31536000"); // кеширование на 1 год
|
||
HTTP.serveStatic("/favicon.png", FileFS, "/", "max-age=31536000"); // кеширование на 1 год
|
||
|
||
// HTTP.on("/devicelist.json", HTTP_GET, []() {
|
||
// HTTP.send(200, "application/json", devListHeapJson);
|
||
// });
|
||
HTTP.on("/settings.h.json", HTTP_GET, []() {
|
||
HTTP.send(200, "application/json", settingsFlashJson);
|
||
});
|
||
// HTTP.on("/settings.f.json", HTTP_GET, []() {
|
||
// HTTP.send(200, "application/json", readFile(F("settings.json"), 20000));
|
||
// });
|
||
// HTTP.on("/params.json", HTTP_GET, []() {
|
||
// String json = getParamsJson();
|
||
// HTTP.send(200, "application/json", json);
|
||
// });
|
||
// HTTP.on("/errors.json", HTTP_GET, []() {
|
||
// HTTP.send(200, "application/json", errorsHeapJson);
|
||
// });
|
||
// HTTP.on("/config.json", HTTP_GET, []() {
|
||
// HTTP.send(200, "application/json", readFile(F("config.json"), 20000));
|
||
// });
|
||
// HTTP.on("/layout.json", HTTP_GET, []() {
|
||
// HTTP.send(200, "application/json", readFile(F("layout.json"), 20000));
|
||
// });
|
||
// HTTP.on("/restart", HTTP_GET, []() {
|
||
// // ESP.restart();
|
||
// HTTP.send(200, "text/plain", "ok");
|
||
// });
|
||
|
||
// Добавляем функцию Update для перезаписи прошивки по WiFi при 1М(256K FileFS) и выше
|
||
// httpUpdater.setup(&HTTP);
|
||
|
||
// Запускаем HTTP сервер
|
||
HTTP.begin();
|
||
|
||
//#ifdef REST_FILE_OPERATIONS
|
||
// SPIFFS.begin();
|
||
// {
|
||
// Dir dir = SPIFFS.openDir("/");
|
||
// while (dir.next()) {
|
||
// String fileName = dir.fileName();
|
||
// size_t fileSize = dir.fileSize();
|
||
// }
|
||
// }
|
||
// HTTP страницы для работы с FFS
|
||
|
||
// list directory
|
||
HTTP.on("/list", HTTP_GET, handleFileList);
|
||
|
||
//загрузка редактора editor
|
||
HTTP.on("/edit", HTTP_GET, []() {
|
||
if (!HTTP.args()) {
|
||
if (!handleFileRead("/edit.htm")) HTTP.send(404, "text/plain", "FileNotFound");
|
||
}
|
||
|
||
if (HTTP.hasArg("list")) {
|
||
handleFileList();
|
||
}
|
||
|
||
if (HTTP.hasArg("edit")) {
|
||
if (!handleFileRead(HTTP.arg("edit"))) HTTP.send(404, "text/plain", "FileNotFound");
|
||
}
|
||
|
||
if (HTTP.hasArg("download")) {
|
||
if (!handleFileRead(HTTP.arg("download"))) HTTP.send(404, "text/plain", "FileNotFound");
|
||
}
|
||
});
|
||
|
||
//Создание файла
|
||
HTTP.on("/edit", HTTP_PUT, handleFileCreate);
|
||
|
||
//Удаление файла
|
||
HTTP.on("/edit", HTTP_DELETE, handleFileDelete);
|
||
|
||
//Изменение файла
|
||
HTTP.on(
|
||
"/edit", HTTP_POST, []() {
|
||
HTTP.send(200, "text/plain", "");
|
||
},
|
||
handleFileUpload);
|
||
|
||
// called when the url is not defined here
|
||
HTTP.onNotFound([]() {
|
||
if (!handleFileRead(HTTP.uri()))
|
||
HTTP.send(404, "text/plain", "FileNotFound");
|
||
});
|
||
}
|
||
|
||
bool handleFileRead(String path) {
|
||
if (path.endsWith("/")) path += "index.html";
|
||
String contentType = getContentType(path);
|
||
String pathWithGz = path + ".gz";
|
||
if (FileFS.exists(pathWithGz) || FileFS.exists(path)) {
|
||
if (FileFS.exists(pathWithGz))
|
||
path += ".gz";
|
||
File file = FileFS.open(path, "r");
|
||
if (contentType == "application/octet-stream")
|
||
HTTP.sendHeader("Content-Disposition", "attachment;filename=" + (String)file.name());
|
||
HTTP.streamFile(file, contentType);
|
||
file.close();
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
String getContentType(String filename) {
|
||
if (HTTP.hasArg("download"))
|
||
return "application/octet-stream";
|
||
else if (filename.endsWith(".htm"))
|
||
return "text/html";
|
||
else if (filename.endsWith(".html"))
|
||
return "text/html";
|
||
else if (filename.endsWith(".txt"))
|
||
return "text/plain";
|
||
else if (filename.endsWith(".json"))
|
||
return "application/json";
|
||
else if (filename.endsWith(".css"))
|
||
return "text/css";
|
||
else if (filename.endsWith(".js"))
|
||
return "application/javascript";
|
||
else if (filename.endsWith(".png"))
|
||
return "image/png";
|
||
else if (filename.endsWith(".gif"))
|
||
return "image/gif";
|
||
else if (filename.endsWith(".jpg"))
|
||
return "image/jpeg";
|
||
else if (filename.endsWith(".ico"))
|
||
return "image/x-icon";
|
||
else if (filename.endsWith(".xml"))
|
||
return "text/xml";
|
||
else if (filename.endsWith(".pdf"))
|
||
return "application/x-pdf";
|
||
else if (filename.endsWith(".zip"))
|
||
return "application/x-zip";
|
||
else if (filename.endsWith(".gz"))
|
||
return "application/x-gzip";
|
||
return "text/plain";
|
||
}
|
||
|
||
// Здесь функции для работы с файловой системой
|
||
void handleFileUpload() {
|
||
if (HTTP.uri() != "/edit") return;
|
||
HTTPUpload& upload = HTTP.upload();
|
||
if (upload.status == UPLOAD_FILE_START) {
|
||
String filename = upload.filename;
|
||
if (!filename.startsWith("/")) filename = "/" + filename;
|
||
fsUploadFile = FileFS.open(filename, "w");
|
||
filename = String();
|
||
} else if (upload.status == UPLOAD_FILE_WRITE) {
|
||
// Serial.print("handleFileUpload Data: "); Serial.println(upload.currentSize);
|
||
if (fsUploadFile)
|
||
fsUploadFile.write(upload.buf, upload.currentSize);
|
||
} else if (upload.status == UPLOAD_FILE_END) {
|
||
if (fsUploadFile)
|
||
fsUploadFile.close();
|
||
}
|
||
}
|
||
|
||
void handleFileDelete() {
|
||
if (HTTP.args() == 0) return HTTP.send(500, "text/plain", "BAD ARGS");
|
||
String path = HTTP.arg(0);
|
||
if (path == "/")
|
||
return HTTP.send(500, "text/plain", "BAD PATH");
|
||
if (!FileFS.exists(path))
|
||
return HTTP.send(404, "text/plain", "FileNotFound");
|
||
FileFS.remove(path);
|
||
HTTP.send(200, "text/plain", "");
|
||
path = String();
|
||
}
|
||
|
||
void handleFileCreate() {
|
||
if (HTTP.args() == 0)
|
||
return HTTP.send(500, "text/plain", "BAD ARGS");
|
||
String path = HTTP.arg(0);
|
||
if (path == "/")
|
||
return HTTP.send(500, "text/plain", "BAD PATH");
|
||
if (FileFS.exists(path))
|
||
return HTTP.send(500, "text/plain", "FILE EXISTS");
|
||
File file = FileFS.open(path, "w");
|
||
if (file)
|
||
file.close();
|
||
else
|
||
return HTTP.send(500, "text/plain", "CREATE FAILED");
|
||
HTTP.send(200, "text/plain", "");
|
||
path = String();
|
||
}
|
||
|
||
void handleFileList() {
|
||
File dir = FileFS.open("/", "r");
|
||
String output = "[";
|
||
File entry;
|
||
while (entry = dir.openNextFile()) {
|
||
if (output != "[") output += ',';
|
||
bool isDir = entry.isDirectory();
|
||
output += "{\"type\":\"";
|
||
output += (isDir) ? "dir" : "file";
|
||
output += "\",\"name\":\"";
|
||
output += String(entry.name());
|
||
output += "\"}";
|
||
entry.close();
|
||
}
|
||
output += "]";
|
||
Serial.println(output);
|
||
HTTP.send(200, "text/json", output);
|
||
}
|
||
|
||
void printDirectory(File dir, String& out) {
|
||
while (true) {
|
||
File entry = dir.openNextFile();
|
||
if (!entry) {
|
||
break;
|
||
}
|
||
if (entry.isDirectory()) {
|
||
out += entry.name();
|
||
out += "/";
|
||
printDirectory(entry, out);
|
||
} else {
|
||
out += entry.name();
|
||
out += "\r\n";
|
||
}
|
||
}
|
||
}
|
||
|
||
#endif
|