7#include <esp_http_server.h>
32namespace web_server_idf {
37 const std::string &
name()
const {
return this->
name_; }
53 void addHeader(
const char *name,
const char *value);
91 void print(
float value);
93 void write(uint8_t c) { this->
content_.push_back(
static_cast<char>(c)); }
118 http_method
method()
const {
return static_cast<http_method
>(this->
req_->method); }
126#ifdef USE_WEBSERVER_AUTH
127 bool authenticate(
const char *username,
const char *password)
const;
138 inline void ESPHOME_ALWAYS_INLINE
send(
int code,
const char *content_type =
nullptr,
const char *content =
nullptr) {
141 httpd_resp_send(*
this, content, HTTPD_RESP_USE_STRLEN);
143 httpd_resp_send(*
this,
nullptr, 0);
160 const size_t data_size) {
182 bool hasArg(
const char *name);
183 std::string
arg(
const char *name);
184 std::string
arg(
const std::string &name) {
return this->
arg(name.c_str()); }
186#ifdef USE_WEBSERVER_OTA
192 operator httpd_req_t *()
const {
return this->
req_; }
193 optional<std::string>
get_header(
const char *name)
const;
207#ifdef USE_WEBSERVER_OTA
244#ifdef USE_WEBSERVER_OTA
260 size_t len,
bool final) {}
296 "DeferredEvent should have no padding");
329 bool stash_chunk_(
const char *prefix,
size_t prefix_len,
const char *
message,
size_t message_len,
size_t total,
359 bool owns_session_(
int fd)
const {
return fd != 0 && httpd_sess_get_ctx(this->
hd_, fd) ==
this; }
421 if (request->
method() != HTTP_GET)
424 return request->
url_to(url_buf) == this->
url_;
467 void addHeader(
const char *name,
const char *value) { this->
headers_.push_back({name, value}); }
Mutex implementation, with API based on the unavailable std::mutex.
Minimal static vector - saves memory by avoiding std::vector overhead.
StringRef is a reference to a string owned by something else.
Builder class for creating JSON documents without lambdas.
This class allows users to create a web server with their ESP nodes.
std::vector< AsyncEventSourceResponse * > pending_sessions_
~AsyncEventSource() override
std::atomic< bool > has_pending_sessions_
bool loop()
Returns true if there are sessions remaining (including pending cleanup).
std::vector< AsyncEventSourceResponse * > sessions_
void try_send_nodefer(const char *message, size_t message_len, const char *event=nullptr, uint32_t id=0, uint32_t reconnect=0)
esphome::web_server::WebServer * web_server_
bool canHandle(AsyncWebServerRequest *request) const override
AsyncEventSource(StringRef url, esphome::web_server::WebServer *ws)
void deferrable_send_state(void *source, const char *event_type, message_generator_t *message_generator)=delete
void handleRequest(AsyncWebServerRequest *request) override
void __attribute__((noinline, cold)) adopt_pending_sessions_main_loop_()
void deferrable_send_state(void *source, bool detail_all, message_generator_t *message_generator)
static constexpr uint32_t CLOSE_CONFIRM_INTERVAL_MS
std::atomic< bool > close_work_queued_
uint32_t send_failure_started_ms_
static void destroy(void *p)
static void refresh_lru_work(void *arg)
uint32_t last_lru_refresh_ms_
std::vector< DeferredEvent > deferred_queue_
void deferrable_send_state(void *source, bool detail_all, message_generator_t *message_generator)
bool try_send_nodefer(const char *message, size_t message_len, const char *event=nullptr, uint32_t id=0, uint32_t reconnect=0)
JsonPrepareResult message_generator_t char * buffer
JsonPrepareResult __attribute__((noinline)) prepare_json_(void *source
static void close_session_work(void *arg)
bool close_retry_warning_logged_
static constexpr size_t MAX_SEND_LINES
esphome::web_server::WebServer * web_server_
static constexpr size_t MAX_SEND_IOV
void tail_alloc_failed_(size_t cap)
bool owns_session_(int fd) const
void deq_push_back_with_dedup_(void *source, message_generator_t *message_generator)
AsyncEventSource * server_
static constexpr uint32_t LRU_REFRESH_INTERVAL_MS
void process_deferred_queue_()
uint32_t next_close_attempt_ms_
static constexpr size_t PREFIX_BUF_SIZE
static constexpr uint32_t CLOSE_RETRY_INTERVAL_MS
static constexpr size_t JSON_MAX_SIZE
static constexpr size_t TAIL_MAX_SIZE
static constexpr uint32_t SEND_STALL_TIMEOUT_MS
AsyncEventSourceResponse(const AsyncWebServerRequest *request, esphome::web_server_idf::AsyncEventSource *server, esphome::web_server::WebServer *ws)
JsonPrepareResult message_generator_t * generator
bool reserve_tail_(size_t len)
JsonPrepareResult message_generator_t char size_t * size_out
ssize_t send_(struct iovec *iov, int iovcnt)
static constexpr size_t JSON_BUF_SIZE
bool stash_chunk_(const char *prefix, size_t prefix_len, const char *message, size_t message_len, size_t total, size_t sent)
@ JSON_PREPARE_RESULT_NO_MEMORY
@ JSON_PREPARE_RESULT_TAIL
@ JSON_PREPARE_RESULT_BUFFER
@ JSON_PREPARE_RESULT_TOO_LARGE
std::atomic< bool > lru_work_queued_
esphome::web_server::ListEntitiesIterator entities_iterator_
bool send_json_(void *source, message_generator_t *generator)
bool safe_to_delete_() const
RAMUniquePtr< uint8_t[]> tail_
void start_session_main_loop_()
void deferrable_send_state(void *source, const char *event_type, message_generator_t *message_generator)=delete
void print(const char *str)
void void write(uint8_t c)
AsyncResponseStream(const AsyncWebServerRequest *req)
void print(const std::string &str)
void printf(const char *fmt,...) __attribute__((format(printf
size_t get_content_size() const override
const char * get_content_data() const override
virtual bool canHandle(AsyncWebServerRequest *request) const
virtual void handleRequest(AsyncWebServerRequest *request)
virtual ~AsyncWebHandler()
virtual void handleUpload(AsyncWebServerRequest *request, const std::string &filename, size_t index, uint8_t *data, size_t len, bool final)
virtual void handleBody(AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total)
virtual bool isRequestHandlerTrivial() const
AsyncWebParameter(std::string name, std::string value)
const std::string & name() const
const std::string & value() const
std::function< void(AsyncWebServerRequest *request)> on_not_found_
esp_err_t handle_raw_body_(httpd_req_t *r, const char *content_type)
static esp_err_t request_post_handler(httpd_req_t *r)
AsyncWebServer(uint16_t port)
std::vector< AsyncWebHandler * > handlers_
AsyncWebHandler & addHandler(AsyncWebHandler *handler)
esp_err_t request_handler_(AsyncWebServerRequest *request) const
esp_err_t handle_multipart_upload_(httpd_req_t *r, const char *content_type)
httpd_handle_t get_server()
static void safe_close_with_shutdown(httpd_handle_t hd, int sockfd)
static esp_err_t request_handler(httpd_req_t *r)
void onNotFound(std::function< void(AsyncWebServerRequest *request)> &&fn)
AsyncWebParameter * getParam(const std::string &name)
AsyncWebServerResponse * beginResponse(int code, const char *content_type, const uint8_t *data, const size_t data_size)
AsyncWebParameter * getParam(const char *name)
optional< std::string > get_header(const char *name) const
bool hasParam(const char *name)
void ESPHOME_ALWAYS_INLINE send(int code, const char *content_type=nullptr, const char *content=nullptr)
bool hasArg(const char *name)
void onDisconnect(std::function< void()> fn)
Called when the request ends, including early returns.
StringRef url_to(std::span< char, URL_BUF_SIZE > buffer) const
Write URL (without query string) to buffer, returns StringRef pointing to buffer.
size_t contentLength() const
AsyncWebServerResponse * beginResponse(int code, const char *content_type, const std::string &content)
std::string arg(const std::string &name)
AsyncWebServerResponse * beginResponse(int code, const char *content_type)
bool hasHeader(const char *name) const
void init_response_(AsyncWebServerResponse *rsp, int code, const char *content_type)
bool hasParam(const std::string &name)
static constexpr size_t URL_BUF_SIZE
Buffer size for url_to()
std::function< void()> on_disconnect_
http_method method() const
std::string arg(const char *name)
AsyncWebServerRequest(httpd_req_t *req)
optional< std::string > find_query_value_(const char *name) const
void requestAuthentication() const
AsyncWebServerResponse * rsp_
void ESPHOME_ALWAYS_INLINE send(AsyncWebServerResponse *response)
AsyncResponseStream * beginResponseStream(const char *content_type)
bool authenticate(const char *username, const char *password) const
AsyncWebServerRequest(httpd_req_t *req, std::string post_query)
std::vector< AsyncWebParameter * > params_
void redirect(const char *url)
void redirect(const std::string &url)
const char * get_content_data() const override
size_t get_content_size() const override
AsyncWebServerResponseContent(const AsyncWebServerRequest *req, std::string content)
const char * get_content_data() const override
AsyncWebServerResponseEmpty(const AsyncWebServerRequest *req)
size_t get_content_size() const override
virtual ~AsyncWebServerResponse()
const AsyncWebServerRequest * req_
virtual const char * get_content_data() const =0
AsyncWebServerResponse(const AsyncWebServerRequest *req)
virtual size_t get_content_size() const =0
void addHeader(const char *name, const char *value)
AsyncWebServerResponseProgmem(const AsyncWebServerRequest *req, const uint8_t *data, const size_t size)
size_t get_content_size() const override
const char * get_content_data() const override
const LogString * message
void(esphome::web_server::WebServer *, void *, json::JsonBuilder &) message_generator_t
constexpr size_t SSE_SUFFIX_LEN
std::unique_ptr< T, RAMDeleter< T > > RAMUniquePtr
unique_ptr over RAMAllocator storage
size_t size_t const char * fmt
AsyncEventSourceResponse & owner
SendGuard(AsyncEventSourceResponse &owner)
message_generator_t * message_generator_
bool operator==(const DeferredEvent &test) const
DeferredEvent(void *source, message_generator_t *message_generator)