blitz_ws/protocol/
compression.rs

1//! Compressing module
2
3#![allow(missing_docs)]
4use std::io::{self, Read};
5
6use flate2::{
7    bufread::{DeflateDecoder, DeflateEncoder},
8    Compression,
9};
10
11const PERMESSAFE_DEFLATE_TRAILER: &[u8] = &[0x00, 0x00, 0xff, 0xff];
12
13#[allow(missing_docs)]
14#[derive(Debug, Clone, Copy)]
15pub struct WebSocketCompressionConfig {
16    pub enabled: bool,
17    pub client_no_context_takeover: bool,
18    pub server_no_context_takeover: bool,
19    pub client_max_window_bits: Option<u8>,
20    pub server_max_window_bits: Option<u8>,
21}
22
23impl Default for WebSocketCompressionConfig {
24    fn default() -> Self {
25        Self {
26            enabled: true,
27            client_no_context_takeover: false,
28            server_no_context_takeover: false,
29            client_max_window_bits: None,
30            server_max_window_bits: None,
31        }
32    }
33}
34
35#[allow(missing_docs)]
36#[derive(Debug, Clone, Copy)]
37pub struct Compressor {
38    _no_context_takeover: bool,
39}
40
41#[allow(missing_docs)]
42impl Compressor {
43    pub fn new(no_context_takeover: bool) -> Self {
44        Self { _no_context_takeover: no_context_takeover }
45    }
46
47    pub fn compress(&mut self, data: &[u8]) -> io::Result<Vec<u8>> {
48        let mut encoder = DeflateEncoder::new(data, Compression::default());
49        let mut compressed = Vec::new();
50
51        encoder.read_to_end(&mut compressed)?;
52        Ok(compressed)
53    }
54}
55
56#[allow(missing_docs)]
57#[derive(Debug, Copy, Clone)]
58pub struct Decompressor {
59    _no_context_takeover: bool,
60}
61
62#[allow(missing_docs)]
63impl Decompressor {
64    pub fn new(no_context_takeover: bool) -> Self {
65        Self { _no_context_takeover: no_context_takeover }
66    }
67
68    pub fn decompress(&mut self, data: &[u8]) -> io::Result<Vec<u8>> {
69        let mut trailer_data = data.to_vec();
70        trailer_data.extend_from_slice(PERMESSAFE_DEFLATE_TRAILER);
71
72        let mut decoder = DeflateDecoder::new(&trailer_data[..]);
73        let mut decompressed = Vec::new();
74
75        decoder.read_to_end(&mut decompressed)?;
76        Ok(decompressed)
77    }
78}
79
80#[doc(hidden)]
81pub fn compress(data: &[u8]) -> io::Result<Vec<u8>> {
82    let mut encoder = DeflateEncoder::new(data, Compression::default());
83    let mut compressed = Vec::new();
84
85    encoder.read_to_end(&mut compressed)?;
86    compressed.extend_from_slice(PERMESSAFE_DEFLATE_TRAILER);
87    Ok(compressed)
88}
89
90#[doc(hidden)]
91pub fn decompress(data: &[u8]) -> io::Result<Vec<u8>> {
92    let stripped = if data.ends_with(PERMESSAFE_DEFLATE_TRAILER) {
93        &data[..data.len() - PERMESSAFE_DEFLATE_TRAILER.len()]
94    } else {
95        data
96    };
97
98    let mut decoder = DeflateDecoder::new(stripped);
99    let mut decompressed = Vec::new();
100
101    decoder.read_to_end(&mut decompressed)?;
102    Ok(decompressed)
103}