Add Bounded Ordinary HTTPS Idle Cleanup

This commit is contained in:
2026-09-08 18:33:33 +02:00
parent f6263042ff
commit 82f21d6116
18 changed files with 884 additions and 13 deletions
+24 -3
View File
@@ -29,6 +29,7 @@
#include "web_session_store.h"
#include "web_cookie_auth.h"
#include "web_httpd_adapter.h"
#include "web_httpd_idle.h"
#include "web_diagnostics.h"
#include "web_ui.h"
#include "wifi_manager.h"
@@ -546,6 +547,12 @@ static esp_err_t route_error_handler(httpd_req_t *request, httpd_err_code_t code
return ESP_FAIL; /* Do not drain a rejected request body on keepalive. */
}
static void tls_session_callback(esp_https_server_user_cb_arg_t *arg)
{
web_httpd_idle_tls(arg);
web_diagnostics_tls(arg);
}
esp_err_t web_server_init(void)
{
esp_err_t error = ensure_mutex();
@@ -600,6 +607,7 @@ esp_err_t web_server_start(void)
/* Initialize only after lifecycle admission; failure gates all HTTPS auth. */
error = web_cookie_auth_start();
if (error == ESP_OK) error = web_httpd_idle_prepare();
uint8_t certificate[WEB_SECURITY_CERTIFICATE_DER_CAPACITY] = {0};
uint8_t private_key[WEB_SECURITY_PRIVATE_KEY_DER_CAPACITY] = {0};
@@ -627,8 +635,8 @@ esp_err_t web_server_start(void)
config.prvtkey_len = private_key_length;
config.port_secure = WEB_SERVER_PORT;
config.tls_handshake_timeout_ms = 5000U;
/* Public synchronous post-TLS observation; HTTPS retains all cleanup. */
config.user_cb = web_diagnostics_tls;
/* Public synchronous identity reset/observation; HTTPS retains cleanup. */
config.user_cb = tls_session_callback;
error = httpd_ssl_start(&server, &config);
}
secure_wipe(certificate, sizeof(certificate));
@@ -648,6 +656,7 @@ esp_err_t web_server_start(void)
error = httpd_register_err_handler(server, HTTPD_404_NOT_FOUND, route_error_handler);
if (error == ESP_OK)
error = httpd_register_err_handler(server, HTTPD_405_METHOD_NOT_ALLOWED, route_error_handler);
if (error == ESP_OK) error = web_httpd_idle_attach(server);
esp_err_t attach_error = s_serial_transport_error;
if (error == ESP_OK && serial_transport_ready) {
attach_error = web_serial_transport_attach_server(server);
@@ -680,8 +689,10 @@ esp_err_t web_server_start(void)
web_cookie_auth_stop();
}
if (error != ESP_OK && server != NULL) {
esp_err_t cleanup_error = httpd_ssl_stop(server);
esp_err_t cleanup_error = web_httpd_idle_detach(server);
if (cleanup_error == ESP_OK) cleanup_error = httpd_ssl_stop(server);
if (cleanup_error == ESP_OK) {
web_httpd_idle_stopped(server);
server = NULL;
} else {
/* Retain ownership so stop can retry and start cannot allocate a second server. */
@@ -726,6 +737,15 @@ esp_err_t web_server_stop(void)
xSemaphoreGive(s_server_mutex);
web_cookie_auth_stop();
esp_err_t idle_error = web_httpd_idle_detach(server);
if (idle_error != ESP_OK) {
/* Never destroy HTTPD while a timer submission still holds its handle. */
xSemaphoreTake(s_server_mutex, portMAX_DELAY);
s_transitioning = false;
s_last_error = idle_error;
xSemaphoreGive(s_server_mutex);
return idle_error;
}
if (admin_transport_owned) {
esp_err_t detach_error = web_admin_transport_detach(server);
if (detach_error != ESP_OK) {
@@ -752,6 +772,7 @@ esp_err_t web_server_stop(void)
}
esp_err_t error = httpd_ssl_stop(server);
if (error == ESP_OK) web_httpd_idle_stopped(server);
if (error == ESP_OK && admin_transport_owned) web_admin_transport_stopped(server);
if (error != ESP_OK && serial_transport_attached) {
/* Stay detached: old HTTPD work may still be reading static TX storage. */