Crate kvarn

source ·
Expand description

An extensible and efficient forward-thinking web server for the future.

Kvarn is a rethought web server tailored for the current needs from web application developers.

It handles several things for you, including

  • Content-Type
  • Compression of body
  • Correct and performant HTTP/1 and HTTP/2
  • Common API across HTTP/1 and HTTP/2
  • Easy integration with HTTP/2 push promises
  • Five types of extensions, all backed with intuitive macros
  • Optional encryption with rustls
  • Several checks for illegal requests
  • cache-control and kvarn-cache-control header limits server cache lifetimes

§Getting started

To get started, configure a RunConfig. See the example at RunConfig::execute on how to get a simple web server running.

A battle-tested reference implementation can be found at GitHub. It powers my two websites with minimal resource requirements.

§Future plans

See the README @ GitHub and



  • Abstractions for the application layer, providing a common interface for all HTTP versions supported.
  • Compress and cache.
  • CORS implementation for Kvarn.
  • CSP implementation for Kvarn.
  • ctlhandover
    Control the Kvarn server from the outside.
  • Encryption for incoming and outgoing traffic, implemented through streams.
  • Utility functions to generate error responses.
  • Here, all extensions code is housed.
  • Handling of multiple Hosts on one instance of Kvarn.
  • Limits traffic from a IP address to partially mitigate attacks.
  • The Kvarn Prelude
  • Utilities for reading files with or without a FileCache.
  • Graceful shutdown for Kvarn.
  • Vary header handling in Kvarn.
  • websocketwebsocket
    Easy and fast WebSockets for Kvarn.





  • Will handle a single request, check the cache, process if needed, and caches it. This is where the response is sent.
  • Handles a single connection. This includes encrypting it, extracting the HTTP header information, optionally (HTTP/2 & HTTP/3) decompressing them, and passing the request to handle_cache(). It will also recognize which host should handle the connection.
  • Handles a single request and returns response with cache and compress preference.
  • Spawn a task.

Type Aliases§