summaryrefslogtreecommitdiff
path: root/platformio/relayctl/src/http_server.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'platformio/relayctl/src/http_server.cpp')
-rw-r--r--platformio/relayctl/src/http_server.cpp279
1 files changed, 0 insertions, 279 deletions
diff --git a/platformio/relayctl/src/http_server.cpp b/platformio/relayctl/src/http_server.cpp
deleted file mode 100644
index e1e9c10..0000000
--- a/platformio/relayctl/src/http_server.cpp
+++ /dev/null
@@ -1,279 +0,0 @@
-#include <Arduino.h>
-#include <string.h>
-
-#include "static.h"
-#include "http_server.h"
-#include "config.h"
-#include "config.def.h"
-#include "logging.h"
-#include "util.h"
-#include "led.h"
-
-namespace homekit {
-
-using files::StaticFile;
-
-static const char CONTENT_TYPE_HTML[] PROGMEM = "text/html; charset=utf-8";
-static const char CONTENT_TYPE_CSS[] PROGMEM = "text/css";
-static const char CONTENT_TYPE_JS[] PROGMEM = "application/javascript";
-static const char CONTENT_TYPE_JSON[] PROGMEM = "application/json";
-static const char CONTENT_TYPE_FAVICON[] PROGMEM = "image/x-icon";
-
-static const char JSON_UPDATE_FMT[] PROGMEM = "{\"result\":%d}";
-static const char JSON_STATUS_FMT[] PROGMEM = "{\"home_id\":\"%s\""
-#ifdef DEBUG
- ",\"configured\":%d"
- ",\"crc\":%u"
- ",\"fl_n\":%d"
- ",\"fl_w\":%d"
-#endif
- "}";
-static const size_t JSON_BUF_SIZE = 192;
-
-static const char JSON_SCAN_FIRST_LIST[] PROGMEM = "{\"list\":[";
-
-static const char MSG_IS_INVALID[] PROGMEM = " is invalid";
-static const char MSG_IS_MISSING[] PROGMEM = " is missing";
-
-static const char GZIP[] PROGMEM = "gzip";
-static const char CONTENT_ENCODING[] PROGMEM = "Content-Encoding";
-static const char NOT_FOUND[] PROGMEM = "Not Found";
-
-static const char ROUTE_STYLE_CSS[] PROGMEM = "/style.css";
-static const char ROUTE_APP_JS[] PROGMEM = "/app.js";
-static const char ROUTE_MD5_JS[] PROGMEM = "/md5.js";
-static const char ROUTE_FAVICON_ICO[] PROGMEM = "/favicon.ico";
-static const char ROUTE_STATUS[] PROGMEM = "/status";
-static const char ROUTE_SCAN[] PROGMEM = "/scan";
-static const char ROUTE_RESET[] PROGMEM = "/reset";
-// #ifdef DEBUG
-static const char ROUTE_HEAP[] PROGMEM = "/heap";
-// #endif
-static const char ROUTE_UPDATE[] PROGMEM = "/update";
-
-void HttpServer::start() {
- server.on(FPSTR(ROUTE_STYLE_CSS), HTTP_GET, [&]() { sendGzip(files::style_css, CONTENT_TYPE_CSS); });
- server.on(FPSTR(ROUTE_APP_JS), HTTP_GET, [&]() { sendGzip(files::app_js, CONTENT_TYPE_JS); });
- server.on(FPSTR(ROUTE_MD5_JS), HTTP_GET, [&]() { sendGzip(files::md5_js, CONTENT_TYPE_JS); });
- server.on(FPSTR(ROUTE_FAVICON_ICO), HTTP_GET, [&]() { sendGzip(files::favicon_ico, CONTENT_TYPE_FAVICON); });
-
- server.on("/", HTTP_GET, [&]() { sendGzip(files::index_html, CONTENT_TYPE_HTML); });
- server.on(FPSTR(ROUTE_STATUS), HTTP_GET, [&]() {
- char json_buf[JSON_BUF_SIZE];
- auto cfg = config::read();
-
- if (!isValid(cfg) || !cfg.flags.node_configured) {
- sprintf_P(json_buf, JSON_STATUS_FMT
- , DEFAULT_HOME_ID
-#ifdef DEBUG
- , 0
- , cfg.crc
- , cfg.flags.node_configured
- , cfg.flags.wifi_configured
-#endif
- );
- } else {
- char escaped_home_id[32];
- char *escaped_home_id_res = cfg.escapeHomeId(escaped_home_id, 32);
- sprintf_P(json_buf, JSON_STATUS_FMT
- , escaped_home_id_res == nullptr ? "?" : escaped_home_id
-#ifdef DEBUG
- , 1
- , cfg.crc
- , cfg.flags.node_configured
- , cfg.flags.wifi_configured
-#endif
- );
- }
- server.send(200, FPSTR(CONTENT_TYPE_JSON), json_buf);
- });
- server.on(FPSTR(ROUTE_STATUS), HTTP_POST, [&]() {
- auto cfg = config::read();
- String s;
-
- if (!getInputParam("ssid", 32, s)) return;
- strncpy(cfg.wifi_ssid, s.c_str(), 32);
- PRINTF("saving ssid: %s\n", cfg.wifi_ssid);
-
- if (!getInputParam("psk", 63, s)) return;
- strncpy(cfg.wifi_psk, s.c_str(), 63);
- PRINTF("saving psk: %s\n", cfg.wifi_psk);
-
- if (!getInputParam("hid", 16, s)) return;
- strcpy(cfg.home_id, s.c_str());
- PRINTF("saving home id: %s\n", cfg.home_id);
-
- cfg.flags.node_configured = 1;
- cfg.flags.wifi_configured = 1;
-
- config::write(cfg);
-
- restartTimer.once(0, restart);
- });
-
- server.on(FPSTR(ROUTE_RESET), HTTP_POST, [&]() {
- config::erase();
- restartTimer.once(1, restart);
- });
-
- server.on(FPSTR(ROUTE_HEAP), HTTP_GET, [&]() {
- server.send(200, FPSTR(CONTENT_TYPE_HTML), String(ESP.getFreeHeap()));
- });
-
- server.on(FPSTR(ROUTE_SCAN), HTTP_GET, [&]() {
- size_t i = 0;
- size_t len;
- const char* ssid;
- bool enough = false;
-
- bzero(reinterpret_cast<uint8_t*>(scanBuf), scanBufSize);
- char* cur = scanBuf;
-
- strncpy_P(cur, JSON_SCAN_FIRST_LIST, scanBufSize);
- cur += 9;
-
- for (auto& res: *scanResults) {
- ssid = res.ssid.c_str();
- len = res.ssid.length();
-
- // new item (array with 2 items)
- *cur++ = '[';
-
- // 1. ssid (string)
- *cur++ = '"';
- for (size_t j = 0; j < len; j++) {
- if (*(ssid+j) == '"')
- *cur++ = '\\';
- *cur++ = *(ssid+j);
- }
- *cur++ = '"';
- *cur++ = ',';
-
- // 2. rssi (number)
- cur += sprintf(cur, "%d", res.rssi);
-
- // close array
- *cur++ = ']';
-
- if ((size_t)(cur - scanBuf) >= (size_t) ARRAY_SIZE(scanBuf) - 40)
- enough = true;
-
- if (i < scanResults->size() - 1 || enough)
- *cur++ = ',';
-
- if (enough)
- break;
-
- i++;
- }
-
- *cur++ = ']';
- *cur++ = '}';
- *cur++ = '\0';
-
- server.send(200, FPSTR(CONTENT_TYPE_JSON), scanBuf);
- });
-
- server.on(FPSTR(ROUTE_UPDATE), HTTP_POST, [&]() {
- char json_buf[16];
- bool should_reboot = !Update.hasError() && !ota.invalidMd5;
- Update.clearError();
-
- sprintf_P(json_buf, JSON_UPDATE_FMT, should_reboot ? 1 : 0);
-
- server.send(200, FPSTR(CONTENT_TYPE_JSON), json_buf);
-
- if (should_reboot)
- restartTimer.once(1, restart);
- }, [&]() {
- HTTPUpload& upload = server.upload();
-
- if (upload.status == UPLOAD_FILE_START) {
- ota.clean();
-
- String s;
- if (!getInputParam("md5", 0, s)) {
- ota.invalidMd5 = true;
- PRINTLN("http/ota: md5 not found");
- return;
- }
-
- if (!Update.setMD5(s.c_str())) {
- ota.invalidMd5 = true;
- PRINTLN("http/ota: setMD5() failed");
- return;
- }
-
- Serial.printf("http/ota: starting, filename=%s\n", upload.filename.c_str());
- if (!Update.begin(otaGetMaxUpdateSize())) {
-#ifdef DEBUG
- Update.printError(Serial);
-#endif
- }
- } else if (upload.status == UPLOAD_FILE_WRITE) {
- if (!Update.isRunning())
- return;
-
- PRINTF("http/ota: writing %ul\n", upload.currentSize);
- esp_led.blink(1, 1);
- if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) {
-#ifdef DEBUG
- Update.printError(Serial);
-#endif
- }
- } else if (upload.status == UPLOAD_FILE_END) {
- if (!Update.isRunning())
- return;
-
- if (Update.end(true)) {
- PRINTF("http/ota: ok, total size %ul\n", upload.totalSize);
- } else {
-#ifdef DEBUG
- Update.printError(Serial);
-#endif
- }
- }
- });
-
- server.onNotFound([&]() {
- server.send(404, FPSTR(CONTENT_TYPE_HTML), NOT_FOUND);
- });
-
- server.begin();
-}
-
-void HttpServer::loop() {
- server.handleClient();
-}
-
-void HttpServer::sendGzip(const StaticFile& file, PGM_P content_type) {
- server.sendHeader(FPSTR(CONTENT_ENCODING), FPSTR(GZIP));
- server.send_P(200, content_type, (const char*)file.content, file.size);
-}
-
-void HttpServer::sendError(const String& message) {
- char buf[32];
- if (snprintf_P(buf, 32, PSTR("error: %s"), message.c_str()) == 32)
- buf[31] = '\0';
- server.send(400, FPSTR(CONTENT_TYPE_HTML), buf);
-}
-
-bool HttpServer::getInputParam(const char *field_name,
- size_t max_len,
- String& dst) {
- if (!server.hasArg(field_name)) {
- sendError(String(field_name) + String(MSG_IS_MISSING));
- return false;
- }
-
- String field = server.arg(field_name);
- if (!field.length() || (max_len != 0 && field.length() > max_len)) {
- sendError(String(field_name) + String(MSG_IS_INVALID));
- return false;
- }
-
- dst = field;
- return true;
-}
-
-} \ No newline at end of file