15 String method =
webServer.method() == HTTP_GET ?
"GET" :
"POST";
19 logWarn(
"404 Not Found: %s %s", method.c_str(), uri.c_str());
22 webServer.send(404,
"text/html; charset=utf-8", html);
38 logWarn(
"Валидация: отсутствует SSID");
50 logWarn(
"Валидация: MQTT включен, но отсутствует сервер");
60 logWarn(
"Валидация: ThingSpeak включен, но отсутствует API ключ");
70 int port =
webServer.arg(
"mqtt_port").toInt();
71 if (port < 1 || port > 65535)
73 logWarn(
"Валидация: некорректный MQTT порт: %d", port);
80 int interval =
webServer.arg(
"ntp_interval").toInt();
81 if (interval < 10000 || interval > 86400000)
83 logWarn(
"Валидация: некорректный NTP интервал: %d", interval);
91 int interval =
webServer.arg(
"sensor_read").toInt();
92 if (interval < 1000 || interval > 300000)
94 logWarn(
"Валидация: некорректный интервал чтения датчика: %d", interval);
101 int interval =
webServer.arg(
"mqtt_publish").toInt();
102 if (interval < 1000 || interval > 3600000)
104 logWarn(
"Валидация: некорректный интервал MQTT публикации: %d", interval);
109 if (
webServer.hasArg(
"thingspeak_interval"))
111 int interval =
webServer.arg(
"thingspeak_interval").toInt();
112 if (interval < 15000 || interval > 7200000)
114 logWarn(
"Валидация: некорректный интервал ThingSpeak: %d", interval);
119 logDebug(
"Валидация конфигурации прошла успешно");
125 logError(
"Ошибка загрузки файла: %s", error.c_str());
128 webServer.send(400,
"text/html; charset=utf-8", html);
137 if (feature ==
"main" || feature ==
"save" || feature ==
"status")
152void logWebRequest(
const String& method,
const String& uri,
const String& clientIP)
155 if (uri.startsWith(
"/sensor_json") || uri.startsWith(
API_SENSOR))
158 logDebug(
"%s %s from %s", method.c_str(), uri.c_str(), clientIP.c_str());
163 logInfo(
"Web: %s %s from %s", method.c_str(), uri.c_str(), clientIP.c_str());
179 "<p><a href='javascript:history.back()' style='color: #4CAF50; text-decoration: none;'>← Назад к форме</a></p>";
190 logError(
"Критическая ошибка веб-сервера: %s", error.c_str());
193 webServer.send(500,
"text/html; charset=utf-8", html);
206 return (uri ==
"/" || uri ==
"/save" || uri ==
"/status" || uri ==
"/reboot");
220 webServer.send(403,
"text/html; charset=utf-8", html);
bool validateConfigInput(bool checkRequired)
Валидация входных данных конфигурации
bool isRouteAvailable(const String &uri)
Проверка доступности маршрута в текущем режиме
void logWebRequest(const String &method, const String &uri, const String &clientIP)
Логирование веб-запросов
void handleCriticalError(const String &error)
Обработка критических ошибок сервера
bool checkRouteAccess(const String &routeName, const String &icon)
Middleware для проверки доступности маршрута Используется в каждом маршруте, который недоступен в AP ...
String generateValidationErrorResponse(const String &errorMsg)
Генерация HTML ответа с ошибкой валидации
void handleUploadError(const String &error)
Обработка ошибок загрузки файлов
void setupErrorHandlers()
Настройка обработчиков ошибок (404, 500, и т.
bool isFeatureAvailable()
Проверка доступности функции в текущем режиме WiFi (без параметров)
void logDebug(const char *format,...)
void logWarn(const char *format,...)
void logError(const char *format,...)
void logInfo(const char *format,...)
Система логгирования с красивым форматированием
String generateErrorPage(int errorCode, const String &errorMessage)
Генерация страницы ошибки
String generateApModeUnavailablePage(const String &title, const String &icon)
Генерация страницы "Недоступно в AP режиме".
String generateBasePage(const String &title, const String &content, const String &icon)
Генерация базовой HTML структуры с навигацией
String generateFormError(const String &message)
Генерация сообщения об ошибке в форме