ESPHome 2026.5.0
Loading...
Searching...
No Matches
captive_portal.h
Go to the documentation of this file.
1#pragma once
3#ifdef USE_CAPTIVE_PORTAL
4#include <memory>
5#if defined(USE_ESP32)
7#elif defined(USE_ARDUINO)
8#include <DNSServer.h>
9#endif
14
16
17class CaptivePortal : public AsyncWebHandler, public Component {
18 public:
20 void setup() override;
21 void dump_config() override;
22 void loop() override {
23#if defined(USE_ESP32)
24 if (this->dns_server_ != nullptr) {
25 this->dns_server_->process_next_request();
26 }
27#elif defined(USE_ARDUINO)
28 if (this->dns_server_ != nullptr) {
29 this->dns_server_->processNextRequest();
30 }
31#endif
32 }
33 float get_setup_priority() const override;
34 void start();
35 bool is_active() const { return this->active_; }
36 void end() {
37 this->active_ = false;
38 this->disable_loop(); // Stop processing DNS requests
39 this->base_->deinit();
40 if (this->dns_server_ != nullptr) {
41 this->dns_server_->stop();
42 this->dns_server_ = nullptr;
43 }
44 }
45
46 bool canHandle(AsyncWebServerRequest *request) const override {
47 // Handle all GET requests when captive portal is active
48 // This allows us to respond with the portal page for any URL,
49 // triggering OS captive portal detection
50 return this->active_ && request->method() == HTTP_GET;
51 }
52
53 void handle_config(AsyncWebServerRequest *request);
54
55 void handle_wifisave(AsyncWebServerRequest *request);
56
57 void handleRequest(AsyncWebServerRequest *req) override;
58
59 protected:
61 bool initialized_{false};
62 bool active_{false};
63#if defined(USE_ARDUINO) || defined(USE_ESP32)
64 std::unique_ptr<DNSServer> dns_server_{nullptr};
65#endif
66};
67
68extern CaptivePortal *global_captive_portal; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
69
70} // namespace esphome::captive_portal
71
72#endif
void disable_loop()
Disable this component's loop.
bool canHandle(AsyncWebServerRequest *request) const override
std::unique_ptr< DNSServer > dns_server_
CaptivePortal(web_server_base::WebServerBase *base)
void handle_config(AsyncWebServerRequest *request)
web_server_base::WebServerBase * base_
void handleRequest(AsyncWebServerRequest *req) override
void handle_wifisave(AsyncWebServerRequest *request)
CaptivePortal * global_captive_portal