Skip to main content

pipa/http/
compression.rs

1use std::io::Read;
2
3pub enum Decompressor {
4    None,
5    Gzip,
6    Deflate,
7}
8
9impl Decompressor {
10    pub fn new(encoding: Option<&str>) -> Self {
11        match encoding {
12            Some("gzip") | Some("x-gzip") => Decompressor::Gzip,
13            Some("deflate") => Decompressor::Deflate,
14            _ => Decompressor::None,
15        }
16    }
17
18    pub fn decompress(&self, input: &[u8]) -> Result<Vec<u8>, String> {
19        match self {
20            Decompressor::None => Ok(input.to_vec()),
21            Decompressor::Gzip => {
22                let mut decoder = flate2::read::GzDecoder::new(input);
23                let mut out = Vec::new();
24                decoder
25                    .read_to_end(&mut out)
26                    .map_err(|e| format!("gzip error: {e}"))?;
27                Ok(out)
28            }
29            Decompressor::Deflate => {
30                let mut decoder = flate2::read::ZlibDecoder::new(input);
31                let mut out = Vec::new();
32                decoder
33                    .read_to_end(&mut out)
34                    .map_err(|e| format!("deflate error: {e}"))?;
35                Ok(out)
36            }
37        }
38    }
39}