index : static-web-server.git

ascending towards madness

author Jose Quintana <joseluisquintana20@gmail.com> 2020-02-02 0:03:42.0 +00:00:00
committer Jose Quintana <joseluisquintana20@gmail.com> 2020-02-02 0:03:42.0 +00:00:00
commit
6dc5056e58e1b7312ce8e4625ed9a88c7b1e5b7a [patch]
tree
b4dff26624b0a0eae1400ff8fe836acb4ee60e60
parent
2726f135fe7fbff800b30d40d829c55d133f846a
download
6dc5056e58e1b7312ce8e4625ed9a88c7b1e5b7a.tar.gz

feat: gzip compression on demand via accept-encoding header

resolves #10

Diff

 src/gzip.rs | 29 +++++++++++++++++------------
 1 file changed, 17 insertions(+), 12 deletions(-)

diff --git a/src/gzip.rs b/src/gzip.rs
index c810310..6b086c1 100644
--- a/src/gzip.rs
+++ b/src/gzip.rs
@@ -1,24 +1,29 @@
use flate2::write::GzEncoder;
use flate2::Compression;
use iron::headers::{ContentEncoding, Encoding};
use iron::headers::{AcceptEncoding, ContentEncoding, Encoding};
use iron::prelude::*;
use iron::AfterMiddleware;

pub struct GzipMiddleware;

impl AfterMiddleware for GzipMiddleware {
    fn after(&self, _: &mut Request, mut resp: Response) -> IronResult<Response> {
        let compressed_bytes = resp.body.as_mut().map(|b| {
            let mut encoder = GzEncoder::new(Vec::new(), Compression::fast());
            {
                let _ = b.write_body(&mut encoder);
    fn after(&self, req: &mut Request, mut resp: Response) -> IronResult<Response> {
        let accept_gz = match req.headers.get::<AcceptEncoding>() {
            Some(accept) => accept.0.iter().any(|qi| qi.item == Encoding::Gzip),
            None => false,
        };
        if accept_gz {
            let compressed_bytes = resp.body.as_mut().map(|b| {
                let mut encoder = GzEncoder::new(Vec::new(), Compression::fast());
                {
                    let _ = b.write_body(&mut encoder);
                }
                encoder.finish().unwrap()
            });
            if let Some(b) = compressed_bytes {
                resp.headers.set(ContentEncoding(vec![Encoding::Gzip]));
                resp.set_mut(b);
            }
            encoder.finish().unwrap()
        });

        if let Some(b) = compressed_bytes {
            resp.headers.set(ContentEncoding(vec![Encoding::Gzip]));
            resp.set_mut(b);
        }

        Ok(resp)