From ffdd37f70f295b9240e7eb33eb5f257dd9b77a6b Mon Sep 17 00:00:00 2001 From: Jose Quintana Date: Sun, 2 Feb 2020 01:16:12 +0100 Subject: [PATCH] Merge pull request #12 from joseluisq/feature/gzip_on_demand_based_on_accept_encoding_header Gzip compression on demand via accept-encoding header. Resolves #10 --- 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 { - 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 { + let accept_gz = match req.headers.get::() { + 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) -- libgit2 1.7.2