Add Bounded Ordinary HTTPS Idle Cleanup
This commit is contained in:
+24
-3
@@ -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. */
|
||||
|
||||
Reference in New Issue
Block a user