Repository navigation
Correctness fixes in the streaming compression path. Responses larger than zstd's internal stream buffer are no longer truncated: the filter no longer commits to the end-of-stream directive while input is still queued. The terminal frame is now emitted only when ZSTD_e_end actually completes, so a flush can no longer mark the response complete over an unfinished frame. Unbuffered proxying (proxy_buffering off) is fixed on both counts: a buffer carrying both flush and last_buf is no longer misclassified, and a zero-length terminator now ends the stream instead of being ignored.
Both modules now emit Vary: Accept-Encoding themselves, duplicate-safely, rather than depending on gzip_vary. Dynamic compression is eligible on 2xx and 3xx responses, excluding 204, 205 and 206. Static zstd responses allow byte ranges over the selected .zst representation. $zstd_ratio no longer overflows on large responses. The libzstd feature probe no longer executes a test binary, so cross-compilation works, and filter ordering now accounts for brotli.
Streaming now uses ZSTD_compressStream2() with an explicit end directive in place of the deprecated ZSTD_compressStream()/ZSTD_flushStream()/ZSTD_endStream() trio. Regression coverage decompresses responses with the real zstd binary and compares them byte for byte.