From 3eb639b02734caf9facb0da509d5f375f480625d Mon Sep 17 00:00:00 2001 From: Max Lunin Date: Thu, 17 Nov 2016 01:16:58 +0200 Subject: [PATCH] Reset all handlers. This allowing to use same server few times (#93) * Reset all handlers. This allowing to use same server few times during app life. E.g. for WiFi manager when hardware sepups WiFi connection and as HTTP server during hardware life cycle --- README.md | 26 +++++++++++++++ src/ESPAsyncWebServer.h | 8 +++-- src/WebServer.cpp | 74 +++++++++++++++++++++++++++++++++-------- 3 files changed, 93 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 9681fb8..3f4687c 100644 --- a/README.md +++ b/README.md @@ -807,6 +807,32 @@ server.on("/scan", HTTP_GET, [](AsyncWebServerRequest *request){ }); ``` +### Remove handlers and rewriters + +Server goes through handlers in same order as they were added. You can't simple add handler with same path to override them. +To remove handler: +```arduino +// save callback for particular URL path +auto handler = server.on("/some/path", [](AsyncWebServerRequest *request){ + //do something useful +}); +// when you don't need handler anymore remove it +server.removeHandler(&handler); + +// same with rewriters +server.removeRewrite(&someRewriter); + +server.onNotFound([](AsyncWebServerRequest *request){ +request->send(404); +}); + +// remove server.onNotFound handler +server.onNotFound(NULL); + +// remove all writers and handlers, with onNotFound/onFileUpload/onRequestBody +server.reset(); +``` + ## Setting up the server ```cpp #include "ESPAsyncTCP.h" diff --git a/src/ESPAsyncWebServer.h b/src/ESPAsyncWebServer.h index fe81587..8e44899 100644 --- a/src/ESPAsyncWebServer.h +++ b/src/ESPAsyncWebServer.h @@ -379,11 +379,13 @@ class AsyncWebServer { #endif AsyncWebRewrite& addRewrite(AsyncWebRewrite* rewrite); - + bool removeRewrite(AsyncWebRewrite* rewrite); + AsyncWebRewrite& rewrite(const char* from, const char* to); AsyncWebHandler& addHandler(AsyncWebHandler* handler); - + bool removeHandler(AsyncWebHandler* handler); + AsyncCallbackWebHandler& on(const char* uri, ArRequestHandlerFunction onRequest); AsyncCallbackWebHandler& on(const char* uri, WebRequestMethodComposite method, ArRequestHandlerFunction onRequest); AsyncCallbackWebHandler& on(const char* uri, WebRequestMethodComposite method, ArRequestHandlerFunction onRequest, ArUploadHandlerFunction onUpload); @@ -395,6 +397,8 @@ class AsyncWebServer { void onFileUpload(ArUploadHandlerFunction fn); //handle file uploads void onRequestBody(ArBodyHandlerFunction fn); //handle posts with plain body content (JSON often transmitted this way as a request) + void reset(); //remove all writers and handlers, with onNotFound/onFileUpload/onRequestBody + void _handleDisconnect(AsyncWebServerRequest *request); void _attachHandler(AsyncWebServerRequest *request); void _rewriteRequest(AsyncWebServerRequest *request); diff --git a/src/WebServer.cpp b/src/WebServer.cpp index b258359..9875f22 100644 --- a/src/WebServer.cpp +++ b/src/WebServer.cpp @@ -40,19 +40,8 @@ AsyncWebServer::AsyncWebServer(uint16_t port):_server(port), _rewrites(0), _hand } AsyncWebServer::~AsyncWebServer(){ - while(_rewrites != NULL){ - AsyncWebRewrite *r = _rewrites; - _rewrites = r->next; - delete r; - } - while(_handlers != NULL){ - AsyncWebHandler *h = _handlers; - _handlers = h->next; - delete h; - } - if (_catchAllHandler != NULL){ - delete _catchAllHandler; - } + reset(); + delete _catchAllHandler; } AsyncWebRewrite& AsyncWebServer::addRewrite(AsyncWebRewrite* rewrite){ @@ -66,6 +55,24 @@ AsyncWebRewrite& AsyncWebServer::addRewrite(AsyncWebRewrite* rewrite){ return *rewrite; } +bool AsyncWebServer::removeRewrite(AsyncWebRewrite *rewrite){ + if(rewrite == _rewrites){ + _rewrites = _rewrites->next; + return true; + } + AsyncWebRewrite *r = _rewrites; + while(r != NULL){ + if(rewrite == r->next){ + AsyncWebRewrite *d = r->next; + r->next = d->next; + delete d; + return true; + } + r = r->next; + } + return false; +} + AsyncWebRewrite& AsyncWebServer::rewrite(const char* from, const char* to){ return addRewrite(new AsyncWebRewrite(from, to)); } @@ -81,6 +88,24 @@ AsyncWebHandler& AsyncWebServer::addHandler(AsyncWebHandler* handler){ return *handler; } +bool AsyncWebServer::removeHandler(AsyncWebHandler *handler){ + if(handler == _handlers){ + _handlers = _handlers->next; + return true; + } + AsyncWebHandler *h = _handlers; + while(h != NULL){ + if(handler == h->next){ + AsyncWebHandler *d = h->next; + h->next = d->next; + delete d; + return true; + } + h = h->next; + } + return false; +} + void AsyncWebServer::begin(){ _server.begin(); } @@ -181,3 +206,26 @@ void AsyncWebServer::onFileUpload(ArUploadHandlerFunction fn){ void AsyncWebServer::onRequestBody(ArBodyHandlerFunction fn){ ((AsyncCallbackWebHandler*)_catchAllHandler)->onBody(fn); } + +void AsyncWebServer::reset(){ + while(_rewrites != NULL){ + AsyncWebRewrite *r = _rewrites; + _rewrites = r->next; + delete r; + } + _rewrites = NULL; + + while(_handlers != NULL){ + AsyncWebHandler *h = _handlers; + _handlers = h->next; + delete h; + } + _handlers = NULL; + + if (_catchAllHandler != NULL){ + ((AsyncCallbackWebHandler*)_catchAllHandler)->onRequest(NULL); + ((AsyncCallbackWebHandler*)_catchAllHandler)->onUpload(NULL); + ((AsyncCallbackWebHandler*)_catchAllHandler)->onBody(NULL); + } +} +