feat: accept-encoding (gzip, deflate, br) support
Diff
Cargo.lock | 2 +-
sample.env | 1 +
src/bin/server.rs | 53 +++++++++++++++++++++++++++++++++++++++++++++++++----
src/core/config.rs | 4 ++++
4 files changed, 55 insertions(+), 5 deletions(-)
@@ -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",
@@ -3,3 +3,4 @@ E_ARGS = "--port=8787"
SERVER_LOG_LEVEL = "trace"
SERVER_COMPRESSION = "gzip"
@@ -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::<std::net::IpAddr>()?;
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);
@@ -15,6 +15,10 @@ pub struct Options {
pub root: String,
#[structopt(long, short = "c", default_value = "gzip", env = "SERVER_COMPRESSION")]
pub compression: String,
#[structopt(long, short = "l", default_value = "error", env = "SERVER_LOG_LEVEL")]
pub log_level: String,