validate header len

This commit is contained in:
yggverse 2025-03-19 03:13:37 +02:00
parent b62f990bf2
commit 6dbf49cea3
2 changed files with 44 additions and 27 deletions

View file

@ -60,26 +60,35 @@ impl std::str::FromStr for Success {
type Err = Error; type Err = Error;
fn from_str(header: &str) -> Result<Self, Self::Err> { fn from_str(header: &str) -> Result<Self, Self::Err> {
use glib::{Regex, RegexCompileFlags, RegexMatchFlags}; use glib::{Regex, RegexCompileFlags, RegexMatchFlags};
match Regex::split_simple(
r"^20\s([^\/]+\/[^\s;]+)", if header.len() > super::HEADER_LEN {
header, return Err(Error::HeaderLen(header.len()));
RegexCompileFlags::DEFAULT, }
RegexMatchFlags::DEFAULT,
) // * keep separator after code as expected by protocol
.get(1) match header.strip_prefix("20") {
{ Some(postfix) => match Regex::split_simple(
Some(mime) => { r"^\s+([^\/]+\/[^\s;]+)",
let mime = mime.trim(); postfix,
if mime.is_empty() { RegexCompileFlags::DEFAULT,
Err(Error::Mime) RegexMatchFlags::DEFAULT,
} else { )
Ok(Self::Default { .get(1)
header: header.to_string(), {
mime: mime.to_lowercase(), Some(mime) => {
}) let mime = mime.trim();
if mime.is_empty() {
Err(Error::ContentType)
} else {
Ok(Self::Default {
header: header.to_string(),
mime: mime.to_lowercase(),
})
}
} }
} None => Err(Error::ContentType),
None => Err(Error::Protocol), },
None => Err(Error::Code),
} }
} }
} }

View file

@ -5,23 +5,31 @@ use std::{
#[derive(Debug)] #[derive(Debug)]
pub enum Error { pub enum Error {
Protocol, Code,
Mime, ContentType,
HeaderLen(usize),
Utf8Error(Utf8Error), Utf8Error(Utf8Error),
} }
impl Display for Error { impl Display for Error {
fn fmt(&self, f: &mut Formatter) -> Result { fn fmt(&self, f: &mut Formatter) -> Result {
match self { match self {
Self::Code => {
write!(f, "Unexpected status code")
}
Self::ContentType => {
write!(f, "Content type required")
}
Self::HeaderLen(l) => {
write!(
f,
"Header length reached protocol limit ({l} of {} bytes max)",
super::super::HEADER_LEN
)
}
Self::Utf8Error(e) => { Self::Utf8Error(e) => {
write!(f, "UTF-8 error: {e}") write!(f, "UTF-8 error: {e}")
} }
Self::Protocol => {
write!(f, "Protocol error")
}
Self::Mime => {
write!(f, "MIME error")
}
} }
} }
} }