feat(esp_http_server): Make HTTP(S)_SERVER_EVENT events optional

Make it possible to disable http(s) server events. This improves
performance of the server, as http server creates events on every signle
read or write to the socket.
This commit is contained in:
Jimmy Wennlund
2026-05-27 11:58:58 +05:30
committed by Hrushikesh Bhosale
parent 8f3d8b41c3
commit 6036ec961d
9 changed files with 53 additions and 5 deletions
+8
View File
@@ -57,8 +57,16 @@ menu "HTTP Server"
It internally uses a counting semaphore with count set to `LWIP_UDP_RECVMBOX_SIZE` to achieve this.
This config will slightly change API behavior to block until message gets delivered on control socket.
config HTTPD_ENABLE_EVENTS
bool "Enable ESP_HTTP_SERVER_EVENT"
default y
help
This enables the ESP_HTTP_SERVER_EVENT event type. Generating these eventes adds some overhead.
If you are not using this event type, you can disable it to save some memory and add performance.
config HTTPD_SERVER_EVENT_POST_TIMEOUT
int "Time in millisecond to wait for posting event"
depends on HTTPD_ENABLE_EVENTS
default 2000
help
This config option helps in setting the time in millisecond to wait for event to be posted to the
@@ -23,8 +23,6 @@ extern "C" {
#define ESP_HTTPD_DEF_CTRL_PORT (32768) /*!< HTTP Server control socket port*/
ESP_EVENT_DECLARE_BASE(ESP_HTTP_SERVER_EVENT);
/**
* @brief HTTP Server events id
*/
@@ -40,11 +38,15 @@ typedef enum {
HTTP_SERVER_EVENT_STOP, /*!< This event occurs when HTTP Server is stopped */
} esp_http_server_event_id_t;
#if CONFIG_HTTPD_ENABLE_EVENTS || __DOXYGEN_
ESP_EVENT_DECLARE_BASE(ESP_HTTP_SERVER_EVENT);
/** Argument structure for HTTP_SERVER_EVENT_ON_DATA and HTTP_SERVER_EVENT_SENT_DATA event */
typedef struct {
int fd; /*!< Session socket file descriptor */
int data_len; /*!< Data length */
} esp_http_server_event_data;
#endif // CONFIG_HTTPD_ENABLE_EVENTS || __DOXYGEN_
/*
note: esp_https_server.h includes a customized copy of this
@@ -17,6 +17,7 @@
#include <esp_http_server.h>
#include "osal.h"
#include "sdkconfig.h"
#ifdef __cplusplus
extern "C" {
@@ -591,6 +592,8 @@ esp_err_t httpd_sess_close_lru_direct(struct httpd_data *hd);
* @}
*/
#ifdef CONFIG_HTTPD_ENABLE_EVENTS
#if CONFIG_HTTPD_SERVER_EVENT_POST_TIMEOUT == -1
#define ESP_HTTP_SERVER_EVENT_POST_TIMEOUT portMAX_DELAY
#else
@@ -603,6 +606,14 @@ esp_err_t httpd_sess_close_lru_direct(struct httpd_data *hd);
*/
void esp_http_server_dispatch_event(int32_t event_id, const void* event_data, size_t event_data_size);
#else // CONFIG_HTTPD_ENABLE_EVENTS
#define esp_http_server_dispatch_event(event_id, event_data, event_data_size) do {} while(0)
#endif // CONFIG_HTTPD_ENABLE_EVENTS
esp_err_t httpd_crypto_sha1(const uint8_t *data, size_t data_len, uint8_t *hash);
#ifdef __cplusplus
}
#endif
@@ -38,6 +38,7 @@ typedef struct {
static const char *TAG = "httpd";
#ifdef CONFIG_HTTPD_ENABLE_EVENTS
ESP_EVENT_DEFINE_BASE(ESP_HTTP_SERVER_EVENT);
void esp_http_server_dispatch_event(int32_t event_id, const void* event_data, size_t event_data_size)
@@ -47,6 +48,7 @@ void esp_http_server_dispatch_event(int32_t event_id, const void* event_data, si
ESP_LOGE(TAG, "Failed to post esp_http_server event: %s", esp_err_to_name(err));
}
}
#endif // CONFIG_HTTPD_ENABLE_EVENTS
static esp_err_t httpd_accept_conn(struct httpd_data *hd, int listen_fd)
{
+8 -2
View File
@@ -330,12 +330,14 @@ esp_err_t httpd_resp_send(httpd_req_t *r, const char *buf, ssize_t buf_len)
return ESP_ERR_HTTPD_RESP_SEND;
}
}
hd->http_server_state = HTTP_SERVER_EVENT_SENT_DATA;
#ifdef CONFIG_HTTPD_ENABLE_EVENTS
esp_http_server_event_data evt_data = {
.fd = ra->sd->fd,
.data_len = buf_len,
};
hd->http_server_state = HTTP_SERVER_EVENT_SENT_DATA;
esp_http_server_dispatch_event(HTTP_SERVER_EVENT_SENT_DATA, &evt_data, sizeof(esp_http_server_event_data));
#endif // CONFIG_HTTPD_ENABLE_EVENTS
return ESP_OK;
}
@@ -430,12 +432,14 @@ esp_err_t httpd_resp_send_chunk(httpd_req_t *r, const char *buf, ssize_t buf_len
if (httpd_send_all(r, "\r\n", strlen("\r\n")) != ESP_OK) {
return ESP_ERR_HTTPD_RESP_SEND;
}
hd->http_server_state = HTTP_SERVER_EVENT_SENT_DATA;
#ifdef CONFIG_HTTPD_ENABLE_EVENTS
esp_http_server_event_data evt_data = {
.fd = ra->sd->fd,
.data_len = buf_len,
};
hd->http_server_state = HTTP_SERVER_EVENT_SENT_DATA;
esp_http_server_dispatch_event(HTTP_SERVER_EVENT_SENT_DATA, &evt_data, sizeof(esp_http_server_event_data));
#endif // CONFIG_HTTPD_ENABLE_EVENTS
return ESP_OK;
}
@@ -646,11 +650,13 @@ int httpd_req_recv(httpd_req_t *r, char *buf, size_t buf_len)
ESP_LOGD(TAG, LOG_FMT("received length = %d"), ret);
struct httpd_data *hd = (struct httpd_data *) r->handle;
hd->http_server_state = HTTP_SERVER_EVENT_ON_DATA;
#ifdef CONFIG_HTTPD_ENABLE_EVENTS
esp_http_server_event_data evt_data = {
.fd = ra->sd->fd,
.data_len = ret,
};
esp_http_server_dispatch_event(HTTP_SERVER_EVENT_ON_DATA, &evt_data, sizeof(esp_http_server_event_data));
#endif // CONFIG_HTTPD_ENABLE_EVENTS
return ret;
}