Module tower_http::compression
source · Available on crate features
compression-br
or compression-deflate
or compression-gzip
or compression-zstd
only.Expand description
Middleware that compresses response bodies.
Example
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, BoxError};
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.
Ok(Response::new(body))
}
let mut service = ServiceBuilder::new()
// Compress responses based on the `Accept-Encoding` header.
.layer(CompressionLayer::new())
.service_fn(handle);
// Call the service.
let request = Request::builder()
.header(ACCEPT_ENCODING, "gzip")
.body(Body::empty())?;
let response = service
.ready()
.await?
.call(request)
.await?;
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) = body.data().await {
let chunk = chunk?;
bytes.extend_from_slice(&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);
Modules
- Predicates for disabling compression of responses.
Structs
- Compress response bodies of the underlying service.
- Response body of
Compression
. - Compress response bodies of the underlying service.
- The default predicate used by
Compression
andCompressionLayer
. - Response future of
Compression
.
Enums
- CompressionLevel
compression-br
orcompression-deflate
orcompression-gzip
orcompression-zstd
ordecompression-br
ordecompression-deflate
ordecompression-gzip
ordecompression-zstd
Level of compression data should be compressed with.
Traits
- Predicate used to determine if a response should be compressed or not.