@@ -230,25 +230,73 @@ void ESP8266WebServerTemplate<ServerType>::requestAuthentication(HTTPAuthMethod
230
230
}
231
231
232
232
template <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);
235
235
}
236
236
237
237
template <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);
240
240
}
241
241
242
242
template <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;
245
288
}
246
289
247
290
template <typename ServerType>
248
291
void ESP8266WebServerTemplate<ServerType>::addHandler(RequestHandlerType* handler) {
249
292
_addRequestHandler (handler);
250
293
}
251
294
295
+ template <typename ServerType>
296
+ bool ESP8266WebServerTemplate<ServerType>::removeHandler(RequestHandlerType *handler) {
297
+ return _removeRequestHandler (handler);
298
+ }
299
+
252
300
template <typename ServerType>
253
301
void ESP8266WebServerTemplate<ServerType>::_addRequestHandler(RequestHandlerType* handler) {
254
302
if (!_lastHandler) {
@@ -261,6 +309,33 @@ void ESP8266WebServerTemplate<ServerType>::_addRequestHandler(RequestHandlerType
261
309
}
262
310
}
263
311
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
+
264
339
template <typename ServerType>
265
340
void ESP8266WebServerTemplate<ServerType>::serveStatic(const char * uri, FS& fs, const char * path, const char * cache_header) {
266
341
bool is_file = false ;
0 commit comments