use std::io::{Read, Write};
use flate2::read::DeflateDecoder;
use flate2::write::DeflateEncoder;
use flate2::Compression;
use crate::error::SamlError;
pub const MAX_DEFLATE_RAW_DECODE_BYTES: usize = 1024 * 1024;
const DEFLATE_OUTPUT_LIMIT_EXCEEDED: &str = "ERR_DEFLATE_OUTPUT_LIMIT_EXCEEDED";
pub fn deflate_raw_encode(input: &[u8]) -> Result<Vec<u8>, SamlError> {
let mut encoder = DeflateEncoder::new(Vec::new(), Compression::default());
encoder.write_all(input)?;
Ok(encoder.finish()?)
}
pub fn deflate_raw_decode(input: &[u8]) -> Result<Vec<u8>, SamlError> {
deflate_raw_decode_with_limit(input, MAX_DEFLATE_RAW_DECODE_BYTES)
}
pub fn deflate_raw_decode_with_limit(
input: &[u8],
max_output_len: usize,
) -> Result<Vec<u8>, SamlError> {
let decoder = DeflateDecoder::new(input);
let mut out = Vec::with_capacity(input.len().min(max_output_len));
let read_limit = max_output_len.saturating_add(1);
let mut limited = decoder.take(read_limit as u64);
limited.read_to_end(&mut out)?;
if out.len() > max_output_len {
return Err(SamlError::Invalid(DEFLATE_OUTPUT_LIMIT_EXCEEDED.into()));
}
Ok(out)
}