const INDEXED: u8 = 0b1000_0000;
const INDEXED_WITH_POST_BASE: u8 = 0b0001_0000;
const LITERAL: u8 = 0b0010_0000;
const LITERAL_WITH_NAME_REF: u8 = 0b0100_0000;
pub type Result<T> = std::result::Result<T, Error>;
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum Error {
BufferTooShort,
InvalidHuffmanEncoding,
InvalidStaticTableIndex,
InvalidHeaderValue,
}
impl std::fmt::Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "{:?}", self)
}
}
impl std::error::Error for Error {
fn description(&self) -> &str {
match self {
Error::BufferTooShort => "buffer is too short",
Error::InvalidHuffmanEncoding => "invalid huffman encoding",
Error::InvalidStaticTableIndex => "invalid QPACK static table index",
Error::InvalidHeaderValue => "invalid QPACK header name or value",
}
}
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
None
}
}
impl std::convert::From<crate::octets::BufferTooShortError> for Error {
fn from(_err: crate::octets::BufferTooShortError) -> Self {
Error::BufferTooShort
}
}
#[cfg(test)]
mod tests {
use crate::*;
use super::*;
#[test]
fn encode_decode() {
let mut encoded = [0u8; 240];
let headers = vec![
h3::Header::new(":path", "/rsrc.php/v3/yn/r/rIPZ9Qkrdd9.png"),
h3::Header::new("accept-encoding", "gzip, deflate, br"),
h3::Header::new("accept-language", "en-US,en;q=0.9"),
h3::Header::new("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.70 Safari/537.36"),
h3::Header::new("accept", "image/webp,image/apng,image/*,*/*;q=0.8"),
h3::Header::new("referer", "https://static.xx.fbcdn.net/rsrc.php/v3/yT/l/0,cross/dzXGESIlGQQ.css"),
h3::Header::new(":authority", "static.xx.fbcdn.net"),
h3::Header::new(":scheme", "https"),
h3::Header::new(":method", "GET"),
];
let mut enc = Encoder::new();
assert!(enc.encode(&headers, &mut encoded).is_ok());
let mut dec = Decoder::new();
assert_eq!(dec.decode(&mut encoded), Ok(headers));
}
}
pub use decoder::Decoder;
pub use encoder::Encoder;
mod decoder;
mod encoder;
mod huffman;