Suave 3.7.1
See the version list below for details.
dotnet add package Suave --version 3.7.1
NuGet\Install-Package Suave -Version 3.7.1
<PackageReference Include="Suave" Version="3.7.1" />
<PackageVersion Include="Suave" Version="3.7.1" />
<PackageReference Include="Suave" />
paket add Suave --version 3.7.1
#r "nuget: Suave, 3.7.1"
#:package Suave@3.7.1
#addin nuget:?package=Suave&version=3.7.1
#tool nuget:?package=Suave&version=3.7.1
Suave is a simple web development F# library providing a lightweight web server and a set of combinators to manipulate route flow and task composition.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- FSharp.Core (>= 10.0.102)
NuGet packages (64)
Showing the top 5 NuGet packages that depend on Suave:
| Package | Downloads |
|---|---|
|
Aardvark.Service
Aardvark is an open-source platform for visual computing, real-time graphics and visualization. |
|
|
FsLab
FsLab is a combination package that supports doing data science with F#. FsLab includes literate scripting converted to HTML and PDF, and by default references Deedle (a data frame library), FSharp.Data (for data access) and XPlot (for visualization). You can optionally add any other nuget packages. |
|
|
Suave.DotLiquid
Suave.DotLiquid provides Liquid templates for Suave web server. |
|
|
SuaveServerWrapper
A wrapper for suave.io APIs to call from C# |
|
|
Logary.Services.SuaveReporter
Logary is a high performance, multi-target logging, metric and health-check library for mono and .Net. |
GitHub repositories (2)
Showing the top 2 popular GitHub repositories that depend on Suave:
| Repository | Stars |
|---|---|
|
msarilar/EDEngineer
An overlay to track Elite Dangerous blueprints progress in real time
|
|
|
rogeralsing/Microphone
|
| Version | Downloads | Last Updated |
|---|---|---|
| 3.7.2 | 203 | 10/15/2026 |
| 3.7.1 | 60 | 10/15/2026 |
| 3.7.0 | 63 | 10/15/2026 |
| 3.6.1 | 832 | 10/7/2026 |
| 3.6.0 | 150 | 10/5/2026 |
| 3.5.0 | 856 | 9/9/2026 |
| 3.4.6 | 7,098 | 8/29/2026 |
| 3.4.5 | 193 | 8/26/2026 |
| 3.4.4 | 3,449 | 7/13/2026 |
| 3.4.3 | 10,918 | 6/1/2026 |
| 3.4.2 | 587 | 5/31/2026 |
| 3.4.1 | 280 | 5/30/2026 |
| 3.4.0 | 513 | 5/18/2026 |
| 3.4.0-beta | 150 | 5/14/2026 |
| 3.3.1 | 399 | 5/11/2026 |
| 3.3.1-beta3 | 144 | 5/6/2026 |
| 3.3.1-beta2 | 138 | 5/5/2026 |
| 3.3.1-beta1 | 130 | 5/5/2026 |
| 3.3.1-beta | 140 | 5/4/2026 |
| 3.3.0 | 373 | 5/2/2026 |
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-wide `Tcp.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.proxy` forwards requests faithfully: the target is built from `rawPath` and `rawQuery` (it used the decoded `path` and dropped the query, so `/a/b%2Fc?x=1` arrived as `/a/b/c`), and a path on the upstream URI is kept as a prefix (`proxy (Uri "http://backend/api")` maps `/users` to `/api/users`). A request path with a `.` or `..` segment (also percent-encoded) is answered with 400 instead of being able to leave that prefix
`Proxy.proxy` forwards 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-Authenticate` and any named in `Connection`), `Host`, `Content-Length` and `Expect`; it used to forward only `User-Agent`, `Accept`, `Date`, `Content-Type` and `Content-Length`, so `Authorization`, `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-data` bodies are parsed by Suave before any WebPart runs and still cannot be forwarded
`Proxy.proxy` passes any upstream status through with its reason phrase; statuses Suave has no `HttpCode` for (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 without `Date`/`Server` (Suave writes its own), and repeated headers such as `Set-Cookie` are kept as separate headers instead of being joined with commas
Behaviour change:** `Proxy.proxy` no longer trusts `X-Forwarded-For`, `X-Forwarded-Proto`, `X-Forwarded-Host`, `Forwarded` or `X-Real-IP` sent by the client: `X-Forwarded-For` is the connection's address, `-Proto` and `-Host` are the scheme and `Host` the proxy received, and `Forwarded`/`X-Real-IP` are dropped. A client could send `X-Forwarded-Proto: https` over plain HTTP, or any address in `X-Forwarded-For`, and have it passed on. Behind another reverse proxy, list its address in `ProxyOptions.trustedProxies` to keep its headers and extend its `X-Forwarded-For` chain
Security: the `HttpClient` shared by all proxies no longer keeps a cookie container. Upstream `Set-Cookie` responses were stored in it and sent with later proxied requests from every client
Add `Proxy.proxyWith options upstream` and `Proxy.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; `onError` is called with the exception first. `proxy` and `proxyWith` throw `ArgumentException` straight away for an upstream that is not an absolute http/https URI