sipmsg/headers/parsers/
alertinfo.rs

1use crate::{
2    common::{errorparse::SipParseError, take_sws_token},
3    headers::{
4        header::{HeaderTagType, HeaderTags, HeaderValue, HeaderValueType},
5        traits::SipHeaderParser,
6    },
7};
8
9use nom::bytes::complete::take_while1;
10
11/// Alert-Info   =  "Alert-Info" HCOLON alert-param *(COMMA alert-param)
12// alert-param  =  LAQUOT absoluteURI RAQUOT *( SEMI generic-param )
13pub struct AlertInfoParser;
14
15impl SipHeaderParser for AlertInfoParser {
16    fn take_value(source_input: &[u8]) -> nom::IResult<&[u8], HeaderValue, SipParseError> {
17        // let uri = take_while1(|c| !is_wsp(c) && c != b'>');
18        let (input, _) = take_sws_token::laquot(source_input)?;
19        let (input, uri) = take_while1(|c| c != b'>')(input)?;
20        let (input, spaces_after_raquot) = take_sws_token::raquot(input)?;
21
22
23        let mut tags = HeaderTags::new();
24        tags.insert(HeaderTagType::AbsoluteURI, uri);
25
26        // 1 for '>' char
27        let (_, hdr_val) = HeaderValue::new(
28            &source_input[..source_input.len() - input.len() - spaces_after_raquot.len()],
29            HeaderValueType::AbsoluteURI,
30            Some(tags),
31            None,
32        )?;
33        Ok((input, hdr_val))
34    }
35}
36
37#[cfg(test)]
38mod tests {
39    use super::*;
40    #[test]
41    fn headers_parse_test() {
42        let (input, val) = AlertInfoParser::take_value(
43            "<http://www.example.com/sounds/moo.wav>   \r\n".as_bytes(),
44        )
45        .unwrap();
46
47        assert_eq!(input, "\r\n".as_bytes());
48        assert_eq!(
49            val.tags().unwrap()[&HeaderTagType::AbsoluteURI],
50            "http://www.example.com/sounds/moo.wav".as_bytes()
51        );
52        assert_eq!(val.vstr, "<http://www.example.com/sounds/moo.wav>");
53
54        match AlertInfoParser::take_value("random word\r\n".as_bytes()) {
55            Ok((_, _)) => {
56                panic!();
57            }
58            Err(_) => {}
59        }
60    }
61}