Multi-platform http server (#646)
- Add server support to `http-module` - Ensure `DevelopmentService` works on all platforms (including posix) - Ensure the built-in web server with dashboard works on all platforms (inluding posix). It still has some issues with certain featuers, but the basics work.
This commit is contained in:
committed by
GitHub
parent
a0b2ee7ebc
commit
1b16184a72
@@ -1,13 +1,10 @@
|
||||
#pragma once
|
||||
#ifdef ESP_PLATFORM
|
||||
|
||||
#include <Tactility/service/Service.h>
|
||||
|
||||
#include <Tactility/RecursiveMutex.h>
|
||||
|
||||
#include <esp_event.h>
|
||||
#include <esp_http_server.h>
|
||||
#include <Tactility/network/HttpServer.h>
|
||||
#include <http/server.h>
|
||||
|
||||
namespace tt::service::development {
|
||||
|
||||
@@ -15,47 +12,21 @@ class DevelopmentService final : public Service {
|
||||
|
||||
RecursiveMutex mutex;
|
||||
std::string deviceResponse;
|
||||
network::HttpServer httpServer = network::HttpServer(
|
||||
6666,
|
||||
"0.0.0.0",
|
||||
std::vector<httpd_uri_t>{
|
||||
{
|
||||
.uri = "/info",
|
||||
.method = HTTP_GET,
|
||||
.handler = handleGetInfo,
|
||||
.user_ctx = this
|
||||
},
|
||||
{
|
||||
.uri = "/app/run",
|
||||
.method = HTTP_POST,
|
||||
.handler = handleAppRun,
|
||||
.user_ctx = this
|
||||
},
|
||||
{
|
||||
.uri = "/app/install",
|
||||
.method = HTTP_PUT,
|
||||
.handler = handleAppInstall,
|
||||
.user_ctx = this
|
||||
},
|
||||
{
|
||||
.uri = "/app/uninstall",
|
||||
.method = HTTP_PUT,
|
||||
.handler = handleAppUninstall,
|
||||
.user_ctx = this
|
||||
}
|
||||
}
|
||||
);
|
||||
struct HttpServer* httpServer = nullptr;
|
||||
|
||||
void startServer();
|
||||
void stopServer();
|
||||
|
||||
static esp_err_t handleGetInfo(httpd_req_t* request);
|
||||
static esp_err_t handleAppRun(httpd_req_t* request);
|
||||
static esp_err_t handleAppInstall(httpd_req_t* request);
|
||||
static esp_err_t handleAppUninstall(httpd_req_t* request);
|
||||
static error_t handleGetInfo(struct HttpServerRequest* request, void* user_ctx);
|
||||
static error_t handleAppRun(struct HttpServerRequest* request, void* user_ctx);
|
||||
static error_t handleAppInstall(struct HttpServerRequest* request, void* user_ctx);
|
||||
static error_t handleAppUninstall(struct HttpServerRequest* request, void* user_ctx);
|
||||
|
||||
public:
|
||||
|
||||
DevelopmentService();
|
||||
~DevelopmentService() override;
|
||||
|
||||
// region Overrides
|
||||
|
||||
bool onStart(ServiceContext& service) override;
|
||||
@@ -82,5 +53,3 @@ public:
|
||||
std::shared_ptr<DevelopmentService> findService();
|
||||
|
||||
}
|
||||
|
||||
#endif // ESP_PLATFORM
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
#pragma once
|
||||
#ifdef ESP_PLATFORM
|
||||
|
||||
namespace tt::service::development {
|
||||
|
||||
@@ -8,5 +7,3 @@ void setEnableOnBoot(bool enable);
|
||||
bool shouldEnableOnBoot();
|
||||
|
||||
}
|
||||
|
||||
#endif // ESP_PLATFORM
|
||||
|
||||
@@ -1,13 +1,15 @@
|
||||
#pragma once
|
||||
#ifdef ESP_PLATFORM
|
||||
|
||||
#include <Tactility/PubSub.h>
|
||||
#include <Tactility/service/Service.h>
|
||||
#include <Tactility/network/HttpServer.h>
|
||||
#include <Tactility/RecursiveMutex.h>
|
||||
|
||||
#include <esp_http_server.h>
|
||||
#include <http/server.h>
|
||||
|
||||
#ifdef ESP_PLATFORM
|
||||
#include <esp_netif.h>
|
||||
#endif
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace tt::service::webserver {
|
||||
@@ -33,58 +35,63 @@ enum class WebServerEvent {
|
||||
class WebServerService final : public Service {
|
||||
private:
|
||||
mutable RecursiveMutex mutex;
|
||||
std::unique_ptr<network::HttpServer> httpServer;
|
||||
struct HttpServer* httpServer = nullptr;
|
||||
PubSub<WebServerEvent>::SubscriptionHandle settingsEventSubscription = nullptr;
|
||||
std::shared_ptr<PubSub<WebServerEvent>> pubsub = std::make_shared<PubSub<WebServerEvent>>();
|
||||
int8_t statusbarIconId = -1; // Statusbar icon for WebServer state
|
||||
|
||||
// AP mode WiFi management
|
||||
esp_netif_t* apNetif = nullptr;
|
||||
// AP mode WiFi management - real hardware only, see startApMode()/stopApMode()'s own
|
||||
// non-ESP_PLATFORM definitions.
|
||||
bool apWifiInitialized = false;
|
||||
#ifdef ESP_PLATFORM
|
||||
esp_netif_t* apNetif = nullptr;
|
||||
#endif
|
||||
|
||||
bool startApMode();
|
||||
void stopApMode();
|
||||
|
||||
// Core HTML endpoints (hardcoded in firmware)
|
||||
static esp_err_t handleRoot(httpd_req_t* request);
|
||||
static esp_err_t handleSync(httpd_req_t* request);
|
||||
static esp_err_t handleReboot(httpd_req_t* request);
|
||||
static error_t handleRoot(struct HttpServerRequest* request, void* user_ctx);
|
||||
static error_t handleSync(struct HttpServerRequest* request, void* user_ctx);
|
||||
static error_t handleReboot(struct HttpServerRequest* request, void* user_ctx);
|
||||
|
||||
// File browser endpoints
|
||||
static esp_err_t handleFileBrowser(httpd_req_t* request);
|
||||
static esp_err_t handleFsList(httpd_req_t* request);
|
||||
static esp_err_t handleFsTree(httpd_req_t* request);
|
||||
static esp_err_t handleFsDownload(httpd_req_t* request);
|
||||
static esp_err_t handleFsMkdir(httpd_req_t* request);
|
||||
static esp_err_t handleFsDelete(httpd_req_t* request);
|
||||
static esp_err_t handleFsRename(httpd_req_t* request);
|
||||
static esp_err_t handleFsUpload(httpd_req_t* request);
|
||||
static error_t handleFileBrowser(struct HttpServerRequest* request, void* user_ctx);
|
||||
static error_t handleFsList(struct HttpServerRequest* request, void* user_ctx);
|
||||
static error_t handleFsTree(struct HttpServerRequest* request, void* user_ctx);
|
||||
static error_t handleFsDownload(struct HttpServerRequest* request, void* user_ctx);
|
||||
static error_t handleFsMkdir(struct HttpServerRequest* request, void* user_ctx);
|
||||
static error_t handleFsDelete(struct HttpServerRequest* request, void* user_ctx);
|
||||
static error_t handleFsRename(struct HttpServerRequest* request, void* user_ctx);
|
||||
static error_t handleFsUpload(struct HttpServerRequest* request, void* user_ctx);
|
||||
// Consolidated dispatch handlers to reduce URI handler table usage
|
||||
static esp_err_t handleFsGenericGet(httpd_req_t* request);
|
||||
static esp_err_t handleFsGenericPost(httpd_req_t* request);
|
||||
static error_t handleFsGenericGet(struct HttpServerRequest* request, void* user_ctx);
|
||||
static error_t handleFsGenericPost(struct HttpServerRequest* request, void* user_ctx);
|
||||
// Admin dispatcher to consolidate small POST endpoints (sync/reboot)
|
||||
static esp_err_t handleAdminPost(httpd_req_t* request);
|
||||
static error_t handleAdminPost(struct HttpServerRequest* request, void* user_ctx);
|
||||
|
||||
// API endpoints
|
||||
static esp_err_t handleApiGet(httpd_req_t* request);
|
||||
static esp_err_t handleApiPost(httpd_req_t* request);
|
||||
static esp_err_t handleApiPut(httpd_req_t* request);
|
||||
static esp_err_t handleApiSysinfo(httpd_req_t* request);
|
||||
static esp_err_t handleApiApps(httpd_req_t* request);
|
||||
static esp_err_t handleApiAppsRun(httpd_req_t* request);
|
||||
static esp_err_t handleApiAppsUninstall(httpd_req_t* request);
|
||||
static esp_err_t handleApiAppsInstall(httpd_req_t* request);
|
||||
static esp_err_t handleApiWifi(httpd_req_t* request);
|
||||
static esp_err_t handleApiScreenshot(httpd_req_t* request);
|
||||
static error_t handleApiGet(struct HttpServerRequest* request, void* user_ctx);
|
||||
static error_t handleApiPost(struct HttpServerRequest* request, void* user_ctx);
|
||||
static error_t handleApiPut(struct HttpServerRequest* request, void* user_ctx);
|
||||
static error_t handleApiSysinfo(struct HttpServerRequest* request, void* user_ctx);
|
||||
static error_t handleApiApps(struct HttpServerRequest* request, void* user_ctx);
|
||||
static error_t handleApiAppsRun(struct HttpServerRequest* request, void* user_ctx);
|
||||
static error_t handleApiAppsUninstall(struct HttpServerRequest* request, void* user_ctx);
|
||||
static error_t handleApiAppsInstall(struct HttpServerRequest* request, void* user_ctx);
|
||||
static error_t handleApiWifi(struct HttpServerRequest* request, void* user_ctx);
|
||||
static error_t handleApiScreenshot(struct HttpServerRequest* request, void* user_ctx);
|
||||
|
||||
// Dynamic asset serving
|
||||
static esp_err_t handleAssets(httpd_req_t* request);
|
||||
static error_t handleAssets(struct HttpServerRequest* request, void* user_ctx);
|
||||
|
||||
bool startServer();
|
||||
void stopServer();
|
||||
|
||||
public:
|
||||
|
||||
~WebServerService() override;
|
||||
|
||||
bool onStart(ServiceContext& service) override;
|
||||
void onStop(ServiceContext& service) override;
|
||||
|
||||
@@ -104,5 +111,3 @@ bool isWebServerEnabled();
|
||||
std::shared_ptr<PubSub<WebServerEvent>> getPubsub();
|
||||
|
||||
} // namespace
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user