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}