Support Alert-Info
authorRichard Whitehouse <github@richardwhiuk.com>
Sun, 29 Oct 2017 11:54:25 +0000 (11:54 +0000)
committerRichard Whitehouse <github@richardwhiuk.com>
Sun, 29 Oct 2017 11:54:25 +0000 (11:54 +0000)
src/codec.rs
src/parser.rs
src/types.rs

index 2abd77929f83c2bec45e740a9e16a248e69b0dc2..044f2cf6877f84d309f76e53bdbaf3469c1a8f88 100644 (file)
@@ -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:<http://www.example.com/sounds/moo.wav>\r\nVia: \
+                           localhost\r\n\r\n")
         });
 
         let finished = request.and_then(|(socket, _request)| {
index 5ba5dfb1e71f806bd87adad63b419b2b29c37f38..6f395e294ac6a2e3e0e8e936dfd9ac7c88c4e059 100644 (file)
@@ -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<u8>)>, 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<Vec<Language>>, preceded!(
                tag!(b","),
                language)));
 
+named!(alert_param<AlertParam>, tuple!(
+       delimited!(
+               tag!(b"<"),
+               absolute_uri,
+               tag!(b">")
+       ),
+       many0!(generic_param)));
+
+named!(alert_info_header<Vec<AlertParam>>, preceded!(
+       tag!(b"Alert-Info:"),
+       separated_nonempty_list!(
+               tag!(b","),
+               alert_param)));
+
 named!(pub header<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) }
 ));
index f467a5b3d8c109df72b94bcf6ea28eb11cb471e6..4a443526bb2e849fa8da583f9f7a8107477fc66a 100644 (file)
@@ -101,6 +101,8 @@ pub struct SipUri {
     pub headers: Option<UriHeaders>,
 }
 
+pub type AbsoluteUri = (Scheme, UriPath);
+
 #[derive(Debug)]
 pub enum Uri {
     Sip(SipUri),
@@ -181,11 +183,14 @@ pub enum LanguageRange {
 
 pub type Language = (LanguageRange, Vec<AcceptParam>);
 
+pub type AlertParam = (AbsoluteUri, Vec<GenericParam>);
+
 #[derive(Debug)]
 pub enum Header {
     Accept(Vec<AcceptRange>),
     AcceptEncoding(Vec<Encoding>),
     AcceptLanguage(Vec<Language>),
+    AlertInfo(Vec<AlertParam>),
     From(Uri),
     To(Uri),
     Extension { name: String, value: String },