| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| Suave.Json.3.6.0.symbols.nupkg | 2026-10-05 | 12.6 kB | |
| Suave.3.6.0.nupkg | 2026-10-05 | 823.1 kB | |
| Suave.3.6.0.symbols.nupkg | 2026-10-05 | 1.0 MB | |
| Suave.DotLiquid.3.6.0.nupkg | 2026-10-05 | 20.8 kB | |
| Suave.DotLiquid.3.6.0.symbols.nupkg | 2026-10-05 | 24.1 kB | |
| Suave.Json.3.6.0.nupkg | 2026-10-05 | 11.4 kB | |
| README.md | 2026-10-05 | 2.6 kB | |
| v3.6.0 source code.tar.gz | 2026-10-05 | 1.8 MB | |
| v3.6.0 source code.zip | 2026-10-05 | 1.9 MB | |
| Totals: 9 Items | 5.6 MB | 0 | |
- Keep-alive performance: allocations per request fall from ≈5.7 KB to ≈1.24 KB for a routed empty response. In a same-host Linux comparison against ASP.NET Core Minimal API, Suave is now ahead at 256 connections and within ≈5% at 64 (#862, [#864]):
- the connection's request loop waits for a complete request head, then parses the request line and headers synchronously; fragmented, oversized (beyond the 8 KiB line buffer), non-HTTP/1.x and body-carrying requests continue on the streaming parser
- a request whose parsing, web part and response complete synchronously allocates no
Task;processRequestandrunkeep theirTasksignatures - TCP and HTTPS reads and web part executions complete through reusable per-connection completion sources instead of a
task { }wrapper andAsync.StartImmediateAsTaskper request; web part errors are recovered there with the same semantics asasync.TryWith - reads no longer register on the server's cancellation token individually: each connection registers once and is shut down when the server stops, which also ends a pending read
- no error message allocations for absent request headers, h2c checks only for
Upgrade: h2crequests, allocation-freeContent-Lengthformatting, status line and ASCII response headers written without task state orToLowerInvariant, no URL decoding of paths without escapes, and a single exact-route lookup inRouter - New
HttpReadermembers (requestHeadReady,receive,commitReceived,tryReadRequestLineBuffered,tryReadHeadersBuffered) used by the request loop (#862) - Request header names are matched with ordinal case-insensitive comparison; names with invalid Unicode no longer match through linguistic equivalence (#862)
- Add
Globals.messageWriterto redirect or silence Suave's own console messages (startup banner, "Stopping TCP server", websocket disconnects); the test suite uses it to avoid a Console lock deadlock with Expecto that caused intermittent hangs (#863) - Evict obsolete compressed artifacts: a recompressed resource's superseded copy is now deleted as part of the atomic cache swap, and the
_temporary_compressed_filesfolder is swept - age- and count-bounded, seeCompression.cleanupFolder- on server startup and shutdown (#655) - Cached compressed copies that have gone missing from disk are treated as a cache miss instead of failing the request
- Benchmarks: a Minimal API comparison server, balanced comparison and profiling scripts, and an exact per-request allocation probe; see
benchmarks/HTTP_COMPARISON.md(#862)