mod decoder;
mod dynamic_table;
mod encoder;
mod error;
mod huffman;
mod integer;
mod static_table;
pub use decoder::Decoder;
pub use encoder::Encoder;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_basic_encode_decode() {
let mut encoder = Encoder::new();
let headers = [
(b":method".as_slice(), b"GET".as_slice()),
(b":scheme".as_slice(), b"http".as_slice()),
(b":path".as_slice(), b"/".as_slice()),
];
let encoded = encoder.encode(&headers);
let mut decoder = Decoder::new();
let mut decoded = Vec::new();
decoder
.decode_with_cb(&encoded, |name, value| {
decoded.push((name.to_vec(), value.to_vec()));
})
.unwrap();
assert_eq!(decoded.len(), 3);
assert_eq!(decoded[0].0, b":method");
assert_eq!(decoded[0].1, b"GET");
}
#[test]
fn test_rfc_c3_request_without_huffman() {
let mut encoder = Encoder::new();
let headers = [
(b":method".as_slice(), b"GET".as_slice()),
(b":scheme".as_slice(), b"http".as_slice()),
(b":path".as_slice(), b"/".as_slice()),
(b":authority".as_slice(), b"www.example.com".as_slice()),
];
let encoded = encoder.encode(&headers);
let mut decoder = Decoder::new();
let mut decoded = Vec::new();
decoder
.decode_with_cb(&encoded, |name, value| {
decoded.push((name.to_vec(), value.to_vec()));
})
.unwrap();
assert_eq!(decoded.len(), 4);
assert_eq!(decoded[0].0, b":method");
assert_eq!(decoded[0].1, b"GET");
assert_eq!(decoded[1].0, b":scheme");
assert_eq!(decoded[1].1, b"http");
assert_eq!(decoded[2].0, b":path");
assert_eq!(decoded[2].1, b"/");
assert_eq!(decoded[3].0, b":authority");
assert_eq!(decoded[3].1, b"www.example.com");
}
#[test]
fn test_rfc_c4_request_with_huffman() {
let mut encoder = Encoder::new();
let headers = [
(b":method".as_slice(), b"GET".as_slice()),
(b":scheme".as_slice(), b"http".as_slice()),
(b":path".as_slice(), b"/".as_slice()),
(b":authority".as_slice(), b"www.example.com".as_slice()),
];
let encoded = encoder.encode(&headers);
let mut decoder = Decoder::new();
let mut decoded = Vec::new();
decoder
.decode_with_cb(&encoded, |name, value| {
decoded.push((name.to_vec(), value.to_vec()));
})
.unwrap();
assert_eq!(decoded.len(), 4);
assert_eq!(decoded[0].0, b":method");
assert_eq!(decoded[0].1, b"GET");
assert_eq!(decoded[3].0, b":authority");
assert_eq!(decoded[3].1, b"www.example.com");
}
#[test]
fn test_rfc_c2_literal_header_with_indexing() {
let mut encoder = Encoder::new();
let headers = [(b"custom-key".as_slice(), b"custom-header".as_slice())];
let encoded = encoder.encode(&headers);
assert!(!encoded.is_empty());
assert_eq!(encoded[0] & 0xC0, 0x40);
let mut decoder = Decoder::new();
let mut decoded = Vec::new();
decoder
.decode_with_cb(&encoded, |name, value| {
decoded.push((name.to_vec(), value.to_vec()));
})
.unwrap();
assert_eq!(decoded.len(), 1);
assert_eq!(decoded[0].0, b"custom-key");
assert_eq!(decoded[0].1, b"custom-header");
}
#[test]
fn test_multiple_headers_round_trip() {
let mut encoder = Encoder::new();
let headers = [
(b":method".as_slice(), b"GET".as_slice()),
(b":scheme".as_slice(), b"https".as_slice()),
(b":path".as_slice(), b"/index.html".as_slice()),
(b":authority".as_slice(), b"www.example.com".as_slice()),
(b"user-agent".as_slice(), b"Mozilla/5.0".as_slice()),
];
let encoded = encoder.encode(&headers);
let mut decoder = Decoder::new();
let mut decoded = Vec::new();
decoder
.decode_with_cb(&encoded, |name, value| {
decoded.push((name.to_vec(), value.to_vec()));
})
.unwrap();
assert_eq!(decoded.len(), 5);
assert_eq!(decoded[0].0, b":method");
assert_eq!(decoded[0].1, b"GET");
assert_eq!(decoded[4].0, b"user-agent");
assert_eq!(decoded[4].1, b"Mozilla/5.0");
}
}