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
+62
View File
@@ -0,0 +1,62 @@
#!/usr/bin/env python3
"""Production idle lifecycle/sweep + installed IDF completion path, real host sockets.
Deterministic owner/queue/TLS doubles, not a TLS server or hardware timing test.
No dependency installation, device operation, or SDK modification.
"""
import os
from pathlib import Path
import re
import subprocess
import tempfile
HERE = Path(__file__).resolve().parent
ROOT = HERE.parents[1]
IDF = Path(os.environ.get('IDF_PATH', str(Path.home() / '.platformio/packages/framework-espidf')))
def stripped(path):
return '\n'.join(line for line in path.read_text().splitlines()
if not line.startswith(('#include', '#pragma once')))
def function(source, name):
match = re.search(r'^(?:static )?(?:void|esp_err_t) ' + name + r'\(.*?^\}', source, re.M | re.S)
assert match, name
return match.group() + '\n'
sess = (IDF / 'components/esp_http_server/src/httpd_sess.c').read_text()
parse = (IDF / 'components/esp_http_server/src/httpd_parse.c').read_text()
main = (IDF / 'components/esp_http_server/src/httpd_main.c').read_text()
ssl = (IDF / 'components/esp_https_server/src/https_server.c').read_text()
completion = function(sess, 'httpd_sess_process')
assert completion.index('httpd_req_new') < completion.index('httpd_req_delete') < completion.index('session->lru_counter = ++hd->lru_counter')
assert 'Only listen for new connections if server has capacity' in main
assert main.index('/* Case0:') < main.index('/* Case1:') < main.index('/* Case2:')
assert 'httpd_sess_delete(hd, sock_db);' in sess # queued reusable-pointer close is not safe here
assert ssl.index('httpd_sess_set_pending_override') < ssl.index('HTTPD_SSL_USER_CB_SESS_CREATE')
adapter = (ROOT / 'src/web_httpd_adapter.c').read_text()
idle = (ROOT / 'src/web_httpd_idle.c').read_text()
assert 'ESP_IDF_VERSION_VAL(5, 5, 0)' in adapter
for forbidden in ('httpd_sess_trigger_close', 'web_diagnostics', 'xTaskCreate', 'malloc(', 'calloc(', 'ESP_LOG'):
assert forbidden not in idle, forbidden
sweep = function(adapter, 'web_httpd_idle_sweep')
assert 'httpd_sess_trigger_close' not in sweep
assert 'web_httpd_idle_tls(arg);\n web_diagnostics_tls(arg);' in (ROOT / 'src/web_server.c').read_text()
assert 'setInterval(pollStatus, 5000)' in (ROOT / 'src/web_ui.c').read_text()
with tempfile.TemporaryDirectory(prefix='web-httpd-idle-') as directory:
directory = Path(directory)
unit = directory / 'test.c'
unit.write_text((HERE / 'fakes.h').read_text() + '\n' +
stripped(ROOT / 'src/web_httpd_adapter.h') + '\n' +
stripped(ROOT / 'src/web_httpd_idle.h') + '\n' +
sweep + '\n' + stripped(ROOT / 'src/web_httpd_idle.c') + '\n' +
function(parse, 'httpd_req_delete') + '\n' + completion + '\n' +
(HERE / 'test.c').read_text())
executable = directory / 'test'
subprocess.run([os.environ.get('CC', 'cc'), '-std=c11', '-Wall', '-Wextra', '-Werror',
'-g', str(unit), '-o', str(executable)], check=True, timeout=30)
subprocess.run([str(executable)], check=True, timeout=20)
print('PASS installed SDK completion/owner-order and production integration guards')