use courierust::courierust_hpack::huffman::{decode, encode, HuffmanDecoder};
fn main() {
let input = b"www.example.com";
let mut wire = Vec::new();
let written = encode(input, &mut wire);
assert_eq!(written, input.len());
assert_eq!(
wire,
[0xf1, 0xe3, 0xc2, 0xe5, 0xf2, 0x3a, 0x6b, 0xa0, 0xab, 0x90, 0xf4, 0xff]
);
println!(
"encode {:?} ({} bytes) -> {} bytes",
String::from_utf8_lossy(input),
input.len(),
wire.len()
);
println!(" wire: {wire:02x?}");
let decoder = HuffmanDecoder::new();
let mut out = Vec::new();
let read = decoder.decode(&wire, &mut out, 1024).unwrap();
assert_eq!(read, input.len());
assert_eq!(&out[..], input);
println!(
"decode -> {} bytes: {:?}",
read,
String::from_utf8_lossy(&out)
);
for msg in [
b"accept-encoding: gzip, deflate".as_slice(),
b"courierust".as_slice(),
] {
let mut w = Vec::new();
encode(msg, &mut w);
out.clear();
let n = decoder.decode(&w, &mut out, 1024).unwrap();
assert_eq!(&out[..n], msg);
println!(
"round-trip {:?} ({} bytes -> {} bytes)",
String::from_utf8_lossy(msg),
msg.len(),
w.len()
);
}
let mut corrupted = wire.clone();
*corrupted.last_mut().unwrap() ^= 0x01;
let mut out = Vec::new();
let rejected = decode(&corrupted, &mut out).is_err();
assert!(rejected, "corrupted padding must be rejected");
println!("corrupted padding rejected (invalid padding check)");
}