use super::uint::*;
use nom7::branch::alt;
-use nom7::bytes::complete::{is_a, tag};
+use nom7::bytes::complete::{is_a, tag, take_while};
use nom7::character::complete::char;
-use nom7::combinator::{opt, value};
+use nom7::combinator::{all_consuming, opt, value};
use nom7::IResult;
use std::ffi::CStr;
let (i, _) = opt(is_a(" "))(i)?;
let (i, _) = char(',')(i)?;
let (i, _) = opt(is_a(" "))(i)?;
- return alt((value(true, tag("raw")), value(false, tag("norm"))))(i);
+ let (i, v) = alt((value(true, tag("raw")), value(false, tag("norm"))))(i)?;
+ let (i, _) = opt(is_a(" "))(i)?;
+ Ok((i, v))
}
pub fn detect_parse_urilen(i: &str) -> IResult<&str, DetectUrilenData> {
let (i, du16) = detect_parse_uint_notending::<u16>(i)?;
- let (i, raw) = opt(detect_parse_urilen_raw)(i)?;
- match raw {
- Some(raw_buffer) => {
- return Ok((i, DetectUrilenData { du16, raw_buffer }));
- }
- None => {
- return Ok((
- i,
- DetectUrilenData {
- du16,
- raw_buffer: false,
- },
- ));
- }
+ let (i, _) = take_while(|c| c == ' ')(i)?;
+ if i.is_empty() {
+ return Ok((
+ i,
+ DetectUrilenData {
+ du16,
+ raw_buffer: false,
+ },
+ ));
}
+ let (i, raw_buffer) = all_consuming(detect_parse_urilen_raw)(i)?;
+ return Ok((i, DetectUrilenData { du16, raw_buffer }));
}
#[no_mangle]
// Just unbox...
std::mem::drop(Box::from_raw(ctx));
}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn test_parse_urilen() {
+ let (_, ctx) = detect_parse_urilen("1<>3").unwrap();
+ assert_eq!(ctx.du16.arg1, 1);
+ assert_eq!(ctx.du16.arg2, 3);
+ assert_eq!(ctx.du16.mode, DetectUintMode::DetectUintModeRange);
+ assert!(detect_parse_urilen("1<>2").is_err());
+ }
+}