sipmsg/headers/parsers/
utf8_trim_header.rs

1use crate::{
2    common::{bnfcore::is_wsp, errorparse::SipParseError, nom_wrappers::take_sws},
3    headers::header::{HeaderValue, HeaderValueType},
4};
5use nom::bytes::complete::take_until;
6
7pub fn take(source_input: &[u8]) -> nom::IResult<&[u8], HeaderValue, SipParseError> {
8    let mut tmp_input = source_input;
9    loop {
10        let (input, _) = take_until("\r\n")(tmp_input)?;
11        if input.len() > 3 && is_wsp(input[2]) {
12            let (input, _) = take_sws(input)?;
13            tmp_input = input;
14            continue;
15        }
16        tmp_input = input;
17        break;
18    }
19    let (_, hdr_val) = HeaderValue::new(
20        &source_input[..source_input.len() - tmp_input.len()],
21        HeaderValueType::Utf8Text,
22        None,
23        None,
24    )?;
25    Ok((tmp_input, hdr_val))
26}
27
28#[cfg(test)]
29mod test {
30    use super::*;
31
32    #[test]
33    fn test_utf8text_value() {
34        let (input, val) = take("Boxes by Bob\r\n".as_bytes()).unwrap();
35        assert_eq!(val.vstr, "Boxes by Bob");
36        assert_eq!(input, b"\r\n");
37        let (input, val) = take("Boxes by Bob\r\n nextline\r\n".as_bytes()).unwrap();
38        assert_eq!(val.vstr, "Boxes by Bob\r\n nextline");
39        assert_eq!(input, b"\r\n");
40    }
41}