use brotli::{CompressorWriter as BrotliEncoder, Decompressor as BrotliDecoder};
use flate2::{Compression, read::ZlibDecoder, write::ZlibEncoder};
use std::io::{self, Write};
use wreq::tls::compress::{CertificateCompressionAlgorithm, CertificateCompressor, Codec};
use zstd::stream::{Decoder as ZstdDecoder, Encoder as ZstdEncoder};
#[derive(Debug)]
pub struct BrotliCompressor;
#[derive(Debug)]
pub struct ZlibCompressor;
#[derive(Debug)]
pub struct ZstdCompressor;
impl CertificateCompressor for BrotliCompressor {
fn compress(&self) -> Codec {
Codec::Pointer(|input, output| {
let mut writer = BrotliEncoder::new(output, input.len(), 11, 32);
writer.write_all(input)?;
writer.flush()?;
Ok(())
})
}
fn decompress(&self) -> Codec {
Codec::Pointer(|input, output| {
let mut reader = BrotliDecoder::new(input, 4096);
io::copy(&mut reader, output)?;
Ok(())
})
}
fn algorithm(&self) -> CertificateCompressionAlgorithm {
CertificateCompressionAlgorithm::BROTLI
}
}
impl CertificateCompressor for ZlibCompressor {
fn compress(&self) -> Codec {
Codec::Pointer(|input, output| {
let mut encoder = ZlibEncoder::new(output, Compression::default());
encoder.write_all(input)?;
encoder.finish()?;
Ok(())
})
}
fn decompress(&self) -> Codec {
Codec::Pointer(|input, output| {
let mut reader = ZlibDecoder::new(input);
io::copy(&mut reader, output)?;
Ok(())
})
}
fn algorithm(&self) -> CertificateCompressionAlgorithm {
CertificateCompressionAlgorithm::ZLIB
}
}
impl CertificateCompressor for ZstdCompressor {
fn compress(&self) -> Codec {
Codec::Pointer(|input, output| {
let mut encoder = ZstdEncoder::new(output, 0)?;
encoder.write_all(input)?;
encoder.finish()?;
Ok(())
})
}
fn decompress(&self) -> Codec {
Codec::Pointer(|input, output| {
let mut reader = ZstdDecoder::new(input)?;
io::copy(&mut reader, output)?;
Ok(())
})
}
fn algorithm(&self) -> CertificateCompressionAlgorithm {
CertificateCompressionAlgorithm::ZSTD
}
}