Module tower_http::compression[][src]

This is supported on crate feature compression only.
Expand description

Middleware that compresses response bodies.


Example showing how to respond with the compressed contents of a file.

use bytes::{Bytes, BytesMut};
use http::{Request, Response, header::ACCEPT_ENCODING};
use http_body::Body as _; // for Body::data
use hyper::Body;
use std::convert::Infallible;
use tokio::fs::{self, File};
use tokio_util::io::ReaderStream;
use tower::{Service, ServiceExt, ServiceBuilder, service_fn};
use tower_http::compression::CompressionLayer;

async fn handle(req: Request<Body>) -> Result<Response<Body>, Infallible> {
    // Open the file.
    let file = File::open("Cargo.toml").await.expect("file missing");
    // Convert the file into a `Stream`.
    let stream = ReaderStream::new(file);
    // Convert the `Stream` into a `Body`.
    let body = Body::wrap_stream(stream);
    // Create response.

let mut service = ServiceBuilder::new()
    // Compress responses based on the `Accept-Encoding` header.

// Call the service.
let request = Request::builder()
    .header(ACCEPT_ENCODING, "gzip")

let response = service

assert_eq!(response.headers()["content-encoding"], "gzip");

// Read the body
let mut body = response.into_body();
let mut bytes = BytesMut::new();
while let Some(chunk) = {
    let chunk = chunk?;
let bytes: Bytes = bytes.freeze();

// The compressed body should be smaller 🤞
let uncompressed_len = fs::read_to_string("Cargo.toml").await?.len();
assert!(bytes.len() < uncompressed_len);



Compress response bodies of the underlying service.


Response body of Compression.


Compress response bodies of the underlying service.


Response future of Compression.