pub(crate) enum DetectResult {
Match,
NeedMore,
NoMatch,
}
pub(crate) fn detect_http_method(prefix: &[u8]) -> DetectResult {
if let Some(space_pos) = prefix.iter().position(|&b| b == b' ') {
let method_token = &prefix[..space_pos];
if method_token.is_empty() || method_token.len() > 16 {
return DetectResult::NoMatch;
}
let is_valid_method = method_token
.iter()
.all(|&b| b.is_ascii_uppercase() || b == b'-' || b.is_ascii_lowercase());
if is_valid_method {
DetectResult::Match
} else {
DetectResult::NoMatch
}
} else {
if prefix.len() > 16 {
return DetectResult::NoMatch;
}
let is_valid_prefix = prefix
.iter()
.all(|&b| b.is_ascii_uppercase() || b == b'-' || b.is_ascii_lowercase());
if is_valid_prefix {
DetectResult::NeedMore
} else {
DetectResult::NoMatch
}
}
}