ESPHome 2026.3.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 <utility>
5#include <vector>
6
8
9#if USE_ESP32
10#include "esphome/core/hal.h"
12#else
13#include <ESPAsyncWebServer.h>
14#endif
15
16#if USE_ESP32
17using PlatformString = std::string;
18#elif USE_ARDUINO
19using PlatformString = String;
20#endif
21
23
24class WebServerBase;
25extern WebServerBase *global_web_server_base; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
26
27namespace internal {
28
29class MiddlewareHandler : public AsyncWebHandler {
30 public:
31 MiddlewareHandler(AsyncWebHandler *next) : next_(next) {}
32
33 bool canHandle(AsyncWebServerRequest *request) const override { return next_->canHandle(request); }
34 void handleRequest(AsyncWebServerRequest *request) override { next_->handleRequest(request); }
35 void handleUpload(AsyncWebServerRequest *request, const PlatformString &filename, size_t index, uint8_t *data,
36 size_t len, bool final) override {
37 next_->handleUpload(request, filename, index, data, len, final);
38 }
39 void handleBody(AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total) override {
40 next_->handleBody(request, data, len, index, total);
41 }
42 bool isRequestHandlerTrivial() const override { return next_->isRequestHandlerTrivial(); }
43
44 protected:
45 AsyncWebHandler *next_;
46};
47
48#ifdef USE_WEBSERVER_AUTH
50 std::string username;
51 std::string password;
52};
53
55 public:
56 AuthMiddlewareHandler(AsyncWebHandler *next, Credentials *credentials)
57 : MiddlewareHandler(next), credentials_(credentials) {}
58
59 bool check_auth(AsyncWebServerRequest *request) {
60 bool success = request->authenticate(credentials_->username.c_str(), credentials_->password.c_str());
61 if (!success) {
62 request->requestAuthentication();
63 }
64 return success;
65 }
66
67 void handleRequest(AsyncWebServerRequest *request) override {
68 if (!check_auth(request))
69 return;
71 }
72 void handleUpload(AsyncWebServerRequest *request, const PlatformString &filename, size_t index, uint8_t *data,
73 size_t len, bool final) override {
74 if (!check_auth(request))
75 return;
76 MiddlewareHandler::handleUpload(request, filename, index, data, len, final);
77 }
78 void handleBody(AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total) override {
79 if (!check_auth(request))
80 return;
81 MiddlewareHandler::handleBody(request, data, len, index, total);
82 }
83
84 protected:
86};
87#endif
88
89} // namespace internal
90
92 public:
93 void init() {
94 if (this->initialized_) {
95 this->initialized_++;
96 return;
97 }
98 this->server_ = new AsyncWebServer(this->port_);
99 // All content is controlled and created by user - so allowing all origins is fine here.
100 // NOTE: Currently 1 header. If more are added, update in __init__.py:
101 // cg.add_define("WEB_SERVER_DEFAULT_HEADERS_COUNT", 1)
102 DefaultHeaders::Instance().addHeader(ESPHOME_F("Access-Control-Allow-Origin"), ESPHOME_F("*"));
103 this->server_->begin();
104
105 for (auto *handler : this->handlers_)
106 this->server_->addHandler(handler);
107
108 this->initialized_++;
109 }
110 void deinit() {
111 this->initialized_--;
112 if (this->initialized_ == 0) {
113 delete this->server_;
114 this->server_ = nullptr;
115 }
116 }
117 AsyncWebServer *get_server() const { return this->server_; }
118
119#ifdef USE_WEBSERVER_AUTH
120 void set_auth_username(std::string auth_username) { credentials_.username = std::move(auth_username); }
121 void set_auth_password(std::string auth_password) { credentials_.password = std::move(auth_password); }
122#endif
123
124 void add_handler(AsyncWebHandler *handler);
125
126 void set_port(uint16_t port) { port_ = port; }
127 uint16_t get_port() const { return port_; }
128
129 protected:
131 uint16_t port_{80};
132 AsyncWebServer *server_{nullptr};
133 std::vector<AsyncWebHandler *> handlers_;
134#ifdef USE_WEBSERVER_AUTH
136#endif
137};
138
139} // namespace esphome::web_server_base
140#endif
void set_auth_password(std::string auth_password)
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
std::string size_t len
Definition helpers.h:817
std::string PlatformString