@@ -230,25 +230,73 @@ void ESP8266WebServerTemplate<ServerType>::requestAuthentication(HTTPAuthMethod
230230}
231231
232232template <typename ServerType>
233- void ESP8266WebServerTemplate<ServerType>::on(const Uri &uri, ESP8266WebServerTemplate<ServerType>::THandlerFunction handler) {
234- on (uri, HTTP_ANY, handler);
233+ RequestHandler<ServerType>& ESP8266WebServerTemplate<ServerType>::on(const Uri &uri, ESP8266WebServerTemplate<ServerType>::THandlerFunction handler) {
234+ return on (uri, HTTP_ANY, handler);
235235}
236236
237237template <typename ServerType>
238- void ESP8266WebServerTemplate<ServerType>::on(const Uri &uri, HTTPMethod method, ESP8266WebServerTemplate<ServerType>::THandlerFunction fn) {
239- on (uri, method, fn, _fileUploadHandler);
238+ RequestHandler<ServerType>& ESP8266WebServerTemplate<ServerType>::on(const Uri &uri, HTTPMethod method, ESP8266WebServerTemplate<ServerType>::THandlerFunction fn) {
239+ return on (uri, method, fn, _fileUploadHandler);
240240}
241241
242242template <typename ServerType>
243- void ESP8266WebServerTemplate<ServerType>::on(const Uri &uri, HTTPMethod method, ESP8266WebServerTemplate<ServerType>::THandlerFunction fn, ESP8266WebServerTemplate<ServerType>::THandlerFunction ufn) {
244- _addRequestHandler (new FunctionRequestHandler<ServerType>(fn, ufn, uri, method));
243+ RequestHandler<ServerType>& ESP8266WebServerTemplate<ServerType>::on(const Uri &uri, HTTPMethod method, ESP8266WebServerTemplate<ServerType>::THandlerFunction fn, ESP8266WebServerTemplate<ServerType>::THandlerFunction ufn) {
244+ RequestHandler<ServerType> *handler = new FunctionRequestHandler<ServerType>(fn, ufn, uri, method);
245+ _addRequestHandler (handler);
246+ return *handler;
247+ }
248+
249+ template <typename ServerType>
250+ bool ESP8266WebServerTemplate<ServerType>::removeRoute(const char *uri) {
251+ return removeRoute (String (uri), HTTP_ANY);
252+ }
253+
254+ template <typename ServerType>
255+ bool ESP8266WebServerTemplate<ServerType>::removeRoute(const char *uri, HTTPMethod method) {
256+ return removeRoute (String (uri), method);
257+ }
258+
259+ template <typename ServerType>
260+ bool ESP8266WebServerTemplate<ServerType>::removeRoute(const String &uri) {
261+ return removeRoute (uri, HTTP_ANY);
262+ }
263+
264+ template <typename ServerType>
265+ bool ESP8266WebServerTemplate<ServerType>::removeRoute(const String &uri, HTTPMethod method) {
266+ bool anyHandlerRemoved = false ;
267+ RequestHandlerType *handler = _firstHandler;
268+ RequestHandlerType *previousHandler = nullptr ;
269+
270+ while (handler) {
271+ if (handler->canHandle (method, uri)) {
272+ if (_removeRequestHandler (handler)) {
273+ anyHandlerRemoved = true ;
274+ // Move to the next handler
275+ if (previousHandler) {
276+ handler = previousHandler->next ();
277+ } else {
278+ handler = _firstHandler;
279+ }
280+ continue ;
281+ }
282+ }
283+ previousHandler = handler;
284+ handler = handler->next ();
285+ }
286+
287+ return anyHandlerRemoved;
245288}
246289
247290template <typename ServerType>
248291void ESP8266WebServerTemplate<ServerType>::addHandler(RequestHandlerType* handler) {
249292 _addRequestHandler (handler);
250293}
251294
295+ template <typename ServerType>
296+ bool ESP8266WebServerTemplate<ServerType>::removeHandler(RequestHandlerType *handler) {
297+ return _removeRequestHandler (handler);
298+ }
299+
252300template <typename ServerType>
253301void ESP8266WebServerTemplate<ServerType>::_addRequestHandler(RequestHandlerType* handler) {
254302 if (!_lastHandler) {
@@ -261,6 +309,33 @@ void ESP8266WebServerTemplate<ServerType>::_addRequestHandler(RequestHandlerType
261309 }
262310}
263311
312+ template <typename ServerType>
313+ bool ESP8266WebServerTemplate<ServerType>::_removeRequestHandler(RequestHandlerType *handler) {
314+ RequestHandlerType *current = _firstHandler;
315+ RequestHandlerType *previous = nullptr ;
316+
317+ while (current != nullptr ) {
318+ if (current == handler) {
319+ if (previous == nullptr ) {
320+ _firstHandler = current->next ();
321+ } else {
322+ previous->next (current->next ());
323+ }
324+
325+ if (current == _lastHandler) {
326+ _lastHandler = previous;
327+ }
328+
329+ // Delete 'matching' handler
330+ delete current;
331+ return true ;
332+ }
333+ previous = current;
334+ current = current->next ();
335+ }
336+ return false ;
337+ }
338+
264339template <typename ServerType>
265340void ESP8266WebServerTemplate<ServerType>::serveStatic(const char * uri, FS& fs, const char * path, const char * cache_header) {
266341 bool is_file = false ;
0 commit comments