libsip 0.2.6

SIP protocol Implementation, with a focus towords softphone clients.
Documentation
use libsip::{headers::parse::parse_via_header, *};

use nom::error::VerboseError;

#[test]
fn write() {
    let header = ViaHeader {
        version: Version::default(),
        transport: Transport::Udp,
        uri: Uri::new_schemaless(domain!("example.com")),
    };
    assert_eq!(
        "Via: SIP/2.0/UDP example.com".to_string(),
        format!("{}", header)
    );
}

#[test]
fn read() {
    let remains = vec!['\r' as u8, '\n' as u8];
    let header = ViaHeader {
        version: Version::default(),
        transport: Transport::Udp,
        uri: Uri::new_schemaless(domain!("example.com")),
    };
    assert_eq!(
        Ok((remains.as_ref(), Header::Via(header))),
        parse_via_header::<VerboseError<&[u8]>>(b"Via: SIP/2.0/UDP example.com\r\n")
    );

    let input = b"Via: SIP/2.0/UDP 192.168.1.120;rport;branch=z9hG4bK7Q6y313Qrt6Uc\r\n";
    let remains = vec!['\r' as u8, '\n' as u8];
    let header = ViaHeader {
        version: Version::default(),
        transport: Transport::Udp,
        uri: Uri::new_schemaless(ip_domain!(192, 168, 1, 120))
            .parameter(UriParam::RPort(None))
            .parameter(UriParam::Branch("z9hG4bK7Q6y313Qrt6Uc".into())),
    };
    assert_eq!(
        Ok((remains.as_ref(), Header::Via(header))),
        parse_via_header::<VerboseError<&[u8]>>(input)
    );

    let input = b"Via: SIP/2.0/UDP 192.168.1.1:5060;rport=5060;received=192.168.1.1;branch=8e7ec4e3d1e1380bc111f8723341ca70;transport=UDP\r\n";
    let remains = vec!['\r' as u8, '\n' as u8];
    let header = ViaHeader {
        version: Version::default(),
        transport: Transport::Udp,
        uri: Uri::new_schemaless(ip_domain!(192, 168, 1, 1, 5060))
            .parameter(UriParam::RPort(Some(5060)))
            .parameter(UriParam::Received(ip_domain!(192, 168, 1, 1)))
            .parameter(UriParam::Branch("8e7ec4e3d1e1380bc111f8723341ca70".into()))
            .parameter(UriParam::Transport(Transport::Udp)),
    };
    assert_eq!(
        Ok((remains.as_ref(), Header::Via(header))),
        parse_via_header::<VerboseError<&[u8]>>(input)
    );

    let input = b"Via: SIP/2.0/UDP 192.168.1.120;branch=03395ed83a7b9502c671c769bbe369cb;received=192.168.1.76\r\n";
    let remains = vec!['\r' as u8, '\n' as u8];
    let header = ViaHeader {
        version: Version::default(),
        transport: Transport::Udp,
        uri: Uri::new_schemaless(ip_domain!(192, 168, 1, 120))
            .parameter(UriParam::Branch("03395ed83a7b9502c671c769bbe369cb".into()))
            .parameter(UriParam::Received(ip_domain!(192, 168, 1, 76))),
    };
    assert_eq!(
        Ok((remains.as_ref(), Header::Via(header))),
        parse_via_header::<VerboseError<&[u8]>>(input)
    );
}