From d5c2af8dc267ffd4e230cfa7cd7f5fc59d604b5d Mon Sep 17 00:00:00 2001 From: Emil Muratov Date: Wed, 26 Jun 2024 22:27:08 +0900 Subject: [PATCH] AsyncWebServerRequest::_params replace with STL container - LinkedList _rewrites; + std::list > _rewrites; --- src/ESPAsyncWebServer.h | 55 +++++++++++++++++++++++++++++++++++------ src/WebRequest.cpp | 4 +-- src/WebServer.cpp | 28 ++++++++++++++++----- 3 files changed, 71 insertions(+), 16 deletions(-) diff --git a/src/ESPAsyncWebServer.h b/src/ESPAsyncWebServer.h index a7c6da1..4ecdee8 100644 --- a/src/ESPAsyncWebServer.h +++ b/src/ESPAsyncWebServer.h @@ -292,9 +292,11 @@ class AsyncWebServerRequest { bool hasParam(const String& name, bool post=false, bool file=false) const; bool hasParam(const __FlashStringHelper * data, bool post=false, bool file=false) const; - AsyncWebParameter* getParam(const String& name, bool post=false, bool file=false) const; - AsyncWebParameter* getParam(const __FlashStringHelper * data, bool post, bool file) const; - AsyncWebParameter* getParam(size_t num) const; + const AsyncWebParameter* getParam(const String& name, bool post=false, bool file=false) const; +#ifdef ESP8266 + const AsyncWebParameter* getParam(const __FlashStringHelper * data, bool post, bool file) const; +#endif + const AsyncWebParameter* getParam(size_t num) const; size_t args() const { return params(); } // get arguments count const String& arg(const String& name) const; // get request argument value by name @@ -317,7 +319,7 @@ class AsyncWebServerRequest { * FILTER :: Callback to filter AsyncWebRewrite and AsyncWebHandler (done by the Server) * */ -typedef std::function ArRequestFilterFunction; +using ArRequestFilterFunction = std::function; bool ON_STA_FILTER(AsyncWebServerRequest *request); @@ -332,9 +334,9 @@ class AsyncWebRewrite { String _from; String _toUrl; String _params; - ArRequestFilterFunction _filter; + ArRequestFilterFunction _filter{nullptr}; public: - AsyncWebRewrite(const char* from, const char* to): _from(from), _toUrl(to), _params(String()), _filter(NULL){ + AsyncWebRewrite(const char* from, const char* to) : _from(from), _toUrl(to){ int index = _toUrl.indexOf('?'); if (index > 0) { _params = _toUrl.substring(index +1); @@ -427,7 +429,7 @@ typedef std::function _rewrites; + std::list > _rewrites; LinkedList _handlers; AsyncCallbackWebHandler* _catchAllHandler; @@ -444,9 +446,46 @@ class AsyncWebServer { #endif AsyncWebRewrite& addRewrite(AsyncWebRewrite* rewrite); - bool removeRewrite(AsyncWebRewrite* rewrite); + + /** + * @brief (compat) Add url rewrite rule by pointer + * a deep copy of the pounter object will be created, + * it is up to user to manage further lifetime of the object in argument + * + * @param rewrite pointer to rewrite object to copy setting from + * @return AsyncWebRewrite& reference to a newly created rewrite rule + */ + AsyncWebRewrite& addRewrite(std::shared_ptr rewrite); + + /** + * @brief add url rewrite rule + * + * @param from + * @param to + * @return AsyncWebRewrite& + */ AsyncWebRewrite& rewrite(const char* from, const char* to); + /** + * @brief (compat) remove rewrite rule via referenced object + * this will NOT deallocate pointed object itself, internal rule with same from/to urls will be removed if any + * it's a compat method, better use `removeRewrite(const char* from, const char* to)` + * @param rewrite + * @return true + * @return false + */ + bool removeRewrite(AsyncWebRewrite* rewrite); + + /** + * @brief remove rewrite rule + * + * @param from + * @param to + * @return true + * @return false + */ + bool removeRewrite(const char* from, const char* to); + AsyncWebHandler& addHandler(AsyncWebHandler* handler); bool removeHandler(AsyncWebHandler* handler); diff --git a/src/WebRequest.cpp b/src/WebRequest.cpp index 2cef4af..39d0f95 100644 --- a/src/WebRequest.cpp +++ b/src/WebRequest.cpp @@ -705,8 +705,8 @@ const AsyncWebParameter* AsyncWebServerRequest::getParam(const String& name, boo } #ifdef ESP8266 -AsyncWebParameter* AsyncWebServerRequest::getParam(const __FlashStringHelper * data, bool post, bool file) const { - return getParam(String(data).c_str(), post, file); +const AsyncWebParameter* AsyncWebServerRequest::getParam(const __FlashStringHelper * data, bool post, bool file) const { + return getParam(String(data), post, file); } #endif diff --git a/src/WebServer.cpp b/src/WebServer.cpp index 62e85b2..734e70f 100644 --- a/src/WebServer.cpp +++ b/src/WebServer.cpp @@ -37,7 +37,6 @@ const char *fs::FileOpenMode::append = "a"; AsyncWebServer::AsyncWebServer(uint16_t port) : _server(port) - , _rewrites(LinkedList([](AsyncWebRewrite* r){ delete r; })) , _handlers(LinkedList([](AsyncWebHandler* h){ delete h; })) { _catchAllHandler = new AsyncCallbackWebHandler(); @@ -62,17 +61,34 @@ AsyncWebServer::~AsyncWebServer(){ if(_catchAllHandler) delete _catchAllHandler; } +AsyncWebRewrite& AsyncWebServer::addRewrite(std::shared_ptr rewrite){ + _rewrites.emplace_back(rewrite); + return *_rewrites.back().get(); +} + + AsyncWebRewrite& AsyncWebServer::addRewrite(AsyncWebRewrite* rewrite){ - _rewrites.add(rewrite); - return *rewrite; + _rewrites.emplace_back(rewrite); + return *_rewrites.back().get(); } bool AsyncWebServer::removeRewrite(AsyncWebRewrite *rewrite){ - return _rewrites.remove(rewrite); + return removeRewrite(rewrite->from().c_str(), rewrite->toUrl().c_str()); +} + +bool AsyncWebServer::removeRewrite(const char* from, const char* to){ + for(auto r = _rewrites.begin(); r != _rewrites.end(); ++r ){ + if (r->get()->from() == from && r->get()->toUrl() == to){ + _rewrites.erase(r); + return true; + } + } + return false; } AsyncWebRewrite& AsyncWebServer::rewrite(const char* from, const char* to){ - return addRewrite(new AsyncWebRewrite(from, to)); + _rewrites.emplace_back(std::make_shared(from, to)); + return *_rewrites.back().get(); } AsyncWebHandler& AsyncWebServer::addHandler(AsyncWebHandler* handler){ @@ -186,7 +202,7 @@ void AsyncWebServer::onRequestBody(ArBodyHandlerFunction fn){ } void AsyncWebServer::reset(){ - _rewrites.free(); + _rewrites.clear(); _handlers.free(); if (_catchAllHandler != NULL){