ESPHome 2025.11.0b4
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#ifdef USE_ARDUINO
6#include <DNSServer.h>
7#endif
8#ifdef USE_ESP_IDF
10#endif
15
16namespace esphome {
17
18namespace captive_portal {
19
20class CaptivePortal : public AsyncWebHandler, public Component {
21 public:
23 void setup() override;
24 void dump_config() override;
25 void loop() override {
26#ifdef USE_ARDUINO
27 if (this->dns_server_ != nullptr) {
28 this->dns_server_->processNextRequest();
29 }
30#endif
31#ifdef USE_ESP_IDF
32 if (this->dns_server_ != nullptr) {
33 this->dns_server_->process_next_request();
34 }
35#endif
36 }
37 float get_setup_priority() const override;
38 void start();
39 bool is_active() const { return this->active_; }
40 void end() {
41 this->active_ = false;
42 this->disable_loop(); // Stop processing DNS requests
43#ifdef USE_ESP32
44 // Disable LRU socket purging now that captive portal is done
45 this->base_->get_server()->set_lru_purge_enable(false);
46#endif
47 this->base_->deinit();
48 if (this->dns_server_ != nullptr) {
49 this->dns_server_->stop();
50 this->dns_server_ = nullptr;
51 }
52 }
53
54 bool canHandle(AsyncWebServerRequest *request) const override {
55 // Handle all GET requests when captive portal is active
56 // This allows us to respond with the portal page for any URL,
57 // triggering OS captive portal detection
58 return this->active_ && request->method() == HTTP_GET;
59 }
60
61 void handle_config(AsyncWebServerRequest *request);
62
63 void handle_wifisave(AsyncWebServerRequest *request);
64
65 void handleRequest(AsyncWebServerRequest *req) override;
66
67 protected:
69 bool initialized_{false};
70 bool active_{false};
71#if defined(USE_ARDUINO) || defined(USE_ESP_IDF)
72 std::unique_ptr<DNSServer> dns_server_{nullptr};
73#endif
74};
75
76extern CaptivePortal *global_captive_portal; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
77
78} // namespace captive_portal
79} // namespace esphome
80#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)
std::shared_ptr< AsyncWebServer > get_server() const
CaptivePortal * global_captive_portal
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7