From: Richard Whitehouse Date: Sun, 29 Oct 2017 11:54:25 +0000 (+0000) Subject: Support Alert-Info X-Git-Url: https://git.richardwhiuk.com/?a=commitdiff_plain;h=676968efeb72ffc3a1edd837b6d7d577a2ccac03;p=rust-sip.git Support Alert-Info --- diff --git a/src/codec.rs b/src/codec.rs index 2abd779..044f2cf 100644 --- a/src/codec.rs +++ b/src/codec.rs @@ -428,7 +428,8 @@ mod tests { io::write_all(socket, "MESSAGE sip:test.com \ SIP/2.0\r\nAccept:text/plain\r\nAccept-Encoding:*\r\nAccept-Language:\ - en-gb\r\nVia: localhost\r\n\r\n") + en-gb\r\nAlert-Info:\r\nVia: \ + localhost\r\n\r\n") }); let finished = request.and_then(|(socket, _request)| { diff --git a/src/parser.rs b/src/parser.rs index 5ba5dfb..6f395e2 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -9,10 +9,10 @@ use nom::IResult; use nom::ErrorKind::Custom; use types::{PathSegment, HostPort, Host, Hostname, UriParameter, UriHeader, UriHeaders, SipUri, - Uri, HierarchicalPath, Authority, UriPath, UserInfo, AbsolutePath, Scheme, Method, - Transport, UserParam, Version, RequestLine, StatusLine, TopLine, Header, MediaType, - MediaFullType, MediaParameter, MediaRange, GenericParam, AcceptParam, AcceptRange, - Coding, Encoding, LanguageRange, Language}; + AbsoluteUri, Uri, HierarchicalPath, Authority, UriPath, UserInfo, AbsolutePath, + Scheme, Method, Transport, UserParam, Version, RequestLine, StatusLine, TopLine, + Header, MediaType, MediaFullType, MediaParameter, MediaRange, GenericParam, + AcceptParam, AcceptRange, Coding, Encoding, LanguageRange, Language, AlertParam}; fn is_mark(c: u8) -> bool { c == b'-' || c == b'_' || c == b'.' || c == b'!' || c == b'~' || c == b'*' || c == b'\'' || @@ -371,7 +371,7 @@ named!(opaque_part<&[u8], (u8, Vec)>, pair!( uric_no_slash, many0!(uric))); -named!(absolute_uri<&[u8], (Scheme, UriPath)>, separated_pair!( +named!(absolute_uri<&[u8], AbsoluteUri>, separated_pair!( scheme, char!(':'), alt!( @@ -564,9 +564,24 @@ named!(accept_language_header>, preceded!( tag!(b","), language))); +named!(alert_param, tuple!( + delimited!( + tag!(b"<"), + absolute_uri, + tag!(b">") + ), + many0!(generic_param))); + +named!(alert_info_header>, preceded!( + tag!(b"Alert-Info:"), + separated_nonempty_list!( + tag!(b","), + alert_param))); + named!(pub header
, alt!( // RFC 3261 Headers accept_header => { |a| Header::Accept(a) } | accept_encoding_header => { |a| Header::AcceptEncoding(a) } | - accept_language_header => { |a| Header::AcceptLanguage(a) } + accept_language_header => { |a| Header::AcceptLanguage(a) } | + alert_info_header => { |a| Header::AlertInfo(a) } )); diff --git a/src/types.rs b/src/types.rs index f467a5b..4a44352 100644 --- a/src/types.rs +++ b/src/types.rs @@ -101,6 +101,8 @@ pub struct SipUri { pub headers: Option, } +pub type AbsoluteUri = (Scheme, UriPath); + #[derive(Debug)] pub enum Uri { Sip(SipUri), @@ -181,11 +183,14 @@ pub enum LanguageRange { pub type Language = (LanguageRange, Vec); +pub type AlertParam = (AbsoluteUri, Vec); + #[derive(Debug)] pub enum Header { Accept(Vec), AcceptEncoding(Vec), AcceptLanguage(Vec), + AlertInfo(Vec), From(Uri), To(Uri), Extension { name: String, value: String },