On behalf of the Opium team, I am pleased to announce a new version of Opium (
0.19.0) is available on Opam.
This release comes with a complete rewrite of Opium’s internals to switch from Cohttp to Httpaf (work done by @anuragsoni).
As demonstrated in several benchmarks, Httpaf’s latency is much lower than Cohttp’s in stress tests, so it is expected that Opium will perform better in these high-pressure situations.
The underlying HTTP server implementation is now contained in a
rock package, that provides a Service and Filter implementation, inspired by Finagle’s. The architecture is similar to Ruby’s Rack library (hence the name), so one can compose complex web applications by combining Rock applications.
rock package offers a very slim API, with very few dependencies, so it should be an attractive option for other Web frameworks to build on, which would allow the re-usability of middlewares and handlers, independently of the framework used (e.g. one could use Sihl middlewares with Opium, and vice versa).
Apart from the architectural changes, this release comes with a lot of additional utilities and middlewares which should make Opium a better candidate for complex web applications, without having to re-write a lot of common Web server functionalities.
The Request and Response modules now provide:
- JSON encoders/decoders with
- HTML encoders/decoders with
- XML encoders/decoders with
- SVG encoders/decoders with
- multipart/form encoders/decoders with
- urlencoded encoders/decoders with
And the following middlewares are now built-in:
debuggerto display an HTML page with the errors in case of failures
loggerto log requests and responses, with a timer
allow_corsto add CORS headers
staticto serve static content given a custom read function (e.g. read from S3)
static_unixto serve static content from the local filesystem
content_lengthto add the
Content-Lengthheader to responses
method_overrideto replace the HTTP method with the one found in the
ETagheader to the responses and send an HTTP code
304when the computed ETag matches the one specified in the request.
method_requiredto filter the requests by the HTTP method and respond with an HTTP code
405if the method is not allowed.
headto add supports for
HEADrequest for handlers that receive
Lastly, this release also adds a package
opium-testing that can be used to test Opium applications with Alcotest. It provides
Testable modules for every Opium types, and implements helper functions to easily get an
Opium.Response from an
As this release changes the API drastically, we will keep maintaining the
0.18.0 branch for bug fixes, for users who don’t want to (or can’t) migrate to
Recent discussions have shown that building optimized applications was not trivial. This is partly due to the lack of documentation, and probably because some configurations that should come by default, are left to the user to optimize. Therefore, we will keep performance in mind for the next release and investigate the current bottlenecks in Opium.
We will also continue adding higher-level functionalities to Opium to make users productive with real-world applications. This includes:
- Sessions support (with signed cookies)
- Handlers for authentication
- Adding more middlewares (compression, flash messages, caching, etc.)
Your feedback is welcome, don’t hesitate to open Issues on Github!
The Opium team