Files
RustProxy/docs/V0.27.0_IMPLEMENTATION.md
T
2026-10-07 08:51:04 +02:00

3.6 KiB

RustProxy 0.27.0 implementation note

Scope

0.27.0 changes downstream compression defaults/negotiation, makes Docker publications persistent across transient service loss, adds scoped compression overrides, and fixes cache occupancy meter rendering. SQLite remains schema 8. Saved configuration changes are additive/defaulted: vhosts and Web Services gain scoped compression/codec overrides and Docker assignments gain nullable compression/codec fields. Fresh installations also default the Server header policy to custom: RustProxy, while a missing legacy field still deserializes with the previous preserve behavior.

Compression

Global compression defaults to zstd, Brotli and gzip enabled, with deflate disabled and the existing 1024-byte minimum. RustProxy parses Accept-Encoding weights before entering tower-http. Client quality values are authoritative; equal qualities use server preference zstd -> br -> gzip -> deflate.

Responses carrying Cookie, Authorization, Set-Cookie, Cache-Control: private or no-store are no longer rejected merely because of those headers. Compression remains disabled for existing Content-Encoding, no-transform, request ranges/Content-Range, SSE, upgrades, HEAD and non-body statuses. Existing encoded bodies are never recompressed.

Ordinary vhosts, generated Docker vhosts and Web Server services expose inherit/enable/disable dynamic-compression policy plus individual zstd/Brotli/gzip/deflate overrides. Global Response codec switches remain the hard availability ceiling and the minimum size remains global. A child scope may re-enable a codec disabled by an enclosing scope only when that codec is still enabled globally. In the dashboard, explicitly selecting Disabled hides and disables the child codec selectors; their stored values are preserved so changing the scope back to Inherit/Enabled restores the previous choices.

Persistent Docker publications

A Docker assignment is desired configuration, not merely a reflection of the latest inventory. Once published, its hostname remains owned until the administrator unpublishes it or disables/removes the agent. When a successful Docker inventory no longer contains the assigned service, RustProxy compiles an unavailable fallback route with no backend and returns 503 Service Unavailable plus Retry-After: 1 instead of withdrawing the hostname and falling through to 404.

Agent transport failures retain the previous successful inventory when one exists, allowing known working backends to continue routing during a temporary control-plane outage. If no inventory has ever succeeded, published assignments are still materialized as 503 routes. When the same service key becomes routable again, normal reconciliation rebuilds its backend pool automatically; no manual pool action is required.

Cache occupancy meters

The /cache JavaScript already calculates occupancy percentages from configured object/byte limits and writes those values to native <progress> elements. 0.27.0 adds explicit WebKit/Chromium and Firefox progress-track/value styling so the filled portion is visible instead of relying only on accent-color.

Compatibility and verification

No SQLite migration is required. Older vhost, Docker assignment and Web Service documents load with inherited compression behavior because all new fields are defaulted. Existing stored server_header settings are preserved; documents predating that field keep the historical preserve behavior. Rust compiler/runtime verification remains mandatory on the release host; Rust-independent checks in docs/TEST_REPORT.md do not substitute for cargo fmt, cargo check, Clippy, tests or live protocol acceptance.