#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum HeaderFieldError {
EmptyFieldName,
UppercaseFieldName {
name: Vec<u8>,
},
InvalidFieldNameByte {
name: Vec<u8>,
byte: u8,
},
InvalidFieldValueByte {
name: Vec<u8>,
byte: u8,
},
FieldValueLeadingOrTrailingWhitespace {
name: Vec<u8>,
},
UnknownPseudoHeader {
name: Vec<u8>,
},
InvalidPseudoHeaderValue {
name: Vec<u8>,
value: Vec<u8>,
},
}
impl std::fmt::Display for HeaderFieldError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::EmptyFieldName => write!(f, "field name must not be empty"),
Self::UppercaseFieldName { name } => write!(
f,
"field name must be lowercase: {}",
String::from_utf8_lossy(name)
),
Self::InvalidFieldNameByte { name, byte } => write!(
f,
"field name contains invalid byte 0x{byte:02x}: {}",
String::from_utf8_lossy(name)
),
Self::InvalidFieldValueByte { name, byte } => write!(
f,
"field value of {} contains forbidden byte 0x{byte:02x}",
String::from_utf8_lossy(name)
),
Self::FieldValueLeadingOrTrailingWhitespace { name } => write!(
f,
"field value of {} must not start or end with SP/HTAB",
String::from_utf8_lossy(name)
),
Self::UnknownPseudoHeader { name } => write!(
f,
"unknown pseudo-header: {}",
String::from_utf8_lossy(name)
),
Self::InvalidPseudoHeaderValue { name, value } => write!(
f,
"invalid value for pseudo-header {}: {}",
String::from_utf8_lossy(name),
String::from_utf8_lossy(value)
),
}
}
}
impl std::error::Error for HeaderFieldError {}