mod error;
mod reader;
mod speed;
pub mod table1;
pub mod table2;
pub mod table3;
pub mod table4;
pub mod table5;
pub use error::*;
pub use speed::*;
use reader::*;
pub fn decode(
src: &[u8],
dst: &mut Vec<u8>,
speed: DecoderSpeed,
) -> Result<(), DecoderError> {
let mut reader = DecodeReader::new(speed as usize);
for byte in src {
reader.decode(*byte, dst)?;
}
reader.finalize(dst)?;
Ok(())
}
#[cfg(test)]
mod test {
use super::*;
fn decode(bytes: &[u8], speed: DecoderSpeed) -> Result<Vec<u8>, DecoderError> {
let mut dst = Vec::new();
super::decode(&bytes, &mut dst, speed)?;
Ok(dst)
}
fn valid_characters() -> Vec<(&'static [u8], Vec<u8>)> {
vec![
(&[0], vec![255, 199]), (&[1], vec![255, 255, 177]), (&[2], vec![255, 255, 254, 47]), (&[3], vec![255, 255, 254, 63]), (&[4], vec![255, 255, 254, 79]), (&[5], vec![255, 255, 254, 95]), (&[6], vec![255, 255, 254, 111]), (&[7], vec![255, 255, 254, 127]), (&[8], vec![255, 255, 254, 143]), (&[9], vec![255, 255, 234]), (&[10], vec![255, 255, 255, 243]), (&[11], vec![255, 255, 254, 159]), (&[12], vec![255, 255, 254, 175]), (&[13], vec![255, 255, 255, 247]), (&[14], vec![255, 255, 254, 191]), (&[15], vec![255, 255, 254, 207]), (&[16], vec![255, 255, 254, 223]), (&[17], vec![255, 255, 254, 239]), (&[18], vec![255, 255, 254, 255]), (&[19], vec![255, 255, 255, 15]), (&[20], vec![255, 255, 255, 31]), (&[21], vec![255, 255, 255, 47]), (&[22], vec![255, 255, 255, 251]), (&[23], vec![255, 255, 255, 63]), (&[24], vec![255, 255, 255, 79]), (&[25], vec![255, 255, 255, 95]), (&[26], vec![255, 255, 255, 111]), (&[27], vec![255, 255, 255, 127]), (&[28], vec![255, 255, 255, 143]), (&[29], vec![255, 255, 255, 159]), (&[30], vec![255, 255, 255, 175]), (&[31], vec![255, 255, 255, 191]), (b" ", vec![83]), (b"!", vec![254, 63]), (b"\"", vec![254, 127]), (b"#", vec![255, 175]), (b"$", vec![255, 207]), (b"%", vec![87]), (b"&", vec![248]), (b"'", vec![255, 95]), (b"(", vec![254, 191]), (b")", vec![254, 255]), (b"*", vec![249]), (b"+", vec![255, 127]), (b",", vec![250]), (b"-", vec![91]), (b".", vec![95]), (b"/", vec![99]), (b"0", vec![7]), (b"1", vec![15]), (b"2", vec![23]), (b"3", vec![103]), (b"4", vec![107]), (b"5", vec![111]), (b"6", vec![115]), (b"7", vec![119]), (b"8", vec![123]), (b"9", vec![127]), (b":", vec![185]), (b";", vec![251]), (b"<", vec![255, 249]), (b"=", vec![131]), (b">", vec![255, 191]), (b"?", vec![255, 63]), (b"@", vec![255, 215]), (b"A", vec![135]), (b"B", vec![187]), (b"C", vec![189]), (b"D", vec![191]), (b"E", vec![193]), (b"F", vec![195]), (b"G", vec![197]), (b"H", vec![199]), (b"I", vec![201]), (b"J", vec![203]), (b"K", vec![205]), (b"L", vec![207]), (b"M", vec![209]), (b"N", vec![211]), (b"O", vec![213]), (b"P", vec![215]), (b"Q", vec![217]), (b"R", vec![219]), (b"S", vec![221]), (b"T", vec![223]), (b"U", vec![225]), (b"V", vec![227]), (b"W", vec![229]), (b"X", vec![252]), (b"Y", vec![231]), (b"Z", vec![253]), (b"[", vec![255, 223]), (b"\\", vec![255, 254, 31]), (b"]", vec![255, 231]), (b"^", vec![255, 243]), (b"_", vec![139]), (b"`", vec![255, 251]), (b"a", vec![31]), (b"b", vec![143]), (b"c", vec![39]), (b"d", vec![147]), (b"e", vec![47]), (b"f", vec![151]), (b"g", vec![155]), (b"h", vec![159]), (b"i", vec![55]), (b"j", vec![233]), (b"k", vec![235]), (b"l", vec![163]), (b"m", vec![167]), (b"n", vec![171]), (b"o", vec![63]), (b"p", vec![175]), (b"q", vec![237]), (b"r", vec![179]), (b"s", vec![71]), (b"t", vec![79]), (b"u", vec![183]), (b"v", vec![239]), (b"w", vec![241]), (b"x", vec![243]), (b"y", vec![245]), (b"z", vec![247]), (b"{", vec![255, 253]), (b"|", vec![255, 159]), (b"}", vec![255, 247]), (b"~", vec![255, 239]), (&[127], vec![255, 255, 255, 207]), (&[128], vec![255, 254, 111]), (&[129], vec![255, 255, 75]), (&[130], vec![255, 254, 127]), (&[131], vec![255, 254, 143]), (&[132], vec![255, 255, 79]), (&[133], vec![255, 255, 83]), (&[134], vec![255, 255, 87]), (&[135], vec![255, 255, 179]), (&[136], vec![255, 255, 91]), (&[137], vec![255, 255, 181]), (&[138], vec![255, 255, 183]), (&[139], vec![255, 255, 185]), (&[140], vec![255, 255, 187]), (&[141], vec![255, 255, 189]), (&[142], vec![255, 255, 235]), (&[143], vec![255, 255, 191]), (&[144], vec![255, 255, 236]), (&[145], vec![255, 255, 237]), (&[146], vec![255, 255, 95]), (&[147], vec![255, 255, 193]), (&[148], vec![255, 255, 238]), (&[149], vec![255, 255, 195]), (&[150], vec![255, 255, 197]), (&[151], vec![255, 255, 199]), (&[152], vec![255, 255, 201]), (&[153], vec![255, 254, 231]), (&[154], vec![255, 255, 99]), (&[155], vec![255, 255, 203]), (&[156], vec![255, 255, 103]), (&[157], vec![255, 255, 205]), (&[158], vec![255, 255, 207]), (&[159], vec![255, 255, 239]), (&[160], vec![255, 255, 107]), (&[161], vec![255, 254, 239]), (&[162], vec![255, 254, 159]), (&[163], vec![255, 255, 111]), (&[164], vec![255, 255, 115]), (&[165], vec![255, 255, 209]), (&[166], vec![255, 255, 211]), (&[167], vec![255, 254, 247]), (&[168], vec![255, 255, 213]), (&[169], vec![255, 255, 119]), (&[170], vec![255, 255, 123]), (&[171], vec![255, 255, 240]), (&[172], vec![255, 254, 255]), (&[173], vec![255, 255, 127]), (&[174], vec![255, 255, 215]), (&[175], vec![255, 255, 217]), (&[176], vec![255, 255, 7]), (&[177], vec![255, 255, 15]), (&[178], vec![255, 255, 131]), (&[179], vec![255, 255, 23]), (&[180], vec![255, 255, 219]), (&[181], vec![255, 255, 135]), (&[182], vec![255, 255, 221]), (&[183], vec![255, 255, 223]), (&[184], vec![255, 254, 175]), (&[185], vec![255, 255, 139]), (&[186], vec![255, 255, 143]), (&[187], vec![255, 255, 147]), (&[188], vec![255, 255, 225]), (&[189], vec![255, 255, 151]), (&[190], vec![255, 255, 155]), (&[191], vec![255, 255, 227]), (&[192], vec![255, 255, 248, 63]), (&[193], vec![255, 255, 248, 127]), (&[194], vec![255, 254, 191]), (&[195], vec![255, 254, 63]), (&[196], vec![255, 255, 159]), (&[197], vec![255, 255, 229]), (&[198], vec![255, 255, 163]), (&[199], vec![255, 255, 246, 127]), (&[200], vec![255, 255, 248, 191]), (&[201], vec![255, 255, 248, 255]), (&[202], vec![255, 255, 249, 63]), (&[203], vec![255, 255, 251, 223]), (&[204], vec![255, 255, 251, 255]), (&[205], vec![255, 255, 249, 127]), (&[206], vec![255, 255, 241]), (&[207], vec![255, 255, 246, 255]), (&[208], vec![255, 254, 95]), (&[209], vec![255, 255, 31]), (&[210], vec![255, 255, 249, 191]), (&[211], vec![255, 255, 252, 31]), (&[212], vec![255, 255, 252, 63]), (&[213], vec![255, 255, 249, 255]), (&[214], vec![255, 255, 252, 95]), (&[215], vec![255, 255, 242]), (&[216], vec![255, 255, 39]), (&[217], vec![255, 255, 47]), (&[218], vec![255, 255, 250, 63]), (&[219], vec![255, 255, 250, 127]), (&[220], vec![255, 255, 255, 223]), (&[221], vec![255, 255, 252, 127]), (&[222], vec![255, 255, 252, 159]), (&[223], vec![255, 255, 252, 191]), (&[224], vec![255, 254, 207]), (&[225], vec![255, 255, 243]), (&[226], vec![255, 254, 223]), (&[227], vec![255, 255, 55]), (&[228], vec![255, 255, 167]), (&[229], vec![255, 255, 63]), (&[230], vec![255, 255, 71]), (&[231], vec![255, 255, 231]), (&[232], vec![255, 255, 171]), (&[233], vec![255, 255, 175]), (&[234], vec![255, 255, 247, 127]), (&[235], vec![255, 255, 247, 255]), (&[236], vec![255, 255, 244]), (&[237], vec![255, 255, 245]), (&[238], vec![255, 255, 250, 191]), (&[239], vec![255, 255, 233]), (&[240], vec![255, 255, 250, 255]), (&[241], vec![255, 255, 252, 223]), (&[242], vec![255, 255, 251, 63]), (&[243], vec![255, 255, 251, 127]), (&[244], vec![255, 255, 252, 255]), (&[245], vec![255, 255, 253, 31]), (&[246], vec![255, 255, 253, 63]), (&[247], vec![255, 255, 253, 95]), (&[248], vec![255, 255, 253, 127]), (&[249], vec![255, 255, 255, 239]), (&[250], vec![255, 255, 253, 159]), (&[251], vec![255, 255, 253, 191]), (&[252], vec![255, 255, 253, 223]), (&[253], vec![255, 255, 253, 255]), (&[254], vec![255, 255, 254, 31]), (&[255], vec![255, 255, 251, 191]), ] }
fn valid_literals() -> Vec<(Vec<u8>, Vec<u8>)> {
vec![(
vec![3, 4, 1, 2],
vec![255, 255, 254, 63, 255, 255, 228, 255, 255, 177, 255, 255, 252, 95],
), (
b":method".to_vec(),
vec![185, 73, 83, 57, 228],
), (
b":scheme".to_vec(),
vec![184, 130, 78, 90, 75],
), (
b":authority".to_vec(),
vec![184, 59, 83, 57, 236, 50, 125, 127],
), (
b"nibbstack.com".to_vec(),
vec![168, 209, 198, 132, 140, 157, 87, 33, 233],
), (
b"GET".to_vec(),
vec![197, 131, 127],
), (
b"http".to_vec(),
vec![157, 41, 175],
), (
b":path".to_vec(),
vec![185, 88, 211, 63],
), (
b"/images/top/sp2/cmn/logo-ns-130528.png".to_vec(),
vec![96, 212, 142, 98, 161, 132, 158, 182, 17, 88, 152, 37, 53, 49,65, 230, 58, 213, 33, 96, 178, 6, 196, 242, 245, 213, 55],
), (
b"hpack-test".to_vec(),
vec![158, 177, 147, 170, 201, 42, 19],
), (
b"xxxxxxx1".to_vec(),
vec![243, 231, 207, 159, 62, 124, 135],
), (
b"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0".to_vec(),
vec![208, 127, 102, 162, 129, 176, 218, 224, 83, 250, 208, 50, 26, 164, 157, 19, 253, 169, 146, 164, 150, 133, 52, 12, 138, 106, 220, 167, 226, 129, 2, 239, 125, 169, 103, 123, 129, 113, 112, 127, 106, 98, 41, 58, 157, 129, 0, 32, 0, 64, 21, 48, 154, 194, 202, 127, 44, 5, 197, 193],
), (
b"accept".to_vec(),
vec![25, 8, 90, 211],
), (
b"Accept".to_vec(),
vec![132, 132, 45, 105],
), (
b"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8".to_vec(),
vec![73, 124, 165, 137, 211, 77, 31, 67, 174, 186, 12, 65, 164, 199, 169, 143, 51, 166, 154, 63, 223, 154, 104, 250, 29, 117, 208, 98, 13, 38, 61, 76, 121, 166, 143, 190, 208, 1, 119, 254, 190, 88, 249, 251, 237, 0, 23, 123],
), (
b"cookie".to_vec(),
vec![33, 207, 212, 197],
), (
b"B=11231252zdf&b=3&s=0b".to_vec(),
vec![187, 0, 66, 38, 66, 38, 197, 238, 73, 126, 35, 129, 159, 132, 64, 8, 255],
), (
b"TE".to_vec(),
vec![223, 131],
), (
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi non bibendum libero. Etiam ultrices lorem ut.".to_vec(),
vec![206, 123, 11, 74, 134, 173, 22, 210, 164, 135, 160, 246, 40, 131, 37, 65, 210, 84, 253, 40, 67, 212, 130, 145, 37, 77, 182, 40, 57, 13, 89, 144, 67, 85, 50, 133, 160, 201, 93, 77, 7, 178, 51, 41, 81, 234, 82, 51, 70, 90, 164, 182, 149, 40, 52, 101, 176, 235, 169, 129, 38, 29, 42, 91, 66, 108, 49, 10, 133, 40, 61, 133, 165, 75, 82, 191],
), (
b"!$%&A".to_vec(),
vec![0b11111110, 0b00111111, 0b11110010, 0b10101111, 0b11000100, 0b00111111],
), (
b"\0\0\0".to_vec(),
vec![255, 199, 254, 63, 241],
), (
b"\0\x01\x02\x03\x04\x05".to_vec(),
vec![255, 199, 255, 253, 143, 255, 255, 226, 255, 255, 254, 63, 255, 255, 228, 255, 255, 254, 95],
), (
b"\xFF\xF8".to_vec(),
vec![255, 255, 251, 191, 255, 255, 95],
)]
}
fn invalid_encodings() -> Vec<Vec<u8>> {
vec![
vec![0, 23, 122],
vec![73, 124, 165, 137, 211, 77, 31, 67, 174, 186, 12, 65, 164, 199, 169, 143, 51, 166, 154, 63, 223, 154, 104, 250, 29, 117, 208, 98, 13, 38, 61, 76, 121, 166, 143, 190, 208, 1, 119, 254, 190, 88, 249, 251, 237, 0, 23, 122],
vec![0b11111111, 0b11111111], vec![0b00011111, 0b11111111, 0b11111111, 0b11111111, 0b11100000], vec![0b11111111, 0b10011111, 0b11111111, 0b11111111, 0b11111111, 0b10000000], vec![0b11111111, 0b00111111, 0b11111111, 0b11111111, 0b11111111], vec![0b11111111, 0b11111111, 0b11111111, 0b11111100], vec![0b11111111, 0b00111111, 0b11111111, 0b11111111, 0b11111111, 0b0], vec![0b11111111, 0b11111111, 0b11111111, 0b11111100, 0b0], ]
}
#[test]
fn decodes_characters() {
for speed in DecoderSpeed::known() {
for (data, code) in valid_characters() { assert_eq!(data, decode(&code, speed).unwrap());
}
}
}
#[test]
fn decodes_literals() {
for speed in DecoderSpeed::known() {
for (data, code) in valid_literals() { assert_eq!(data, decode(&code, speed).unwrap());
}
for encoding in invalid_encodings() { assert_eq!(Err(DecoderError::InvalidInput), decode(&encoding, speed));
}
}
}
}