http4r_core/
codex.rs

1use std::io::{Read, Write};
2use crate::http_message::CompressionAlgorithm;
3use flate2::bufread::{DeflateEncoder, GzEncoder};
4use flate2::{Compression};
5use flate2::read::{GzDecoder, DeflateDecoder};
6
7pub struct Codex {}
8impl Codex {
9    pub fn encode(reader: &[u8], mut writer: &mut Vec<u8>, compression: CompressionAlgorithm) {
10        match compression {
11            CompressionAlgorithm::GZIP => {
12                let mut gzip_encoder = GzEncoder::new(reader, Compression::fast());
13                gzip_encoder.read_to_end(&mut writer).unwrap();
14            }
15            CompressionAlgorithm::DEFLATE => {
16                let mut deflate_encoder = DeflateEncoder::new(reader, Compression::fast());
17                deflate_encoder.read_to_end(&mut writer).unwrap();
18            }
19            CompressionAlgorithm::BROTLI => {
20                let mut encoder = brotli::CompressorReader::new(reader, reader.len(), 5, 10);
21                encoder.read_to_end(writer).unwrap();
22            }
23            CompressionAlgorithm::NONE => panic!("Cannot decode with no compression algorithmw")
24        }
25    }
26
27    pub fn decode(reader: &mut [u8], mut writer: &mut Vec<u8>, compression: &CompressionAlgorithm) {
28        match compression {
29            CompressionAlgorithm::GZIP => {
30                let mut gzip_decoder = GzDecoder::new(&reader[..]);
31                gzip_decoder.read_to_end(&mut writer).unwrap();
32            }
33            CompressionAlgorithm::DEFLATE => {
34                let mut deflater = DeflateDecoder::new(&reader[..]);
35                deflater.read_to_end(writer).unwrap();
36            }
37            CompressionAlgorithm::BROTLI => {
38                let mut writer = brotli::DecompressorWriter::new(writer, reader.len());
39                writer.write(reader).unwrap();
40            }
41            CompressionAlgorithm::NONE => panic!("Cannot decode with no compression algorithmw")
42        }
43
44    }
45}