1
0
mirror of https://github.com/esphome/esphome.git synced 2025-10-07 20:33:47 +01:00

always use idf webserver on esp32

This commit is contained in:
J. Nick Koston
2025-10-02 21:19:45 -05:00
parent f2aa5a754c
commit d8fe655285
15 changed files with 69 additions and 57 deletions

View File

@@ -9,13 +9,12 @@
namespace esphome { namespace esphome {
namespace web_server { namespace web_server {
#ifdef USE_ARDUINO #ifdef USE_ESP32
ListEntitiesIterator::ListEntitiesIterator(const WebServer *ws, AsyncEventSource *es) : web_server_(ws), events_(es) {}
#elif USE_ARDUINO
ListEntitiesIterator::ListEntitiesIterator(const WebServer *ws, DeferredUpdateEventSource *es) ListEntitiesIterator::ListEntitiesIterator(const WebServer *ws, DeferredUpdateEventSource *es)
: web_server_(ws), events_(es) {} : web_server_(ws), events_(es) {}
#endif #endif
#ifdef USE_ESP_IDF
ListEntitiesIterator::ListEntitiesIterator(const WebServer *ws, AsyncEventSource *es) : web_server_(ws), events_(es) {}
#endif
ListEntitiesIterator::~ListEntitiesIterator() {} ListEntitiesIterator::~ListEntitiesIterator() {}
#ifdef USE_BINARY_SENSOR #ifdef USE_BINARY_SENSOR

View File

@@ -5,25 +5,24 @@
#include "esphome/core/component.h" #include "esphome/core/component.h"
#include "esphome/core/component_iterator.h" #include "esphome/core/component_iterator.h"
namespace esphome { namespace esphome {
#ifdef USE_ESP_IDF #ifdef USE_ESP32
namespace web_server_idf { namespace web_server_idf {
class AsyncEventSource; class AsyncEventSource;
} }
#endif #endif
namespace web_server { namespace web_server {
#ifdef USE_ARDUINO #if !defined(USE_ESP32) && defined(USE_ARDUINO)
class DeferredUpdateEventSource; class DeferredUpdateEventSource;
#endif #endif
class WebServer; class WebServer;
class ListEntitiesIterator : public ComponentIterator { class ListEntitiesIterator : public ComponentIterator {
public: public:
#ifdef USE_ARDUINO #ifdef USE_ESP32
ListEntitiesIterator(const WebServer *ws, DeferredUpdateEventSource *es);
#endif
#ifdef USE_ESP_IDF
ListEntitiesIterator(const WebServer *ws, esphome::web_server_idf::AsyncEventSource *es); ListEntitiesIterator(const WebServer *ws, esphome::web_server_idf::AsyncEventSource *es);
#elif defined(USE_ARDUINO)
ListEntitiesIterator(const WebServer *ws, DeferredUpdateEventSource *es);
#endif #endif
virtual ~ListEntitiesIterator(); virtual ~ListEntitiesIterator();
#ifdef USE_BINARY_SENSOR #ifdef USE_BINARY_SENSOR
@@ -90,11 +89,10 @@ class ListEntitiesIterator : public ComponentIterator {
protected: protected:
const WebServer *web_server_; const WebServer *web_server_;
#ifdef USE_ARDUINO #ifdef USE_ESP32
DeferredUpdateEventSource *events_;
#endif
#ifdef USE_ESP_IDF
esphome::web_server_idf::AsyncEventSource *events_; esphome::web_server_idf::AsyncEventSource *events_;
#elif USE_ARDUINO
DeferredUpdateEventSource *events_;
#endif #endif
}; };

View File

@@ -29,5 +29,5 @@ async def to_code(config):
await ota_to_code(var, config) await ota_to_code(var, config)
await cg.register_component(var, config) await cg.register_component(var, config)
cg.add_define("USE_WEBSERVER_OTA") cg.add_define("USE_WEBSERVER_OTA")
if CORE.using_esp_idf: if CORE.is_esp32:
add_idf_component(name="zorxx/multipart-parser", ref="1.0.1") add_idf_component(name="zorxx/multipart-parser", ref="1.0.1")

View File

@@ -17,6 +17,12 @@
#endif #endif
#endif // USE_ARDUINO #endif // USE_ARDUINO
#if USE_ESP32
using PlatformString = std::string;
#elif USE_ARDUINO
using PlatformString = String;
#endif
namespace esphome { namespace esphome {
namespace web_server { namespace web_server {
@@ -26,8 +32,8 @@ class OTARequestHandler : public AsyncWebHandler {
public: public:
OTARequestHandler(WebServerOTAComponent *parent) : parent_(parent) {} OTARequestHandler(WebServerOTAComponent *parent) : parent_(parent) {}
void handleRequest(AsyncWebServerRequest *request) override; void handleRequest(AsyncWebServerRequest *request) override;
void handleUpload(AsyncWebServerRequest *request, const String &filename, size_t index, uint8_t *data, size_t len, void handleUpload(AsyncWebServerRequest *request, const PlatformString &filename, size_t index, uint8_t *data,
bool final) override; size_t len, bool final) override;
bool canHandle(AsyncWebServerRequest *request) const override { bool canHandle(AsyncWebServerRequest *request) const override {
// Check if this is an OTA update request // Check if this is an OTA update request
bool is_ota_request = request->url() == "/update" && request->method() == HTTP_POST; bool is_ota_request = request->url() == "/update" && request->method() == HTTP_POST;
@@ -100,7 +106,7 @@ void OTARequestHandler::ota_init_(const char *filename) {
this->ota_success_ = false; this->ota_success_ = false;
} }
void OTARequestHandler::handleUpload(AsyncWebServerRequest *request, const String &filename, size_t index, void OTARequestHandler::handleUpload(AsyncWebServerRequest *request, const PlatformString &filename, size_t index,
uint8_t *data, size_t len, bool final) { uint8_t *data, size_t len, bool final) {
ota::OTAResponseTypes error_code = ota::OTA_RESPONSE_OK; ota::OTAResponseTypes error_code = ota::OTA_RESPONSE_OK;

View File

@@ -8,7 +8,7 @@
#include "esphome/core/log.h" #include "esphome/core/log.h"
#include "esphome/core/util.h" #include "esphome/core/util.h"
#ifdef USE_ARDUINO #if !defined(USE_ESP32) && defined(USE_ARDUINO)
#include "StreamString.h" #include "StreamString.h"
#endif #endif
@@ -103,7 +103,7 @@ static UrlMatch match_url(const char *url_ptr, size_t url_len, bool only_domain)
return match; return match;
} }
#ifdef USE_ARDUINO #if !defined(USE_ESP32) && defined(USE_ARDUINO)
// helper for allowing only unique entries in the queue // helper for allowing only unique entries in the queue
void DeferredUpdateEventSource::deq_push_back_with_dedup_(void *source, message_generator_t *message_generator) { void DeferredUpdateEventSource::deq_push_back_with_dedup_(void *source, message_generator_t *message_generator) {
DeferredEvent item(source, message_generator); DeferredEvent item(source, message_generator);
@@ -297,7 +297,7 @@ void WebServer::setup() {
} }
#endif #endif
#ifdef USE_ESP_IDF #ifdef USE_ESP32
this->base_->add_handler(&this->events_); this->base_->add_handler(&this->events_);
#endif #endif
this->base_->add_handler(this); this->base_->add_handler(this);
@@ -1771,7 +1771,7 @@ bool WebServer::canHandle(AsyncWebServerRequest *request) const {
// Static URL checks // Static URL checks
static const char *const STATIC_URLS[] = { static const char *const STATIC_URLS[] = {
"/", "/",
#ifdef USE_ARDUINO #if !defined(USE_ESP32) && defined(USE_ARDUINO)
"/events", "/events",
#endif #endif
#ifdef USE_WEBSERVER_CSS_INCLUDE #ifdef USE_WEBSERVER_CSS_INCLUDE
@@ -1899,7 +1899,7 @@ void WebServer::handleRequest(AsyncWebServerRequest *request) {
return; return;
} }
#ifdef USE_ARDUINO #if !defined(USE_ESP32) && defined(USE_ARDUINO)
if (url == "/events") { if (url == "/events") {
this->events_.add_new_client(this, request); this->events_.add_new_client(this, request);
return; return;

View File

@@ -81,7 +81,7 @@ enum JsonDetail { DETAIL_ALL, DETAIL_STATE };
implemented in a more straightforward way for ESP-IDF. Arduino platform will eventually go away and this workaround implemented in a more straightforward way for ESP-IDF. Arduino platform will eventually go away and this workaround
can be forgotten. can be forgotten.
*/ */
#ifdef USE_ARDUINO #if !defined(USE_ESP32) && defined(USE_ARDUINO)
using message_generator_t = std::string(WebServer *, void *); using message_generator_t = std::string(WebServer *, void *);
class DeferredUpdateEventSourceList; class DeferredUpdateEventSourceList;
@@ -164,7 +164,7 @@ class DeferredUpdateEventSourceList : public std::list<DeferredUpdateEventSource
* can be found under https://esphome.io/web-api/index.html. * can be found under https://esphome.io/web-api/index.html.
*/ */
class WebServer : public Controller, public Component, public AsyncWebHandler { class WebServer : public Controller, public Component, public AsyncWebHandler {
#ifdef USE_ARDUINO #if !defined(USE_ESP32) && defined(USE_ARDUINO)
friend class DeferredUpdateEventSourceList; friend class DeferredUpdateEventSourceList;
#endif #endif
@@ -559,11 +559,10 @@ class WebServer : public Controller, public Component, public AsyncWebHandler {
} }
web_server_base::WebServerBase *base_; web_server_base::WebServerBase *base_;
#ifdef USE_ARDUINO #ifdef USE_ESP32
DeferredUpdateEventSourceList events_;
#endif
#ifdef USE_ESP_IDF
AsyncEventSource events_{"/events", this}; AsyncEventSource events_{"/events", this};
#elif USE_ARDUINO
DeferredUpdateEventSourceList events_;
#endif #endif
#if USE_WEBSERVER_VERSION == 1 #if USE_WEBSERVER_VERSION == 1

View File

@@ -9,10 +9,10 @@ DEPENDENCIES = ["network"]
def AUTO_LOAD(): def AUTO_LOAD():
if CORE.is_esp32:
return ["web_server_idf"]
if CORE.using_arduino: if CORE.using_arduino:
return ["async_tcp"] return ["async_tcp"]
if CORE.using_esp_idf:
return ["web_server_idf"]
return [] return []
@@ -33,6 +33,9 @@ async def to_code(config):
await cg.register_component(var, config) await cg.register_component(var, config)
cg.add(cg.RawExpression(f"{web_server_base_ns}::global_web_server_base = {var}")) cg.add(cg.RawExpression(f"{web_server_base_ns}::global_web_server_base = {var}"))
if CORE.is_esp32:
return
if CORE.using_arduino: if CORE.using_arduino:
if CORE.is_esp32: if CORE.is_esp32:
cg.add_library("WiFi", None) cg.add_library("WiFi", None)

View File

@@ -7,11 +7,17 @@
#include "esphome/core/component.h" #include "esphome/core/component.h"
#ifdef USE_ARDUINO #if USE_ESP32
#include <ESPAsyncWebServer.h>
#elif USE_ESP_IDF
#include "esphome/core/hal.h" #include "esphome/core/hal.h"
#include "esphome/components/web_server_idf/web_server_idf.h" #include "esphome/components/web_server_idf/web_server_idf.h"
#elif USE_ARDUINO
#include <ESPAsyncWebServer.h>
#endif
#if USE_ESP32
using PlatformString = std::string;
#elif USE_ARDUINO
using PlatformString = String;
#endif #endif
namespace esphome { namespace esphome {
@@ -28,8 +34,8 @@ class MiddlewareHandler : public AsyncWebHandler {
bool canHandle(AsyncWebServerRequest *request) const override { return next_->canHandle(request); } bool canHandle(AsyncWebServerRequest *request) const override { return next_->canHandle(request); }
void handleRequest(AsyncWebServerRequest *request) override { next_->handleRequest(request); } void handleRequest(AsyncWebServerRequest *request) override { next_->handleRequest(request); }
void handleUpload(AsyncWebServerRequest *request, const String &filename, size_t index, uint8_t *data, size_t len, void handleUpload(AsyncWebServerRequest *request, const PlatformString &filename, size_t index, uint8_t *data,
bool final) override { size_t len, bool final) override {
next_->handleUpload(request, filename, index, data, len, final); next_->handleUpload(request, filename, index, data, len, final);
} }
void handleBody(AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total) override { void handleBody(AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total) override {
@@ -65,8 +71,8 @@ class AuthMiddlewareHandler : public MiddlewareHandler {
return; return;
MiddlewareHandler::handleRequest(request); MiddlewareHandler::handleRequest(request);
} }
void handleUpload(AsyncWebServerRequest *request, const String &filename, size_t index, uint8_t *data, size_t len, void handleUpload(AsyncWebServerRequest *request, const PlatformString &filename, size_t index, uint8_t *data,
bool final) override { size_t len, bool final) override {
if (!check_auth(request)) if (!check_auth(request))
return; return;
MiddlewareHandler::handleUpload(request, filename, index, data, len, final); MiddlewareHandler::handleUpload(request, filename, index, data, len, final);

View File

@@ -5,7 +5,7 @@ CODEOWNERS = ["@dentra"]
CONFIG_SCHEMA = cv.All( CONFIG_SCHEMA = cv.All(
cv.Schema({}), cv.Schema({}),
cv.only_with_esp_idf, cv.only_on_esp32,
) )

View File

@@ -1,5 +1,5 @@
#include "esphome/core/defines.h" #include "esphome/core/defines.h"
#if defined(USE_ESP_IDF) && defined(USE_WEBSERVER_OTA) #if defined(USE_ESP32) && defined(USE_WEBSERVER_OTA)
#include "multipart.h" #include "multipart.h"
#include "utils.h" #include "utils.h"
#include "esphome/core/log.h" #include "esphome/core/log.h"
@@ -251,4 +251,4 @@ std::string str_trim(const std::string &str) {
} // namespace web_server_idf } // namespace web_server_idf
} // namespace esphome } // namespace esphome
#endif // defined(USE_ESP_IDF) && defined(USE_WEBSERVER_OTA) #endif // defined(USE_ESP32) && defined(USE_WEBSERVER_OTA)

View File

@@ -1,6 +1,6 @@
#pragma once #pragma once
#include "esphome/core/defines.h" #include "esphome/core/defines.h"
#if defined(USE_ESP_IDF) && defined(USE_WEBSERVER_OTA) #if defined(USE_ESP32) && defined(USE_WEBSERVER_OTA)
#include <cctype> #include <cctype>
#include <cstring> #include <cstring>
@@ -83,4 +83,4 @@ std::string str_trim(const std::string &str);
} // namespace web_server_idf } // namespace web_server_idf
} // namespace esphome } // namespace esphome
#endif // defined(USE_ESP_IDF) && defined(USE_WEBSERVER_OTA) #endif // defined(USE_ESP32) && defined(USE_WEBSERVER_OTA)

View File

@@ -1,4 +1,4 @@
#ifdef USE_ESP_IDF #ifdef USE_ESP32
#include <memory> #include <memory>
#include <cstring> #include <cstring>
#include <cctype> #include <cctype>
@@ -122,4 +122,4 @@ const char *stristr(const char *haystack, const char *needle) {
} // namespace web_server_idf } // namespace web_server_idf
} // namespace esphome } // namespace esphome
#endif // USE_ESP_IDF #endif // USE_ESP32

View File

@@ -1,5 +1,5 @@
#pragma once #pragma once
#ifdef USE_ESP_IDF #ifdef USE_ESP32
#include <esp_http_server.h> #include <esp_http_server.h>
#include <string> #include <string>
@@ -24,4 +24,4 @@ const char *stristr(const char *haystack, const char *needle);
} // namespace web_server_idf } // namespace web_server_idf
} // namespace esphome } // namespace esphome
#endif // USE_ESP_IDF #endif // USE_ESP32

View File

@@ -1,4 +1,4 @@
#ifdef USE_ESP_IDF #ifdef USE_ESP32
#include <cstdarg> #include <cstdarg>
#include <memory> #include <memory>
@@ -670,4 +670,4 @@ esp_err_t AsyncWebServer::handle_multipart_upload_(httpd_req_t *r, const char *c
} // namespace web_server_idf } // namespace web_server_idf
} // namespace esphome } // namespace esphome
#endif // !defined(USE_ESP_IDF) #endif // !defined(USE_ESP32)

View File

@@ -1,5 +1,5 @@
#pragma once #pragma once
#ifdef USE_ESP_IDF #ifdef USE_ESP32
#include "esphome/core/defines.h" #include "esphome/core/defines.h"
#include <esp_http_server.h> #include <esp_http_server.h>
@@ -22,11 +22,12 @@ class ListEntitiesIterator;
#endif #endif
namespace web_server_idf { namespace web_server_idf {
#ifndef USE_ARDUINO
using String = std::string;
#define F(string_literal) (string_literal) #define F(string_literal) (string_literal)
#define PGM_P const char * #define PGM_P const char *
#define strncpy_P strncpy #define strncpy_P strncpy
#endif
using String = std::string;
class AsyncWebParameter { class AsyncWebParameter {
public: public:
@@ -341,4 +342,4 @@ class DefaultHeaders {
using namespace esphome::web_server_idf; // NOLINT(google-global-names-in-headers) using namespace esphome::web_server_idf; // NOLINT(google-global-names-in-headers)
#endif // !defined(USE_ESP_IDF) #endif // !defined(USE_ESP32)