From 6f4a06816cfce7e25ff7dd1236273c0214b79565 Mon Sep 17 00:00:00 2001 From: Jose Quintana Date: Mon, 11 Jan 2021 00:23:06 +0100 Subject: [PATCH] feat: accept-encoding (gzip, deflate, br) support --- Cargo.lock | 2 +- sample.env | 1 + src/bin/server.rs | 53 +++++++++++++++++++++++++++++++++++++++++++++++++---- src/core/config.rs | 4 ++++ 4 files changed, 55 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f3d183d..435178c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1562,7 +1562,7 @@ dependencies = [ [[package]] name = "warp" version = "0.2.5" -source = "git+https://github.com/joseluisq/warp.git?branch=0.2.x#ae3bc399f3d5545f2eb998b437615810a5338bff" +source = "git+https://github.com/joseluisq/warp.git?branch=0.2.x#5bda31d6bba12c9c3889de1a5bb9dd540a269187" dependencies = [ "async-compression", "bytes 0.5.6", diff --git a/sample.env b/sample.env index d79fcba..357a9ca 100644 --- a/sample.env +++ b/sample.env @@ -3,3 +3,4 @@ E_ARGS = "--port=8787" # Server configuration SERVER_LOG_LEVEL = "trace" +SERVER_COMPRESSION = "gzip" diff --git a/src/bin/server.rs b/src/bin/server.rs index fe7d872..6e892e8 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -21,17 +21,62 @@ async fn server(opts: config::Options) -> Result { .with(warp::trace::request()) .recover(rejection::handle_rejection), ); - let public_get = warp::get().and( - warp::fs::dir(opts.root) + + let public_get_default = warp::get().and( + warp::fs::dir(opts.root.clone()) .with(warp::trace::request()) - .with(warp::compression::gzip(true)) .recover(rejection::handle_rejection), ); let host = opts.host.parse::()?; let port = opts.port; - tokio::task::spawn(warp::serve(public_head.or(public_get)).run((host, port))); + let accept_encoding = |v: &'static str| warp::header::contains("accept-encoding", v); + + match opts.compression.as_ref() { + "brotli" => tokio::task::spawn( + warp::serve( + public_head.or(warp::get() + .and(accept_encoding("br")) + .and( + warp::fs::dir(opts.root.clone()) + .with(warp::trace::request()) + .with(warp::compression::brotli(true)) + .recover(rejection::handle_rejection), + ) + .or(public_get_default)), + ) + .run((host, port)), + ), + "deflate" => tokio::task::spawn( + warp::serve( + public_head.or(warp::get() + .and(accept_encoding("deflate")) + .and( + warp::fs::dir(opts.root.clone()) + .with(warp::trace::request()) + .with(warp::compression::deflate(true)) + .recover(rejection::handle_rejection), + ) + .or(public_get_default)), + ) + .run((host, port)), + ), + _ => tokio::task::spawn( + warp::serve( + public_head.or(warp::get() + .and(accept_encoding("gzip")) + .and( + warp::fs::dir(opts.root.clone()) + .with(warp::trace::request()) + .with(warp::compression::gzip(true)) + .recover(rejection::handle_rejection), + ) + .or(public_get_default)), + ) + .run((host, port)), + ), + }; signals::wait(|sig: signals::Signal| { let code = signals::as_int(sig); diff --git a/src/core/config.rs b/src/core/config.rs index c8fa835..420f361 100644 --- a/src/core/config.rs +++ b/src/core/config.rs @@ -15,6 +15,10 @@ pub struct Options { /// Root directory path of static files pub root: String, + #[structopt(long, short = "c", default_value = "gzip", env = "SERVER_COMPRESSION")] + /// Compression body support for text-based files. Values: "gzip", "deflate" or "brotli" + pub compression: String, + #[structopt(long, short = "l", default_value = "error", env = "SERVER_LOG_LEVEL")] /// Specify a logging level in lower case. pub log_level: String, -- libgit2 1.7.2