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

12 KiB

Verification report - RustProxy 0.29.6

0.29.6 FastCGI EOF and error-log routing (2026-10-09)

  • Operator reproduced: uncompressed /static.php/... returned HTTP 200 and 29,309 bytes with cache BYPASS; gzip returned HTTP 200 then TLS unexpected EOF and zero bytes. Repeated panics in futures-util 0.3.34 stream/unfold.rs:108 correlate with these failures. This is operator evidence, not a reproduced in-house integration test.
  • Cause identified in source: native Web Server FastCGI response bodies used an unfused stream::unfold over a Tokio MPSC receiver. The compression wrapper may poll the stream after it returns None; the unfused Unfold then panics. The Reverse Proxy source uses an HTTP client body rather than this FastCGI stream.
  • Change: wrap the FastCGI response stream in .fuse(). Add repeated-post-EOF polling test and mocked FastCGI-to-gzip completion/decode test. No changes to PHP-FPM parameters, vhost configuration or migrations.
  • Logging change: the existing error-file controller receives WARN and ERROR (including PHP-FPM stderr); the console tracing layer suppresses these only when the file is enabled, with fallback to stderr on file/queue failure. A Rust panic hook emits structured ERROR diagnostics instead of bypassing the sink via the default stderr hook.
  • Add asynchronous file routing and live enabled/disabled toggle tests. Actual Rust compilation, FastCGI compressor tests, panic runtime acceptance and live Roundcube regression require a Cargo-equipped environment and remain unverified here.
  • Release: Cargo package/lock root/OpenAPI and release checks moved to 0.29.6; retained SQLite schema 9 and Cold Cache format 3.
  • Static checks passed: version_contracts.py, docs_check.py, langs_check.py, rust_module_contracts.py, web_server_contracts.py, check_source.py, release_smoke.py, web_service_ui_test.mjs, and Node syntax/OpenAPI JSON parsing. The ./dev.sh test run passed its source, browser UI, security, memory and upgrade checks before reaching the missing Rust toolchain; ./dev.sh check exited 127 for the same reason.

0.29.5 Roundcube PHP PATH_INFO dispatch (2026-10-09)

  • Cause confirmed by source: serve_inner originally ran try_files before recognizing /static.php/skins/... as a PHP script plus PATH_INFO. For an existing static.php, the last try_files candidate /index.php intercepted the asset request and could return HTML instead of the asset.
  • Fixed dispatch order following rewrites and path ACLs; execute existing PHP PATH_INFO targets before try_files. Access restrictions also apply to the resolved PHP script path; the other fallback path remains protected.
  • Added roundcube_static_php_path_info_runs_before_front_controller_try_files and without_php_path_info_try_files_keeps_legacy_front_controller_fallback using a local test FastCGI server and decoded FastCGI params. These are source tests until run with Cargo, not validated against live PHP-FPM or Roundcube.
  • Operator action: ensure PHP-FPM PATH_INFO splitting enabled on the chosen Web Service / shared profile; keep try_files for the main service. No extra special-case URL rewrite is needed for Roundcube static.php URLs.
  • Static checks passed: version_contracts.py, web_server_contracts.py, rust_module_contracts.py, docs_check.py, langs_check.py, web_service_ui_test.mjs, and release_smoke.py. ./dev.sh test exceeded the available execution limit while running broader static check_source.py. cargo/rustc are unavailable; the new Rust FastCGI tests were not executed and neither was a live Roundcube integration.

0.29.4 PHP-FPM profile toolbar shortcut (2026-10-09)

The Web Server list toolbar now contains a PHP-FPM profiles button immediately before New Web Service. Both this shortcut and the PHP tab's existing profile button open the same shared profile-management dialog; no API or configuration schema changes were required. English/Polish button translations and a UI regression covering placement, both entry paths and closing the dialog were added.

node --check on the changed Web Server script and its profile helper, node tools/checks/web_service_ui_test.mjs, and the focused version, language, Web Server architecture and documentation checks passed. ./dev.sh test was attempted but exceeded the execution time limit during the Rust-independent verification phase, so it did not complete in this run. Rust compilation and runtime tests remain unverified without Cargo.

0.29.4 version bump (2026-10-09)

The PHP-FPM profiles, Web Server cache/transforms and HTTP_HOST fixes have been assigned to a new 0.29.4 release. The source version, root Cargo.lock package entry, OpenAPI metadata, release checks and documentation match 0.29.4. The 0.29.3 internal-fallback changes remain included. This is a source release; no compiled artifacts are included.

Release verification: python3 tools/checks/version_contracts.py, python3 tools/checks/check_source.py, python3 tools/checks/docs_check.py, python3 tools/checks/release_smoke.py and the Node Web Service profile UI regression checks passed. ./dev.sh test completed its Rust-independent source, migration/upgrade, security, browser and documentation checks, then exited 127 because Rust/Cargo is not installed. Compilation, Rust unit tests and live HTTP/FastCGI/cache/transform verification remain unperformed.

0.29.4 feature verification (2026-10-09)

The operator-requested follow-up adds reusable PHP-FPM profiles, fixes the Web Server cache/transform bypass and supplies HTTP_HOST for authority-only HTTP/2 and HTTP/3 FastCGI requests. Changes include Config serialization, revisioned administration section and OpenAPI, Web Server browser modal, route cache/transform pipeline and FastCGI parameter encoding. New Rust unit tests cover profile resolution, detach, validation and HTTP_HOST; the Node UI test exercises opening/editing a profile and attaching it to a service.

Rust compilation, proxy/PHP-FPM integration tests and performance acceptance remain unverified without Rust/Cargo. Static contracts and browser tests are run separately and do not substitute for production acceptance.

Changes

0.29.3 fallback correction (operator report): the replay-body guard treated HTTP/2 and HTTP/3 GET/HEAD bodies with unknown size hints as non-replayable, even when the stream was empty. The fallback guard now performs the existing bounded empty-body probe for GET/HEAD; a true empty stream is replayable, while nonempty/unknown-length request bodies are forwarded only once. The internal target lookup now warns when the named location cannot be resolved. Added Rust async regression tests for empty H2/H3 GET/HEAD, unknown-length GET payload preservation, and unbounded POST non-consumption. The observer also preserves the final internal fallback response (including its 404 HTML) instead of applying a second global/vhost error page; a Rust test exercises this precedence. These Rust tests have not been executed in this environment because Cargo is unavailable.

Same-version 0.29.2 correction: Web Server main routes no longer inherit transient_unavailable from the vhost backend configuration. When the Web Server source has no enabled Reverse Proxy Custom Locations, backend definitions are not compiled. An enabled reverse-proxy Custom Location still compiles and uses the backend pool. Removed fallback-only Prometheus metrics, retained PHP/Web Server metrics.

Validated operator-controlled PHP_ADMIN_VALUE FastCGI configuration per Web Service, with distinct PHP_VALUE/ADMIN directive sets, explicit panel controls and OpenAPI schema. Prometheus PHP Web Service request/status counters, response header latency and available concurrency permit gauge, plus Web Server service-scoped response statuses and header latency.

Acceptance limitations

The build environment has no Rust compiler (cargo/rustc). Rust compilation, unit tests, FastCGI integration with a live PHP-FPM pool and runtime load tests have not been performed here. Rust-independent checks are recorded separately. This source package is not certified for production deployment.

Checks performed

  • 0.29.3 release identity: Cargo.toml, the root rust-proxy entry in Cargo.lock, administration OpenAPI version, README, CHANGELOG, ROADMAP, AGENTS and verification-report heading were updated to 0.29.3; the fallback source changes from the tested 0.29.2 correction are retained.

  • 0.29.3 offline validation: python3 tools/checks/version_contracts.py, python3 tools/checks/check_source.py, python3 tools/checks/release_smoke.py passed; bash ./dev.sh test passed all listed non-Rust checks and stopped at missing Cargo with exit 127. This does not constitute compilation or successful runtime testing of RustProxy 0.29.3.

  • Fallback correction: bash ./dev.sh test passed Rust-independent module, source, upgrade/SQLite, security, browser UI and documentation checks. It exited 127 at the missing Rust/Cargo toolchain. bash ./dev.sh check also exited 127 because Rust/Cargo is unavailable. The added Rust regression tests and the live HTTP/2/HTTP/3 proxy behavior remain unverified pending a compiler-enabled runtime and an operator test against origin-1/origin-2.

  • Same-version correction: python3 tools/checks/check_source.py and python3 tools/checks/release_smoke.py passed. bash ./dev.sh test passed the Rust-independent checks and stopped at missing Rust/Cargo (exit 127). No live 503 regression test or Rust compilation could be performed.

  • ./dev.sh test: all Rust-independent release, upgrade, security, JS, UI, documentation and source checks passed; exited 127 at the missing cargo toolchain guard.

  • node --check src/admin/web/web-server.js: passed.

  • python -m json.tool src/admin/openapi.json: passed.

  • ./dev.sh check: exited 127 because Rust/Cargo is unavailable.

Debian deployment maintenance (same 0.29.2)

Installer/update now installs /etc/logrotate.d/rustproxy using the recorded service user/group. Updates repair /etc/profile.d/rustproxy-path.sh rather than warning. logrotate uses copytruncate because RustProxy holds open log descriptors; some log records may be lost during truncate. Rust build and live Debian/systemd acceptance remain unverified in this environment.

Version identity (0.29.6 source release)

Cargo.toml package version is the canonical release identity (now 0.29.6). Rust uses CARGO_PKG_VERSION at build time; build.rs substitutes the admin HTML placeholder. Packaging, upgrade and dev scripts read the manifest with scripts/version.py. Run python3 tools/checks/version_contracts.py to check that executable paths do not hardcode a version. Historical documentation and external dashboards may retain manually managed versions. Rust compilation/runtime verification is still pending.

Shared PHP-FPM profiles and Web Server cache/transform/Host patch (0.29.4)

  • Added a revisioned php_fpm_profiles collection with per-Web-Service php_profile_id, preserving the local PHP configuration when a shared profile is attached/detached. Added profile editor modal, schema, Polish/English messages and browser regression test.
  • Web Server vhost/location responses now pass the configured RustProxy cache, vhost response rules and transforms. Cache skips ineligible/private/Set-Cookie responses and handles cache hits, conditional requests and range requests. Filesystem/PHP requests are refreshed synchronously rather than using the reverse-proxy background revalidator.
  • FastCGI always supplies HTTP_HOST when HTTP/2 or HTTP/3 omitted the ordinary Host header; existing explicit Host with port is retained. Added Rust regression tests for both paths.
  • bash ./dev.sh test: all Rust-independent release, source, security, browser UI, documentation, migration and dependency checks passed; stopped at absent Rust/Cargo (exit 127). bash ./dev.sh check also stopped at absent Cargo (exit 127). Rust compilation, new Rust tests and live PHP-FPM/HTTP2/HTTP3 cache/transform verification remain unverified in this environment.