Files
RustProxy/docs/TEST_REPORT.md
T
2026-10-05 17:05:06 +02:00

7.9 KiB

Verification report - RustProxy 0.26.0

Scope

RustProxy 0.26.0 is a minor release focused on persistent malformed-traffic diagnostics and a built-in stored-log explorer. Public listeners now enqueue bounded protocol_error records for malformed/incomplete HTTP/1 traffic, TLS ClientHello/handshake failures and timeouts, invalid/disabled h2c attempts, HTTP/2 connection/drain protocol failures, HTTP/3/QUIC handshake/request/header/stream failures and connection-limit rejects. These records use the existing asynchronous structured-log sinks and deliberately bypass the Live Logs memory ring so hostile scanner traffic cannot evict ordinary live request history.

The authenticated /logs workspace is independent from Live Logs and reads only configured RustProxy access/per-vhost/error files. It uses opaque source IDs rather than browser-supplied paths, regular-file checks plus O_NOFOLLOW on Unix, bounded blocking reads, a global 20,000-line / 8 MiB query budget, at most 32 sources, bounded pagination and server-side filters. Existing configured files remain browsable while their writer is disabled. Required protocol-diagnostic envelope fields are retained even when an administrator uses a custom structured JSON mapping. SQLite remains schema 8 and the saved configuration format remains compatible with 0.25.7.

Implemented automated coverage

0.26.0-specific Rust tests cover protocol-error separation from the Live Logs ring, required diagnostic fields under custom JSON mappings, secret redaction and UTF-8-safe detail bounding. Admin tests cover visibility of existing log files while writers are disabled, bounded tail reads, oversized source-ID rejection and Unix symlink refusal. The HTTP/1, TLS/H2/h2c and HTTP/3 adapters contain explicit persistent diagnostic emission points for the failure classes listed above. These Rust tests are present in the source tree but cannot be compiled/executed in this workspace because Cargo is unavailable.

Rust unit tests in src/web_server/tests.rs cover GET/HEAD/index/slash redirect, MIME/length, validators, valid/invalid range handling, If-Range, escaped/repeated directory listings, per-directory index-before-listing fallback, generic 403/HEAD behavior, MIME overrides/default MIME, cache rules, source headers, try_files, rewrite redirect/internal behavior, .htaccess WordPress-style front-controller routing, nested DirectoryIndex/MIME/Header/Expires behavior, strict-mode rejection and PHP-source protection, hardening probe/method blocking and fingerprint-header stripping, precompressed representations/ranges, download headers, PHP FastCGI fixture execution/failure-source-disclosure behavior, request-body 413 enforcement, custom FastCGI/PHP_VALUE validation and reserved-parameter rejection, direct traversal rejection and Unix/Linux symlink policy. Upstream tests cover request-budget client generation recycling and disabled recycling; balancing tests cover the new keepalive defaults and validation bounds. src/traffic/tests.rs includes bounded-table, effective-client-IP view and fixed Prometheus User-Agent/method family coverage. Configuration tests cover pure static vhosts without a pool, mixed Web Server/Reverse Proxy routing, reuse of one Web Service by multiple vhosts, unknown service references and backward-compatible default source behavior. Vhost tests cover method-policy normalization/allow/block behavior, database tests cover retained configuration revision documents, actor metadata and previous-revision lookup, and admin tests cover account-scoped/CSRF-protected view preferences including legacy preference defaults, backend-table columns/sort persistence and invalid-column rejection, plus restoring revision 1 as revision 3 while preserving the previous document and emitting config.restore. ACL tests include encoded traversal/separator/malformed-encoding cases.

Rust-independent release checks additionally validate UI/JSON/language/source contracts and reproducible packaging.

An external 0.26.0 cargo build exposed two compiler regressions that the Rust-independent gates could not detect: frontend_state was moved into the HTTP/1 service closure and then reused for connection-error logging, and serde_json::Map::entry("event".into()) was ambiguous with the pinned dependency graph. Both are corrected in this source tree by giving the service closure its own cloned frontend state and by passing the "event" literal directly to Map::entry. The Rust-independent release gates pass after these corrections. A fresh compiler-enabled cargo check/test is still required to confirm there are no further Rust errors because this workspace has no Rust/Cargo toolchain.

During the prior 0.25.4 compiler gate, an external build exposed one module-privacy error in the history split (CONFIG_HISTORY_CAPACITY was private to db::history) and one unused country_resolved assignment in the location GeoIP branch. Both were corrected before the 0.25.5 baseline: the capacity is exposed to its parent module with pub(super), referenced through history::CONFIG_HISTORY_CAPACITY, and the dead assignment is removed.

Modular source-tree verification

  • src/admin/documentation.rs was split so the embedded Reader document catalog lives in src/admin/documentation/documents.rs; both files now stay below the 500-line Rust module limit without changing Reader behavior.
  • The Rust module contract now recognizes the existing *_tests.rs naming convention, and the documentation contract validates embedded documents independently of include_str! line wrapping.
  • python3 scripts/rust_module_contracts.py: PASS.
  • python3 scripts/source_module_contracts.py: PASS. Dashboard JavaScript, Docker Agent Go implementation and operational Python modules remain within their source-size contracts.
  • python3 scripts/docs_check.py: PASS. The documentation index, authenticated Reader/API split and local Markdown links are consistent.
  • Cargo parsing/type checking remains a release-host requirement because this workspace has no Rust/Cargo toolchain.

Verification status in this workspace

Check Status
python3 scripts/langs_check.py PASS
node --check src/admin/web/vhosts/render.js PASS
node --check src/admin/web/vhosts/editor.js PASS
0.26.0 stored-log/protocol diagnostics source contracts PASS: persistent protocol-error emitters, Live Logs separation, authenticated /logs explorer, bounded source-ID file access and required diagnostic fields are present
retained 0.25.7 vhost/backend observability contracts PASS: quick enable/disable, backend search/sort/column controls, retry/client-lifecycle metrics and matching dashboard coverage remain present
python3 scripts/memory_contracts.py PASS
python3 scripts/web_server_contracts.py PASS
python3 scripts/security_contracts.py PASS
python3 scripts/security_dependency_contracts.py PASS
python3 scripts/source_module_contracts.py PASS
python3 scripts/rust_module_contracts.py PASS
python3 scripts/docs_check.py PASS
node scripts/web_service_ui_test.mjs PASS
OpenAPI/language/Grafana JSON parse PASS
go test ./... in docker-agent PASS
python3 scripts/check_source.py PASS; explicitly reports Rust parsing/types/runtime not verified
python3 scripts/release_smoke.py PASS, including SQLite/backup/upgrade, Debian/Grafana and reproducible source-archive contracts
./dev.sh test Static/security/UI/smoke gates PASS; exits 127 when it reaches Rust because Cargo is unavailable
./dev.sh check BLOCKED: Rust/Cargo toolchain unavailable in this workspace
cargo fmt --all, cargo check --locked --all-targets, cargo test --locked --all-targets BLOCKED: Rust/Cargo toolchain unavailable in this workspace

All Rust-independent release gates available in this workspace pass. Compiler formatting, parsing, type checking, linking and Rust unit/integration tests still require a Rust-enabled release host before treating the archive as compiler-verified production output.