| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| Suave.Json.3.7.1.symbols.nupkg | 2026-10-15 | 12.8 kB | |
| Suave.3.7.1.nupkg | 2026-10-15 | 852.8 kB | |
| Suave.3.7.1.symbols.nupkg | 2026-10-15 | 1.1 MB | |
| Suave.DotLiquid.3.7.1.nupkg | 2026-10-15 | 21.0 kB | |
| Suave.DotLiquid.3.7.1.symbols.nupkg | 2026-10-15 | 24.3 kB | |
| Suave.Json.3.7.1.nupkg | 2026-10-15 | 11.6 kB | |
| README.md | 2026-10-15 | 3.3 kB | |
| v3.7.1 source code.tar.gz | 2026-10-15 | 1.8 MB | |
| v3.7.1 source code.zip | 2026-10-15 | 2.0 MB | |
| Totals: 9 Items | 5.8 MB | 0 | |
- Security: a client that opened a connection to an HTTPS binding and never completed the TLS handshake stopped that binding from accepting anyone else (with the default
acceptorCount = 1, one idle TCP connection made the HTTPS site unreachable until it closed). The handshake now runs on the connection's own task instead of the accept loop, and is bounded by the new process-wideTcp.tlsHandshakeTimeout(default 10 seconds; set it before starting the server). A connection whose handshake fails or times out now has its socket closed; previously the socket was left open Proxy.proxyforwards requests faithfully: the target is built fromrawPathandrawQuery(it used the decodedpathand dropped the query, so/a/b%2Fc?x=1arrived as/a/b/c), and a path on the upstream URI is kept as a prefix (proxy (Uri "http://backend/api")maps/usersto/api/users). A request path with a.or..segment (also percent-encoded) is answered with 400 instead of being able to leave that prefixProxy.proxyforwards every request header except hop-by-hop ones (RFC 9110 ยง7.6.1:Connection,Keep-Alive,Proxy-Connection,TE,Trailer,Transfer-Encoding,Upgrade,Proxy-Authorization,Proxy-Authenticateand any named inConnection),Host,Content-LengthandExpect; it used to forward onlyUser-Agent,Accept,Date,Content-TypeandContent-Length, soAuthorization,Cookie, API keys and the like were lost. The request body is forwarded whenever there is one (it was only forwarded for POST and PUT, so PATCH and DELETE lost theirs).multipart/form-databodies are parsed by Suave before any WebPart runs and still cannot be forwardedProxy.proxypasses any upstream status through with its reason phrase; statuses Suave has noHttpCodefor (e.g. 207, 418) used to become 502 while the upstream body was still sent. Response headers are forwarded without hop-by-hop headers and withoutDate/Server(Suave writes its own), and repeated headers such asSet-Cookieare kept as separate headers instead of being joined with commas- Behaviour change:**
Proxy.proxyno longer trustsX-Forwarded-For,X-Forwarded-Proto,X-Forwarded-Host,ForwardedorX-Real-IPsent by the client:X-Forwarded-Foris the connection's address,-Protoand-Hostare the scheme andHostthe proxy received, andForwarded/X-Real-IPare dropped. A client could sendX-Forwarded-Proto: httpsover plain HTTP, or any address inX-Forwarded-For, and have it passed on. Behind another reverse proxy, list its address inProxyOptions.trustedProxiesto keep its headers and extend itsX-Forwarded-Forchain - Security: the
HttpClientshared by all proxies no longer keeps a cookie container. UpstreamSet-Cookieresponses were stored in it and sent with later proxied requests from every client - Add
Proxy.proxyWith options upstreamandProxy.defaultProxyOptions(timeout,trustedProxies,dropRequestHeaders,onError). The proxy answers 504 when the upstream has not sent its response headers within the timeout (30 seconds by default; there was none) and 502 when it cannot be reached;onErroris called with the exception first.proxyandproxyWiththrowArgumentExceptionstraight away for an upstream that is not an absolute http/https URI