index : static-web-server.git

ascending towards madness

author Jose Quintana <joseluisquintana20@gmail.com> 2021-01-10 23:23:06.0 +00:00:00
committer Jose Quintana <joseluisquintana20@gmail.com> 2021-01-10 23:23:06.0 +00:00:00
commit
6f4a06816cfce7e25ff7dd1236273c0214b79565 [patch]
tree
4ad54f4b27ecf3ad99c7126ea636bc0c228eaecd
parent
209a9c3293a51c082cd38e5777d338f1d785e8f9
download
6f4a06816cfce7e25ff7dd1236273c0214b79565.tar.gz

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(-)

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::<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);
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,