Response Compression

warp can automatically compress response bodies to reduce the amount of data sent to the client, which can improve performance, especially on slow networks. It supports gzip, deflate, and brotli compression.

Enabling Compression Features

Compression is an optional feature. You need to enable the corresponding feature flags in your Cargo.toml.

[dependencies]
# The meta-feature enables both gzip and brotli
warp = { version = "0.4", features = ["compression"] }

# Or, you can enable them individually:
# warp = { version = "0.4", features = ["compression-gzip", "compression-brotli"] }
  • compression-gzip: Enables gzip and deflate compression.
  • compression-brotli: Enables brotli compression.
  • compression: Enables both of the above.

Applying Compression to a Route

Compression is applied as a wrapper using the .with() method on a filter. You can choose the compression algorithm to apply.

use warp::Filter;

// This route will have its response body compressed with gzip.
let file = warp::path("todos")
    .and(warp::fs::file("./examples/todos.rs"))
    .with(warp::compression::gzip());

// This route will compress responses with deflate.
let examples_dir = warp::path("ex")
    .and(warp::fs::dir("./examples/"))
    .with(warp::compression::deflate());

// This route will compress responses with brotli.
let readme = warp::path::end()
    .and(warp::fs::file("./README.md"))
    .with(warp::compression::brotli());

let routes = file.or(examples_dir).or(readme);

When a compression filter is applied, warp will:

  1. Compress the response body using the specified algorithm.
  2. Add the appropriate Content-Encoding header to the response (e.g., content-encoding: gzip).
  3. Remove the Content-Length header, as the final size is determined by the streaming compression.

Note: The client is responsible for sending an Accept-Encoding header indicating it can handle compressed content. However, warp's compression filters currently apply compression unconditionally. For more advanced content negotiation, you would need to implement additional filter logic.