Releases: SuaveIO/suave
Bugfix release
v2.0.0-rc2 update project.json version
v2.0.0-rc1 - the first release candidate
Suave v2.0-rc1
This is a pre-release. Besides improvements to the code-base and a slightly larger surface area, there are also bugfixes, better logging, better owin support, better libuv handling, etc.
There will be more release candidates. Primary focus points for v2.0 are:
- .Net Core preview3 support, and moving towards that as the recommended default
- HttpClient will potentially be replaced for Http.fs: Zipkin support out of the box, together with Http.fs to bring distributed tracing to everyone!
- Better and more colourful logging
- Removal of deprecated functions
- Suave.Testing has gone from Fuchu to Expecto as the testing and asserting library. There may be a much better testing story coming before v2.0 is released – if it comes, we'll be aiming to auto-generate the API structure/docs. (Note that only Testing can come to depend on Http.fs)
Non functional changes:
- Bump required .Net to 4.6.1 – supported by both Mono and Windows .Net
- Bump .Net Core to netstandard1.6 for now
- Bump required F# Core to v4.x
We're moving towards recommending Kubernetes as the default way of deploying Suave apps in the cloud since we expect that platform to win the greatest mind-share (if it hasn't already...). And of course you should have a place to put your feature flags and security tokens which supports updating your site without recompilation.
Note: this is only a recommendation; of course you can deploy Suave in any way you want 👍
When it all comes around, the aim of Suave is to give you a smooth developer experience that lends itself to creating software with good operability. This includes having excellent logging and metrics too.
The most contentious area for us right now are the docs. We'd like someone to help us to do an overhaul on them and help us bring them both up-to-date with what Suave supports and to structure them in a way that facilitates reading them like a book - from the start to the end. They're all Markdown, in /docs
.
We've created a new docs issue to track the updating of the docs – if we distribute the writing across many people, we'll get done a lot quicker! Just ping us in the issue and state what bullet point you'll take care of.
We're both looking forward to hearing your input before we cut the major release!
/Henrik & Ademar
Upgrade notes
Writers.createMimeType
->Writers.mkMimeType
XXX.mk
->XXX.create
v2.0.0-alpha7
Some highlights since the v2-alpha4:
- Coloured console output by default using Logary's facade
- Owin cookie bugfixes
- Owin send content-lenght: 0 for empty responses
- Adding HTTP Status Codes, 306 and 426
- Remove
divAttr
function family from experimental - Fix docs for startWebServerAsync
- Decode multipart data based on charset
- adding hasFlag (temporary implementation, see #502 )
HTTP 2.0 is progressing. We're aiming to release Suave 2.0 with HTTP2 support and full integration with Logary: Zipkin and Metrics support out of the box. Another idea gaining slowly traction is a separation of the combinators from the server. There will also be more performance optimisation done, either for 2.0 or for a minor release thereafter.
We're very grateful for the community around Suave. Keep the PRs flowing, talks coming and books being written! And don't hesitate to ask in the gitter chat or in an issue if you have any questions or are wondering something.
Have fun!
Henrik & Ademar
v1.1.3 – Websocket bugfix release
Websocket support for multiple readers and writers.
v1.1.2 – setHeaderValue
In Suave 1.1.2 we've added a function for setting individual header values, imaginatively named setHeaderValue
.
It's for example useful when you compose Suave WebParts together, when each web part may have different policies as to how caching should be done.
E.g. if you have basic authentication, or are using Logibit Hawk, then you want the authorise
web part to add a Vary
header with values Authorization,Cookie
even if the vary header already contains Accept-Language
(like it should, or you'll run into trouble with your downstream proxies). Your own code should/may also add a Cache-Control
and Vary
header on top of that, to indicate to downstream proxies and the end-client how cacheable the resource is.
You can still override the header with setHeader
, though.
This is a backwards-compatible patch release.
v1.1.1
v1.1.0
Suave v1.0.0
Suave has been in development since 2012. It's been a long and winding road that has involved thousands of people; and after a lot of engineering effort, we've arrived at v1.0.
During the last couple of weeks we both have been talking with the good people behind Community for F#, WebSharper and Freya. We've all decided to work together to create a more coherent F#-web story together. More info is available at http://c4fsharp.net/ (which now runs on Suave)!
Where has Suave been used?
Atom & Visual Studio Code
Sometimes Suave has been used in ways we did not expect; for example, the F# compiler services now has a REST-API, built with Suave, written by Krzysztof which powers the cross-platform code-completion engine for use in Atom and Visual Studio Code.
Microsoft Involvement
Suave was the first F# program Microsoft made work on CoreCLR:
Happy that the first F# thing Microsoft run on CoreCLR on Linux is an open source community-authored web framework VisualFSharp/staus
https://twitter.com/dsyme/status/664578666236665861
F# TV
That (me) Henrik has joined F# TV: Brice and Mark, helps Suave move forward by providing a modest income to help document, review, improve and record content about Suave.
Help Suave by learning F# or by recommending the courses to your friends and family who want to understand what you're on about, talking about this smooth web server all the time!
And many many more
- FsSnip – share and communicate about F# snippets online, written in F# and Suave
- Suave Reporter – together with Logary.js let's you do user tracking and semantic logging from JavaScript
- Suave Music Store – available in English and Japanese
- Suave running on AppFabric in Azure
- Suave Hands On
- Push-based Rx.JS + Suave chat
- Suave on DotNetRocks
- Suave with WebSharper
Ping us on twitter to add your example to this list!
Testimonials
When I started Community for F# in 2010, I had dreamed of building the site using only F#. As a member of the OWIN project, I've long recognized that the existing web stacks for .NET typically emphasize a lot of unnecessary boilerplate and poor abstractions. WebSharper, Freya, and other projects provide better abstractions for building web APIs and browser applications, but I was still tied to ASP.NET and IIS for hosting. Suave finally completes the puzzle and brings a beautifully simple and fast web server to F# and .NET and includes excellent tools for routing, serving web APIs, and even support for OWIN applications and middleware! I'm proud the new http://c4fsharp.net/ will be powered entirely by F#, but I'm thrilled that the F# web stack of Suave, WebSharper, and others provides a simpler, superior web stack. Building the new http://c4fsharp.net/ has been a true delight because of these tools.
Ryan Riley
New TLS provider.
We have coded a new TLS provider DefaultTlsProvider
using only BCL code which makes possible now to have HTTPS bindings without the OpenSSL dependency.
Upgrading to v1.0 from previous versions
As a part of v1.0 we've decided to give the API an overhaul to make it even easier to use, discover and understand. In particular we've moved almost everything from Suave.Http into Suave, and replaced >>=
for >=>
, also called the fish operator.
To get help with the migration, at the beginning of all open statements, add open Suave.Classic
and you'll get help from the F# compiler while upgrading:
Afterwards:
Here's the full commit you can use to guide your upgrade.
Below you can find a trouble-shooting list, that we've composed from upgrading our own projects, and a list of known changes to look out for.
- Replaced
>>=
with>=>
- You now need to open
Suave.Operators
to get access to the above "fish" operator WebPart
is now in scope by opening theSuave
namespaceSuave.Types
is no more. The HTTP types have been moved toSuave.Http
Suave.Http.Applicatives
->Suave.Filters
Suave.Http.*
->Suave.*
- HTTP code 451, Unavailable For Legal Reasons has been added to highlight the problem of internet censorship throughout the world
Troubleshooting
We'll expand this list when we get questions in the issue tracker, stackoverflow or on twitter.com/suaveio.
GET
, POST
, etc. filters are "is not a function and cannot be applied":
You've explicitly opened Suave.Http
below Suave.Filters
. You can probably just remove open Suave.Http
from your code.
FAKE is using the @@
operator from Suave.Operators and they're clashing!
If you use suave in a FAKE script then you might encounter a operator name clash. The @@ operator is used in FAKE and suave and therefor you need to solve the conflict. The recommend way is to use </> from FAKE instead of @@. If this doesn't work for you, then make sure that you open the FAKE namespace as the last open statement. This will ensure that your script keeps using the @@ operator that was defined in FAKE.
v0.33.0 – LibUV debut!
v0.33.0
In this release LibUV is ready for prime-time! Follow the guide on how to use it.
Further, we've documented multipartFields, added fieldData
to extract multipart-form data fields.
Using LibUV will give you an approximate 72% performance increase.
Happy coding!
Henrik & Ademar
v0.33.0-libuv.2
v0.33-libuv.2