Fluxheim 1.5.20
Fluxheim 1.5.20 Release Notes
Fluxheim 1.5.20 starts the web, PHP-FPM, and cache boundary-preparation line
and carries forward the post-1.5.19 trusted-proxy validation fix.
Changed
- Started the
fluxheim-cachecrate boundary by moving shared cache-header
request/response directive parsing intocrates/fluxheim-cache. The root
crate keepscrate::cache_headersas a compatibility re-export, so runtime
behavior and call sites are unchanged. - Moved pure cache admin request/result/preview DTOs into
crates/fluxheim-cache::api, with rootcrate::cache_apiand
crate::proxyre-exports kept for compatibility. Pure runtime totals and
activity-reset DTOs also moved. - Moved cache object metadata, activity stats, tier stats, object lookup, and
vhost/route runtime stats intocrates/fluxheim-cache::api. Root
crate::cacheandcrate::cache_apikeep compatibility re-exports so admin,
CLI, metrics, and proxy call sites are unchanged. - Moved cache storage-plan DTOs into
crates/fluxheim-cache::plan, keeping
rootcrate::cachere-exports while the Pingora storage adapters remain in
the root cache runtime. - Moved cached object DTOs and
CacheStoreErrorinto
crates/fluxheim-cache::object, keeping rootcrate::cachere-exports for
memory-cache and test call sites. - Moved cache request/key DTOs into
crates/fluxheim-cache::request, with root
crate::cachere-exports and root cache-key builders preserving the existing
behavior. - Moved cache range/slice request DTOs, single-range parsing, client range
parsing, client-range resolution, and required-slice planning into
crates/fluxheim-cache::request, leaving rootcrate::proxy_cacheas the
Pingora request-header and cache-key adapter. - Moved Content-Range parsing into
crates/fluxheim-cache::request, so
range-cache admission and slice-object reconstruction share one pure parser. - Moved pure cache freshness helpers for remaining TTL and synthesized
Cache-Control freshness directives intocrates/fluxheim-cache::headers. - Moved Vary header parsing and configured request-header variance policy into
crates/fluxheim-cache::headers, keeping rootcrate::proxy_cachefocused
on Pingora request hashing and adapter logic. - Moved Vary request hash material framing into
crates/fluxheim-cache::headers; rootcrate::proxy_cachenow only adapts
Pingora request headers and calls the Pingora hash function. - Moved cacheable response Content-Type matching into
crates/fluxheim-cache::headers, leaving root cache admission as the
status/header adapter. - Moved cache-bypass cookie and query-string matching, including
percent-decoded query comparisons, intocrates/fluxheim-cache::headers. - Moved cache stale-serving event and status/error allow policy into
crates/fluxheim-cache::headers, keeping Pingora error classification in
rootcrate::proxy_cache. - Moved response
AgeandCache-Controlmax-age/s-maxage parsers into
crates/fluxheim-cache::headers, leaving root response helpers as thin
Pingora header adapters. - Moved Cache-Control directive merge/replacement into
crates/fluxheim-cache::headers, leaving root response mutation as a
Pingora header adapter. - Moved range response
Content-RangeandContent-Lengthvalidation into
crates/fluxheim-cache::request, leaving root range-cache admission as the
Pingora status/header adapter. - Moved cache-key component formatting and the temporary HEAD cache bypass
predicate intocrates/fluxheim-cache::request, keeping root compatibility
wrappers for existing proxy callers. - Moved multipart slice range policy sizing into
crates/fluxheim-cache::request, leaving rootcrate::proxy_cacheas the
config adapter. - Moved cache Prometheus label classifiers into
crates/fluxheim-cache,
keeping rootcrate::metricsas recorder wiring. - Moved cache purge-index state, purge-entry DTOs, storage-local purge result
counters, and cache-key path matching helpers into
crates/fluxheim-cache::purge_index. Rootcrate::cachekeeps the existing
compatibility type names while the Pingora storage implementations remain in
the root runtime adapter. - Started the
fluxheim-webcrate boundary by moving static directory-listing
data/rendering helpers intocrates/fluxheim-web. The rootcrate::web
module re-exports the same types and renderer while keeping Pingora response
serving in the root adapter. - Moved static byte-range parsing into
crates/fluxheim-web, keeping
crate::webcompatibility re-exports for the existing static response
planner and tests. - Moved static response planning, conditional request evaluation, weak ETag
construction, and range response plan DTOs intocrates/fluxheim-web.
crate::webkeeps the existingStaticRequestConditionscompatibility
adapter so proxy call sites and cache-refresh semantics are unchanged. - Moved safe relative path and directory-listing path helpers into
crates/fluxheim-web, leaving root static serving responsible for filesystem
canonicalization and symlink checks. - Moved configured web-root symlink detection into
crates/fluxheim-web,
keeping rootStaticFileServerconstruction as the filesystem adapter. - Moved static cache identity formatting into
crates/fluxheim-web, keeping
rootStaticFileas the filesystem metadata adapter. - Started the
fluxheim-php-fpmcrate boundary by moving PHP-FPM timeout
classification and bounded error-outcome helpers into
crates/fluxheim-php-fpm, with the root PHP-FPM module re-exporting the same
names for existing runtime and test code. - Moved managed PHP-FPM restart-backoff and sanitized
PATHfallback helpers
intocrates/fluxheim-php-fpm, again keeping the root module as the
compatibility surface for existing code. - Moved managed PHP-FPM config rendering and its config-value validators into
crates/fluxheim-php-fpm, leaving root PHP-FPM process supervision as the
compatibility adapter. - Moved PHP-FPM effective timeout calculation, retry attempt/deadline policy,
retryable status matching, and retryable error classification into
crates/fluxheim-php-fpm, with rootcrate::php_fpmretaining the
StatusCodecompatibility adapter. - Moved PHP-FPM endpoint selection and endpoint DTOs into
crates/fluxheim-php-fpm, with rootcrate::php_fpmkeeping compatibility
re-exports for the proxy runtime and tests. - Moved PHP-FPM response-header name/value safety guards into
crates/fluxheim-php-fpm, keeping root response parsing as the Pingora
header adapter. - Moved PHP-FPM response split,
Statusparsing, ASCII trimming, and header
colon splitting intocrates/fluxheim-php-fpm, leaving root response parsing
as the Pingora response-header adapter. - Moved managed PHP-FPM instance-name generation and metric-pool sanitization
intocrates/fluxheim-php-fpm, leaving root process supervision as the
Unix runtime adapter. - Started the
fluxheim-geoipcrate boundary by movingGeoContextand the
optional local MMDB runtime intocrates/fluxheim-geoip, with root
crate::geo_contextandcrate::geoipcompatibility re-exports. - Started the
fluxheim-compressioncrate boundary by moving response
compression encoder lifecycle and output-limit accounting into
crates/fluxheim-compression, while keeping Pingora header selection and
response mutation in the root adapter. - Moved Accept-Encoding token and qvalue parsing into
crates/fluxheim-compression, keeping root response-header selection as the
Pingora adapter. - Moved compression response policy string matching for Cache-Control directives
and Content-Type eligibility intocrates/fluxheim-compression, leaving root
response-header iteration as the adapter. - Moved active Content-Encoding classification and compression input-size bounds
intocrates/fluxheim-compression, keeping root response headers/config as
adapters. - Started the
fluxheim-observabilitycrate boundary by moving W3C Trace
Context parsing, generation, and traceparent normalization into
crates/fluxheim-observability, with rootcrate::trace_contextkept as a
compatibility re-export. - Moved the shared OTLP HTTP agent and symlink-safe custom CA bundle loader into
crates/fluxheim-observabilitybehind itsotlp-httpfeature, while keeping
the rootcrate::otlp_httpmodule as the metrics/tracing adapter. - Moved OTLP HTTP endpoint parsing into
crates/fluxheim-observability,
keeping the Prometheus metrics payload conversion in the root metrics adapter. - Moved the Prometheus-to-OTLP metrics payload builder into
crates/fluxheim-observabilitybehind itsotlp-metricsfeature, leaving
root metrics OTLP as exporter lifecycle and HTTP post wiring. - Moved access-log helper logic for request-id validation/generation,
shared low-cardinality status classes, response byte counting, and Unix
nanosecond timestamps intocrates/fluxheim-observability, while the root
access-log module keeps Pingora request-header integration and JSON event
assembly and Prometheus metrics reuses the shared status-class helper. - Moved shared JSON string escaping for access logs and runtime JSON logs into
crates/fluxheim-observability, keeping both root log schemas unchanged. - Moved proxy metrics outcome, method, and status-class label bucketing into
crates/fluxheim-observability, keeping rootcrate::metricsas the
Prometheus registry/recorder adapter. - Moved general Prometheus label classifiers for host-routing, admin-auth,
compression, edge-policy, load-balancer event/queue/upstream, stream, ACME,
PHP/PHP-FPM, and metrics-OTLP exporter events intocrates/fluxheim-observability,
further narrowing rootcrate::metricsto recorder wiring. - Moved Prometheus numeric helper logic for bounded ratios and saturating gauge
conversions intocrates/fluxheim-observability, leaving root metrics as the
registry/recorder adapter. - Moved
LoadBalanceSelectionmetric-label mapping intofluxheim-config,
keeping rootcrate::metricsas a compatibility wrapper. - Moved config-derived cache and load-balancer metrics summary aggregation into
fluxheim-config, leaving root metrics to only publish the Prometheus
gauges. - Moved the OTLP trace exporter and trace-span payload builder into
crates/fluxheim-observabilitybehind itsotlp-tracefeature, with root
crate::otel_otlpkept as a compatibility re-export. - Started the
fluxheim-protocolcrate boundary by moving PROXY protocol v1/v2
upstream header framing intocrates/fluxheim-protocol, while the root
crate::proxy_protocolmodule keeps the Pingora L4 connector adapter. - Moved route method matching and prefix-boundary helpers into
crates/fluxheim-protocol, keeping rootcrate::route_policyas the config,
regex-capture, and Pingora request adapter. - Started the
fluxheim-snapshotcrate boundary by moving the durable config
snapshot store, metadata validation, rollback pointer handling, and
symlink-safe filesystem writes intocrates/fluxheim-snapshot, with root
crate::snapshotkept as a compatibility re-export. - Moved reload-impact classification into
crates/fluxheim-config, with root
crate::reloadkept as a compatibility re-export for admin and CLI reload
reporting. - Moved load-balancer runtime/member weight parser helpers into
crates/fluxheim-load-balancer, leaving root admin as the HTTP/query
endpoint adapter. - Moved cache admin summary math helpers into
crates/fluxheim-cache::api,
leaving root admin JSON assembly as the response adapter. - Moved runtime cache-purger
usizemetric saturation into
crates/fluxheim-observability, keeping root runtime as the background-task
adapter. - Moved downstream PROXY-protocol trusted-source parsing into
crates/fluxheim-protocol, leaving root runtime as the Pingora listener
adapter. - Moved HTTP Upgrade token grammar validation into
crates/fluxheim-protocol,
leaving root proxy as the Pingora request-header adapter. - Moved Fluxheim
Viaheader value formatting intocrates/fluxheim-protocol,
leaving root proxy as the Pingora header mutation adapter. - Moved multipart cache Content-Type sanitization into
crates/fluxheim-cache::headers, leaving root proxy as the slice response
assembly adapter. - Moved cache slice metadata first-header extraction into
crates/fluxheim-cache::headers, leaving root proxy as the slice identity
adapter. - Moved hop-by-hop
Connectionoption token validation onto the shared
crates/fluxheim-protocolHTTP token grammar helper. - Moved response header rewrite prefix authority-boundary matching into
crates/fluxheim-protocol, leaving root header policy as the mutation
adapter. - Moved cache CLI header-name validation onto the shared
crates/fluxheim-protocolHTTP token grammar helper. - Moved config HTTP token validation onto the shared
crates/fluxheim-protocolgrammar while preserving method-specific
uppercase checks. - Moved cache object lookup summary formatting into
crates/fluxheim-cache,
leaving the CLI as the command/output adapter. - Moved cache-warm count summaries and bounded status labels into
crates/fluxheim-cache, leaving the CLI to print the prepared summaries. - Used the shared
crates/fluxheim-cachestorage-tier helper directly from
admin cache status JSON.
Fixed
- Hardened the vendored HTTP/1 request parser to reject requests that carry
bothTransfer-EncodingandContent-Length, matching Fluxheim's raw
request-framing release smoke and avoiding ambiguous downstream body
framing. - Documented the shared protocol HTTP token grammar as case-permissive and
added a warning when accepted IPv6 trusted-proxy CIDR entries are broader
than/32. - Fixed cache-only builds after shared cache stats moved purge-index and
activity fields into the always-present cache API shape. - Allowed real provider IPv6 trusted-proxy ranges such as Cloudflare's
2a06:98c0::/29. The1.5.19config-crate split preserved runtime IPv6
CIDR support but made config validation too strict by rejecting trusted proxy
IPv6 prefixes broader than/32.
Checksums And Signatures
- Commit:
f1ff4e5a8b2515b32997cd6bc2b4788e4770e347 - Local gate: GitHub CI green before tag; local release metadata checks passed
- CodeQL/code scanning: no open release-blocking alerts before tag
- Source archive checksums:
87edcb7ca2c82b199005e1a8f12e3e4a680a312215261e444368ead36d83e129 fluxheim-1.5.20.tar.gz5936819e9d3ed041f760d508c4a086843f45db6841fc0b5474f6305ef2be2b6b fluxheim-1.5.20.zip
- Binary checksums:
- x86_64:
cf191f8d810c9029024b84f1302fbfc80bccc36a20dda7b1ce6121fa950be84f fluxheim-1.5.20-full-x86_64-linux.tar.gzcb967723db55a214dcc75b970914d998c92d06e2303416ef5f49b6d79ea60d74 fluxheim-1.5.20-cache-x86_64-linux.tar.gzf11528de9e9c9c4b29d56ef34fa6b43c2be6850babeb1747812580ba459fd309 fluxheim-1.5.20-proxy-x86_64-linux.tar.gzb3a942a574c9b0a2f92bceb87006dffc53f192025cfe79698a8d386e10dfaf5c fluxheim-1.5.20-php-x86_64-linux.tar.gzbc3a22d666175d690ed062b2a67ab770eb0059036034574fbf0e71655aeb0238 fluxheim-1.5.20-load-balancer-x86_64-linux.tar.gzf24609ba5fa716afd55382c0e27c902981f3718cecaef3108f45c8a437dfe165 fluxheim-1.5.20-config-tester-x86_64-linux.tar.gz
- aarch64:
ba70529ce476daef4e77b63dbeb9d1605a0c8a2be9133a1fd7023f320591f6e4 fluxheim-1.5.20-full-aarch64-linux.tar.gz2b238423349c8f9b36f8c81a2df673b439be91f1cb30a0e902f16a722348effd fluxheim-1.5.20-cache-aarch64-linux.tar.gza7872ebb6bc23aa953c169cc51bae35b3877f55a0b6f993914272b8778237ed9 fluxheim-1.5.20-proxy-aarch64-linux.tar.gz037434ece52cdf32967de339f4f0c41c8fec101f4f8471b4766bd63b87d833e5 fluxheim-1.5.20-php-aarch64-linux.tar.gz04b0c5e424c91e57008fc961ad40240be2bc4c0c3e11969590941a4cdf49d096 fluxheim-1.5.20-load-balancer-aarch64-linux.tar.gzfd073fa44d21d2074f5103dc385df37823e1b915b46abb885f0465df64b49279 fluxheim-1.5.20-config-tester-aarch64-linux.tar.gz
- macos:
fdb7d9e4283ff5177ce81ef0ae257893e89e54b892e937614a4c4176b5916672 fluxheim-1.5.20-dev-aarch64-macos.tar.gz
- x86_64:
- SBOM checksums:
b1643f5918530ec251090da162607960bb6a957a4946e4824262591b15115318 fluxheim.spdx.json60e1bd8e1052c88ad3595c4c1229269f4200604405c8cca75f305c51bc705faf fluxheim.cyclonedx.json
- Reproducible build:
6789d24dcae9782bcdffe37eabb471f56037e97f82ca22c1cd8b38090c12ce5cx86_640df961f7b80dcc0d8f6993b46e83c987c94c8ac801c6385f35f8614fcb7cc626aarch642e2478f4ec43fa46bab73d79eacca414ebb57912109c640bf8f39d40142d2956macos
- Full Build Container digests:
- Wolfi:
ghcr.io/valkyoth/fluxheim@sha256:72a7354e1e3417bf3ea2ddf909259d9cbc429fb58220f4343416e74f97149f53 - Alpine:
ghcr.io/valkyoth/fluxheim@sha256:7cef30fc7a5aeb059acff05ba105e95d04894f30ef120ef1f6e632a65e6773bd - SUSE Micro:
ghcr.io/valkyoth/fluxheim@sha256:9fc52f20b99efd31bed4d2f00fafb6ffc6152f473ea6d24f488923f57f9424fb - Debian:
ghcr.io/valkyoth/fluxheim@sha256:0044966fdd84794b2f85c4fd233bd68ece6656ff549d0de5b2129c95ca95fa4f
- Wolfi:
- Cache Build Container digests:
- Wolfi:
ghcr.io/valkyoth/fluxheim@sha256:65859fab41f2acf31afb47f894a7e3396bb5ca357c7707da6d4dce2125d4f4cd - Alpine:
ghcr.io/valkyoth/fluxheim@sha256:0353f497786e873e43c582ee869c67e6264e289fa8284269bd64f5ce103452b8 - SUSE Micro:
ghcr.io/valkyoth/fluxheim@sha256:031d6b9767c6c2d545fa9e74fc36dcc7e20f285e67d3baf29467a18e58481744 - Debian:
ghcr.io/valkyoth/fluxheim@sha256:9902758d800d6d6abe153bda23e4a3f3928c34c4e0210194209397f4d86dd62d
- Wolfi:
- Proxy Build Container digests:
- Wolfi:
ghcr.io/valkyoth/fluxheim@sha256:203d6b4216289c592b68f1f60bc3d0d7ae2c64c1db872e05ecddabebbcfd367c - Alpine:
ghcr.io/valkyoth/fluxheim@sha256:48e2b11f27a4f1d123d65554ed3d48348de9003a124adca802eccf688c4ed6ab - SUSE Micro:
ghcr.io/valkyoth/fluxheim@sha256:1386ef820876d1a1672e416f3cc632ff5141cba89237f5f21eac444d58c37a2e - Debian:
ghcr.io/valkyoth/fluxheim@sha256:6527002b27e7aabb77a9c8f1abd522d3388f30985fd5196aae1736415986b68e
- Wolfi:
- PHP Build Container digests:
- Wolfi:
ghcr.io/valkyoth/fluxheim@sha256:7c57319cf4c33a0e460b1921531798dab8a5cc30b2f00cb9d6c6473a09d88b9b - Alpine:
ghcr.io/valkyoth/fluxheim@sha256:310355ef01b51b004d1be1e4eb0ed786ac59c6c2c09940dd6da8329e09ccc0d1 - SUSE Micro:
ghcr.io/valkyoth/fluxheim@sha256:b648760c98a5fea0996b0eeaa6c2ddef470a732fbeef51338a182cf1422dc887 - Debian:
ghcr.io/valkyoth/fluxheim@sha256:300f572649b05e495e1167eb84b03dd6c14bd7df403f66383803d3f49feb95c9
- Wolfi:
- Load Balancer Build Container digests:
- Wolfi:
ghcr.io/valkyoth/fluxheim@sha256:52f081db705e38f8cfa381d5b76ff230885a4f5f1146dd8ef5bcf79cc1e1747b - Alpine:
ghcr.io/valkyoth/fluxheim@sha256:08ef797b008d8e3ea80e2ffca7d7131cae2ef6ee1b09144b3b71e8594fadf755 - SUSE Micro:
ghcr.io/valkyoth/fluxheim@sha256:88c81d2ce5565c969ac302f8f8fbcdebcfc95a8bad348b916b7c4a30a213162b - Debian:
ghcr.io/valkyoth/fluxheim@sha256:2f88b0560c14f82726ec0f753ede3f35e36a459c9b2ea0ead2a908fb1ee2ffd3
- Wolfi:
- Tag signature:
Good "git" signature for 1921261+eldryoth@users.noreply.github.com with ED25519 key SHA256:EoLRQ5k4J5pYz3UMFmkrV798gYFNkToGS2xEPvebqB4