- log_buffer: RingBufferHandler, кольцевой буфер 600 записей, fan-out SSE - ui_logs: GET /ui/logs (HTML), GET /ui/logs/stream (EventSource) - main: install_log_handler при старте, подключён router логов - nav_rail: ссылка Логи, root_html: кнопка-ссылка Логи - Исправлено: NaN/Inf/NUL в теле вебхука → 500 от PostgreSQL jsonb - Тесты: test_log_buffer, test_json_sanitize; 51 passed Made-with: Cursor
27 lines
738 B
Python
27 lines
738 B
Python
import json
|
|
import math
|
|
|
|
from onguard24.ingress.json_sanitize import sanitize_for_jsonb
|
|
|
|
|
|
def test_sanitize_nan_inf_to_none() -> None:
|
|
raw = json.loads('{"a": NaN, "b": Infinity, "c": -Infinity, "d": 1.5}')
|
|
out = sanitize_for_jsonb(raw)
|
|
assert math.isnan(raw["a"])
|
|
assert out["a"] is None
|
|
assert out["b"] is None
|
|
assert out["c"] is None
|
|
assert out["d"] == 1.5
|
|
|
|
|
|
def test_sanitize_strips_nul_in_strings() -> None:
|
|
assert sanitize_for_jsonb({"x": "a\x00b"}) == {"x": "ab"}
|
|
|
|
|
|
def test_dumps_after_sanitize_is_valid_json() -> None:
|
|
raw = json.loads('{"v": NaN}')
|
|
clean = sanitize_for_jsonb(raw)
|
|
s = json.dumps(clean, allow_nan=False)
|
|
assert "NaN" not in s
|
|
assert json.loads(s)["v"] is None
|