diff --git a/esphome/components/web_server/ota/ota_web_server.cpp b/esphome/components/web_server/ota/ota_web_server.cpp index 9812714ec0..95763e2daf 100644 --- a/esphome/components/web_server/ota/ota_web_server.cpp +++ b/esphome/components/web_server/ota/ota_web_server.cpp @@ -249,7 +249,7 @@ void WebServerOTAComponent::setup() { return; } - // AsyncWebServer takes ownership of the handler and will delete it when the server is destroyed + // The handler lives for the life of the process; WebServerBase never destroys its server base->add_handler(new OTARequestHandler(this)); // NOLINT } diff --git a/esphome/components/web_server_base/web_server_base.h b/esphome/components/web_server_base/web_server_base.h index e7e02a695e..94579de70f 100644 --- a/esphome/components/web_server_base/web_server_base.h +++ b/esphome/components/web_server_base/web_server_base.h @@ -112,11 +112,16 @@ class AuthMiddlewareHandler : public MiddlewareHandler { class WebServerBase final { public: + // The AsyncWebServer is created once and intentionally never deleted: on Arduino + // platforms ESPAsyncWebServer owns its registered handlers, so destroying it would + // also destroy live components (e.g. the captive portal) out from under us. + // init()/deinit() refcount users and start/stop the listener; handlers are + // registered once at creation and survive listener restarts. void init() { this->initialized_++; if (this->server_ != nullptr) { if (this->initialized_ == 1) { - // Restart the listener after a previous deinit(); handlers are still registered. + // Restart the listener after a previous deinit() this->server_->begin(); } return; @@ -132,11 +137,10 @@ class WebServerBase final { this->server_->addHandler(handler); } void deinit() { + if (this->initialized_ == 0) + return; // unbalanced deinit() this->initialized_--; - if (this->initialized_ == 0 && this->server_ != nullptr) { - // Stop listening but never delete the server: on Arduino platforms - // ESPAsyncWebServer owns its handlers, so deleting it would delete - // registered components (e.g. the captive portal) out from under us. + if (this->initialized_ == 0) { this->server_->end(); } }