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
This commit is contained in:
Max Lunin 2016-11-17 01:16:58 +02:00 committed by Me No Dev
parent 03c61fab43
commit 3eb639b027
3 changed files with 93 additions and 15 deletions

View File

@ -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"

View File

@ -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);

View File

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