sipmsg/headers/parsers/
utf8_trim_header.rs1use 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}