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