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); + } +} +