From: Pierre Chifflier Date: Wed, 12 Jan 2022 15:41:15 +0000 (+0100) Subject: rust/http2: convert parser to nom7 functions (HTTP2 ranges) X-Git-Tag: suricata-7.0.0-beta1~1051 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3e19ccdc0c144453fd7cde8fabad8368eb7dbe86;p=thirdparty%2Fsuricata.git rust/http2: convert parser to nom7 functions (HTTP2 ranges) --- diff --git a/rust/src/http2/range.rs b/rust/src/http2/range.rs index 1fc22b49dd..5adae63a47 100644 --- a/rust/src/http2/range.rs +++ b/rust/src/http2/range.rs @@ -22,10 +22,12 @@ use crate::core::{ use crate::filecontainer::FileContainer; use crate::http2::http2::HTTP2Transaction; -use nom::character::complete::digit1; -use nom::error::ErrorKind; -use nom::Err; -use nom::IResult; +use nom7::branch::alt; +use nom7::bytes::streaming::{take_till, take_while}; +use nom7::character::complete::{char, digit1}; +use nom7::combinator::{map_res, value}; +use nom7::error::{make_error, ErrorKind}; +use nom7::{Err, IResult}; use std::os::raw::c_uchar; use std::str::FromStr; @@ -38,52 +40,45 @@ pub struct HTTPContentRange { } pub fn http2_parse_content_range_star<'a>(input: &'a [u8]) -> IResult<&'a [u8], HTTPContentRange> { - let (i2, _) = char!(input, '*')?; - let (i2, _) = char!(i2, '/')?; - let (i2, size) = map_res!(i2, map_res!(digit1, std::str::from_utf8), i64::from_str)?; + let (i2, _) = char('*')(input)?; + let (i2, _) = char('/')(i2)?; + let (i2, size) = map_res(map_res(digit1, std::str::from_utf8), i64::from_str)(i2)?; return Ok(( i2, HTTPContentRange { start: -1, end: -1, - size: size, + size, }, )); } pub fn http2_parse_content_range_def<'a>(input: &'a [u8]) -> IResult<&'a [u8], HTTPContentRange> { - let (i2, start) = map_res!(input, map_res!(digit1, std::str::from_utf8), i64::from_str)?; - let (i2, _) = char!(i2, '-')?; - let (i2, end) = map_res!(i2, map_res!(digit1, std::str::from_utf8), i64::from_str)?; - let (i2, _) = char!(i2, '/')?; - let (i2, size) = alt!( - i2, - value!(-1, char!('*')) | map_res!(map_res!(digit1, std::str::from_utf8), i64::from_str) - )?; - return Ok(( - i2, - HTTPContentRange { - start: start, - end: end, - size: size, - }, - )); + let (i2, start) = map_res(map_res(digit1, std::str::from_utf8), i64::from_str)(input)?; + let (i2, _) = char('-')(i2)?; + let (i2, end) = map_res(map_res(digit1, std::str::from_utf8), i64::from_str)(i2)?; + let (i2, _) = char('/')(i2)?; + let (i2, size) = alt(( + value(-1, char('*')), + map_res(map_res(digit1, std::str::from_utf8), i64::from_str), + ))(i2)?; + return Ok((i2, HTTPContentRange { start, end, size })); } fn http2_parse_content_range<'a>(input: &'a [u8]) -> IResult<&'a [u8], HTTPContentRange> { - let (i2, _) = take_while!(input, |c| c == b' ')?; - let (i2, _) = take_till!(i2, |c| c == b' ')?; - let (i2, _) = take_while!(i2, |c| c == b' ')?; - return alt!( - i2, - http2_parse_content_range_star | http2_parse_content_range_def - ); + let (i2, _) = take_while(|c| c == b' ')(input)?; + let (i2, _) = take_till(|c| c == b' ')(i2)?; + let (i2, _) = take_while(|c| c == b' ')(i2)?; + return alt(( + http2_parse_content_range_star, + http2_parse_content_range_def, + ))(i2); } pub fn http2_parse_check_content_range<'a>(input: &'a [u8]) -> IResult<&'a [u8], HTTPContentRange> { let (rem, v) = http2_parse_content_range(input)?; if v.start > v.end { - return Err(Err::Error((rem, ErrorKind::Verify))); + return Err(Err::Error(make_error(rem, ErrorKind::Verify))); } return Ok((rem, v)); }