jwt_hack/utils/
compression.rs1use anyhow::{anyhow, Result};
2use flate2::read::{DeflateDecoder, DeflateEncoder};
3use flate2::Compression;
4use std::io::Read;
5
6pub fn compress_deflate(data: &[u8]) -> Result<Vec<u8>> {
8 let mut encoder = DeflateEncoder::new(data, Compression::default());
9 let mut compressed = Vec::new();
10 encoder
11 .read_to_end(&mut compressed)
12 .map_err(|e| anyhow!("Failed to compress data: {}", e))?;
13 Ok(compressed)
14}
15
16pub fn decompress_deflate(compressed_data: &[u8]) -> Result<Vec<u8>> {
18 let mut decoder = DeflateDecoder::new(compressed_data);
19 let mut decompressed = Vec::new();
20 decoder
21 .read_to_end(&mut decompressed)
22 .map_err(|e| anyhow!("Failed to decompress data: {}", e))?;
23 Ok(decompressed)
24}
25
26#[cfg(test)]
27mod tests {
28 use super::*;
29
30 #[test]
31 fn test_compress_decompress_round_trip() {
32 let original_data = b"Hello, World! This is a test string for compression. This needs to be long enough to actually compress well. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.";
33
34 let compressed = compress_deflate(original_data).expect("Failed to compress data");
36
37 let decompressed = decompress_deflate(&compressed).expect("Failed to decompress data");
39
40 assert_eq!(original_data, decompressed.as_slice());
42 }
43
44 #[test]
45 fn test_compress_empty_data() {
46 let empty_data = b"";
47 let compressed = compress_deflate(empty_data).expect("Failed to compress empty data");
48 let decompressed =
49 decompress_deflate(&compressed).expect("Failed to decompress empty data");
50 assert_eq!(empty_data, decompressed.as_slice());
51 }
52
53 #[test]
54 fn test_compress_small_data() {
55 let small_data = b"a";
56 let compressed = compress_deflate(small_data).expect("Failed to compress small data");
57 let decompressed =
58 decompress_deflate(&compressed).expect("Failed to decompress small data");
59 assert_eq!(small_data, decompressed.as_slice());
60 }
61
62 #[test]
63 fn test_decompress_invalid_data() {
64 let invalid_data = b"this is not compressed data";
65 let result = decompress_deflate(invalid_data);
66 assert!(result.is_err(), "Decompressing invalid data should fail");
67 }
68
69 #[test]
70 fn test_compress_json_payload() {
71 let json_payload =
72 br#"{"sub":"1234567890","name":"John Doe","iat":1516239022,"exp":1516239922}"#;
73
74 let compressed = compress_deflate(json_payload).expect("Failed to compress JSON payload");
75 let decompressed =
76 decompress_deflate(&compressed).expect("Failed to decompress JSON payload");
77
78 assert_eq!(json_payload, decompressed.as_slice());
79 }
80}