ESPHome 2026.1.0-dev
Loading...
Searching...
No Matches
web_server_base.h
Go to the documentation of this file.
1#pragma once
3#ifdef USE_NETWORK
4#include <memory>
5#include <utility>
6#include <vector>
7
10
11#if USE_ESP32
12#include "esphome/core/hal.h"
14#else
15#include <ESPAsyncWebServer.h>
16#endif
17
18#if USE_ESP32
19using PlatformString = std::string;
20#elif USE_ARDUINO
21using PlatformString = String;
22#endif
23
24namespace esphome {
25namespace web_server_base {
26
27class WebServerBase;
28extern WebServerBase *global_web_server_base; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
29
30namespace internal {
31
32class MiddlewareHandler : public AsyncWebHandler {
33 public:
34 MiddlewareHandler(AsyncWebHandler *next) : next_(next) {}
35
36 bool canHandle(AsyncWebServerRequest *request) const override { return next_->canHandle(request); }
37 void handleRequest(AsyncWebServerRequest *request) override { next_->handleRequest(request); }
38 void handleUpload(AsyncWebServerRequest *request, const PlatformString &filename, size_t index, uint8_t *data,
39 size_t len, bool final) override {
40 next_->handleUpload(request, filename, index, data, len, final);
41 }
42 void handleBody(AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total) override {
43 next_->handleBody(request, data, len, index, total);
44 }
45 bool isRequestHandlerTrivial() const override { return next_->isRequestHandlerTrivial(); }
46
47 protected:
48 AsyncWebHandler *next_;
49};
50
51#ifdef USE_WEBSERVER_AUTH
53 std::string username;
54 std::string password;
55};
56
58 public:
59 AuthMiddlewareHandler(AsyncWebHandler *next, Credentials *credentials)
60 : MiddlewareHandler(next), credentials_(credentials) {}
61
62 bool check_auth(AsyncWebServerRequest *request) {
63 bool success = request->authenticate(credentials_->username.c_str(), credentials_->password.c_str());
64 if (!success) {
65 request->requestAuthentication();
66 }
67 return success;
68 }
69
70 void handleRequest(AsyncWebServerRequest *request) override {
71 if (!check_auth(request))
72 return;
74 }
75 void handleUpload(AsyncWebServerRequest *request, const PlatformString &filename, size_t index, uint8_t *data,
76 size_t len, bool final) override {
77 if (!check_auth(request))
78 return;
79 MiddlewareHandler::handleUpload(request, filename, index, data, len, final);
80 }
81 void handleBody(AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total) override {
82 if (!check_auth(request))
83 return;
84 MiddlewareHandler::handleBody(request, data, len, index, total);
85 }
86
87 protected:
89};
90#endif
91
92} // namespace internal
93
94class WebServerBase : public Component {
95 public:
96 void init() {
97 if (this->initialized_) {
98 this->initialized_++;
99 return;
100 }
101 this->server_ = std::make_unique<AsyncWebServer>(this->port_);
102 // All content is controlled and created by user - so allowing all origins is fine here.
103 DefaultHeaders::Instance().addHeader(ESPHOME_F("Access-Control-Allow-Origin"), ESPHOME_F("*"));
104 this->server_->begin();
105
106 for (auto *handler : this->handlers_)
107 this->server_->addHandler(handler);
108
109 this->initialized_++;
110 }
111 void deinit() {
112 this->initialized_--;
113 if (this->initialized_ == 0) {
114 this->server_ = nullptr;
115 }
116 }
117 AsyncWebServer *get_server() const { return this->server_.get(); }
118 float get_setup_priority() const override;
119
120#ifdef USE_WEBSERVER_AUTH
121 void set_auth_username(std::string auth_username) { credentials_.username = std::move(auth_username); }
122 void set_auth_password(std::string auth_password) { credentials_.password = std::move(auth_password); }
123#endif
124
125 void add_handler(AsyncWebHandler *handler);
126
127 void set_port(uint16_t port) { port_ = port; }
128 uint16_t get_port() const { return port_; }
129
130 protected:
132 uint16_t port_{80};
133 std::unique_ptr<AsyncWebServer> server_{nullptr};
134 std::vector<AsyncWebHandler *> handlers_;
135#ifdef USE_WEBSERVER_AUTH
137#endif
138};
139
140} // namespace web_server_base
141} // namespace esphome
142#endif
void set_auth_password(std::string auth_password)
std::unique_ptr< AsyncWebServer > server_
void set_auth_username(std::string auth_username)
void add_handler(AsyncWebHandler *handler)
std::vector< AsyncWebHandler * > handlers_
void handleUpload(AsyncWebServerRequest *request, const PlatformString &filename, size_t index, uint8_t *data, size_t len, bool final) override
void handleRequest(AsyncWebServerRequest *request) override
AuthMiddlewareHandler(AsyncWebHandler *next, Credentials *credentials)
void handleBody(AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total) override
bool canHandle(AsyncWebServerRequest *request) const override
void handleUpload(AsyncWebServerRequest *request, const PlatformString &filename, size_t index, uint8_t *data, size_t len, bool final) override
void handleRequest(AsyncWebServerRequest *request) override
void handleBody(AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total) override
WebServerBase * global_web_server_base
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7
std::string size_t len
Definition helpers.h:533
std::string PlatformString