From a34c8661bd95f219d4a521593755a0a80f94fc31 Mon Sep 17 00:00:00 2001 From: Proddy Date: Sun, 14 Jan 2024 21:12:36 +0100 Subject: [PATCH] optimize so easier to port to IDF later --- lib/framework/HttpEndpoint.h | 115 +++++++++++------------------------ 1 file changed, 36 insertions(+), 79 deletions(-) diff --git a/lib/framework/HttpEndpoint.h b/lib/framework/HttpEndpoint.h index 82546515f..3c1902583 100644 --- a/lib/framework/HttpEndpoint.h +++ b/lib/framework/HttpEndpoint.h @@ -13,76 +13,47 @@ using namespace std::placeholders; // for `_1` etc template -class HttpGetEndpoint { - public: - HttpGetEndpoint(JsonStateReader stateReader, - StatefulService * statefulService, - AsyncWebServer * server, - const String & servicePath, - SecurityManager * securityManager, - AuthenticationPredicate authenticationPredicate = AuthenticationPredicates::IS_ADMIN) - : _stateReader(stateReader) - , _statefulService(statefulService) { - server->on(servicePath.c_str(), HTTP_GET, securityManager->wrapRequest(std::bind(&HttpGetEndpoint::fetchSettings, this, _1), authenticationPredicate)); - } - - HttpGetEndpoint(JsonStateReader stateReader, StatefulService * statefulService, AsyncWebServer * server, const String & servicePath) - : _stateReader(stateReader) - , _statefulService(statefulService) { - server->on(servicePath.c_str(), HTTP_GET, std::bind(&HttpGetEndpoint::fetchSettings, this, _1)); - } - +class HttpEndpoint { protected: JsonStateReader _stateReader; + JsonStateUpdater _stateUpdater; StatefulService * _statefulService; - void fetchSettings(AsyncWebServerRequest * request) { - AsyncJsonResponse * response = new AsyncJsonResponse(false); - JsonObject jsonObject = response->getRoot().to(); - _statefulService->read(jsonObject, _stateReader); + AsyncCallbackWebHandler * GEThandler; + AsyncCallbackJsonWebHandler * POSThandler; - response->setLength(); - request->send(response); - } -}; - -template -class HttpPostEndpoint { public: - HttpPostEndpoint(JsonStateReader stateReader, - JsonStateUpdater stateUpdater, - StatefulService * statefulService, - AsyncWebServer * server, - const String & servicePath, - SecurityManager * securityManager, - AuthenticationPredicate authenticationPredicate = AuthenticationPredicates::IS_ADMIN) + HttpEndpoint(JsonStateReader stateReader, + JsonStateUpdater stateUpdater, + StatefulService * statefulService, + AsyncWebServer * server, + const String & servicePath, + SecurityManager * securityManager, + AuthenticationPredicate authenticationPredicate = AuthenticationPredicates::IS_ADMIN) : _stateReader(stateReader) , _stateUpdater(stateUpdater) - , _statefulService(statefulService) - , _updateHandler(servicePath, securityManager->wrapCallback(std::bind(&HttpPostEndpoint::updateSettings, this, _1, _2), authenticationPredicate)) { - _updateHandler.setMethod(HTTP_POST); - server->addHandler(&_updateHandler); - } + , _statefulService(statefulService) { + // Create the GET and POST endpoints + // We can't use HTTP_ANY and process one a single endpoint due to the way the ESPAsyncWebServer library works + // Could also use server->on() but this is more efficient - HttpPostEndpoint(JsonStateReader stateReader, - JsonStateUpdater stateUpdater, - StatefulService * statefulService, - AsyncWebServer * server, - const String & servicePath) - : _stateReader(stateReader) - , _stateUpdater(stateUpdater) - , _statefulService(statefulService) - , _updateHandler(servicePath, std::bind(&HttpPostEndpoint::updateSettings, this, _1, _2)) { - _updateHandler.setMethod(HTTP_POST); - server->addHandler(&_updateHandler); + // create the GET + GEThandler = new AsyncCallbackWebHandler(); + GEThandler->setUri(servicePath); + GEThandler->setMethod(HTTP_GET); + GEThandler->onRequest(securityManager->wrapRequest(std::bind(&HttpEndpoint::fetchSettings, this, _1), authenticationPredicate)); + server->addHandler(GEThandler); + + // create the POST + POSThandler = + new AsyncCallbackJsonWebHandler(servicePath, + securityManager->wrapCallback(std::bind(&HttpEndpoint::updateSettings, this, _1, _2), authenticationPredicate)); + POSThandler->setMethod(HTTP_POST); + server->addHandler(POSThandler); } protected: - JsonStateReader _stateReader; - JsonStateUpdater _stateUpdater; - StatefulService * _statefulService; - AsyncCallbackJsonWebHandler _updateHandler; - + // for POST void updateSettings(AsyncWebServerRequest * request, JsonVariant json) { if (!json.is()) { request->send(400); @@ -105,29 +76,15 @@ class HttpPostEndpoint { response->setLength(); request->send(response); } -}; -template -class HttpEndpoint : public HttpGetEndpoint, public HttpPostEndpoint { - public: - HttpEndpoint(JsonStateReader stateReader, - JsonStateUpdater stateUpdater, - StatefulService * statefulService, - AsyncWebServer * server, - const String & servicePath, - SecurityManager * securityManager, - AuthenticationPredicate authenticationPredicate = AuthenticationPredicates::IS_ADMIN) - : HttpGetEndpoint(stateReader, statefulService, server, servicePath, securityManager, authenticationPredicate) - , HttpPostEndpoint(stateReader, stateUpdater, statefulService, server, servicePath, securityManager, authenticationPredicate) { - } + // for GET + void fetchSettings(AsyncWebServerRequest * request) { + AsyncJsonResponse * response = new AsyncJsonResponse(false); + JsonObject jsonObject = response->getRoot().to(); + _statefulService->read(jsonObject, _stateReader); - HttpEndpoint(JsonStateReader stateReader, - JsonStateUpdater stateUpdater, - StatefulService * statefulService, - AsyncWebServer * server, - const String & servicePath) - : HttpGetEndpoint(stateReader, statefulService, server, servicePath) - , HttpPostEndpoint(stateReader, stateUpdater, statefulService, server, servicePath) { + response->setLength(); + request->send(response); } };