1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
use super::DeflateService;
use middleware::Middleware;
use util::buf_stream::BufStream;
use util::buf_stream::deflate::CompressStream;

use flate2::Compression;
use http;
use tower_service::Service;

/// Deflate all response bodies
#[derive(Debug)]
pub struct DeflateMiddleware {
    level: Compression,
}

impl DeflateMiddleware {
    /// Create a new `DeflateMiddleware` instance
    pub fn new(level: Compression) -> DeflateMiddleware {
        DeflateMiddleware { level }
    }
}

impl<S, RequestBody, ResponseBody> Middleware<S> for DeflateMiddleware
where S: Service<Request = http::Request<RequestBody>,
                Response = http::Response<ResponseBody>>,
      RequestBody: BufStream,
      ResponseBody: BufStream,
      S::Error: ::std::error::Error,
{
    type Request = http::Request<RequestBody>;
    type Response = http::Response<CompressStream<ResponseBody>>;
    type Error = S::Error;
    type Service = DeflateService<S>;

    fn wrap(&self, service: S) -> Self::Service {
        DeflateService::new(service, self.level)
    }
}