Support To header
authorRichard Whitehouse <github@richardwhiuk.com>
Sun, 29 Oct 2017 22:47:23 +0000 (22:47 +0000)
committerRichard Whitehouse <github@richardwhiuk.com>
Sun, 29 Oct 2017 22:47:23 +0000 (22:47 +0000)
src/codec.rs
src/parser.rs
src/types.rs

index ea08ff0b48a98bb9a12469c6f9b313767b63a1c8..520986e93ff60fcafcff3148b9df63f0a420a412 100644 (file)
@@ -446,7 +446,8 @@ mod tests {
                            biloxi.com;lr>\r\nReply-To:<sip:bob@biloxi.com>\r\nRequire:\
                            baz\r\nRetry-After:18000;duration=3600\r\nRoute:<sip:bigbox3.site3.\
                            atlanta.com;lr>\r\nServer:rust-sip \
-                           tokio\r\nSubject:Foobaz\r\nSupported:rec\r\nTimestamp:1 2\r\nVia: \
+                           tokio\r\nSubject:Foobaz\r\nSupported:rec\r\nTimestamp:1 \
+                           2\r\nTo:<sip:operator@cs.columbia.edu>;tag=287447\r\nVia: \
                            localhost\r\n\r\n")
         });
 
index 22c897c911ff0048a187fe8c500e3f61033e144a..fb62ef9a0c6e5de0d560b051623eb9221d4591f8 100644 (file)
@@ -17,7 +17,7 @@ use types::{PathSegment, HostPort, Host, Hostname, UriParameter, UriHeader, UriH
             Credentials, CallId, Purpose, InfoParam, Info, NameAddr, ContactParam, Target,
             Contact, DispositionType, Handling, DispositionParam, ContentCoding, Day, Month, Date,
             Time, DateTime, ErrorUri, FromParam, From, Priority, Domain, DigestChallenge,
-            Challenge, OptionTag, Route, ReplyTo, RetryAfterParam, RetryAfter, Server};
+            Challenge, OptionTag, Route, ReplyTo, RetryAfterParam, RetryAfter, Server, ToParam, To};
 
 pub fn float(input: &[u8]) -> IResult<&[u8], f32> {
     flat_map!(input,
@@ -1128,11 +1128,23 @@ named!(supported_header<Vec<OptionTag>>, preceded!(
 
 use self::float as delay;
 
-named!(timestamp_header<Vec<f32>>, dbg!(preceded!(
+named!(timestamp_header<Vec<f32>>, preceded!(
        tag!(b"Timestamp:"),
-       dbg!(separated_nonempty_list!(
-               dbg!(tag!(b" ")),
-               dbg!(delay))))));
+       separated_nonempty_list!(
+               tag!(b" "),
+               delay)));
+
+named!(to_param<ToParam>, alt!(
+       preceded!(tag!("tag="), token) => { |t| ToParam::Tag(t) } |
+       generic_param => { |g| ToParam::Generic(g) }));
+
+named!(to_header<To>, preceded!(
+       alt!(tag!(b"To:") | tag!("t:")),
+       tuple!(
+               target,
+               many0!(preceded!(
+                       tag!(b";"),
+                       to_param)))));
 
 named!(pub header<Header>, alt!(
 // RFC 3261 Headers
@@ -1173,5 +1185,6 @@ named!(pub header<Header>, alt!(
        server_header => { |s| Header::Server(s) } |
        subject_header => { |s| Header::Subject(s) } |
        supported_header => { |s| Header::Supported(s) } |
-       timestamp_header => { |t| Header::Timestamp(t) }
+       timestamp_header => { |t| Header::Timestamp(t) } |
+       to_header => { |t| Header::To(t) }
 ));
index bfcc638792e22fd2446f5cca986328799791eb7e..a126d350febc1fff348c33d1a5db3b8813a212f8 100644 (file)
@@ -389,6 +389,14 @@ pub type RetryAfter = (u32, Vec<RetryAfterParam>);
 
 pub type Server = (Vec<u8>, Option<Vec<u8>>);
 
+#[derive(Debug)]
+pub enum ToParam {
+    Tag(Vec<u8>),
+    Generic(GenericParam),
+}
+
+pub type To = (Target, Vec<ToParam>);
+
 #[derive(Debug)]
 pub enum Header {
     Accept(Vec<AcceptRange>),
@@ -429,6 +437,6 @@ pub enum Header {
     Subject(Vec<u8>),
     Supported(Vec<OptionTag>),
     Timestamp(Vec<f32>),
-    To(Uri),
+    To(To),
     Extension { name: String, value: String },
 }