Support Route header
authorRichard Whitehouse <github@richardwhiuk.com>
Sun, 29 Oct 2017 21:55:42 +0000 (21:55 +0000)
committerRichard Whitehouse <github@richardwhiuk.com>
Sun, 29 Oct 2017 21:55:42 +0000 (21:55 +0000)
src/codec.rs
src/parser.rs
src/types.rs

index c9800300d4afa37bf05d4661959477e1f3f0508b..3d28cbe33b25c607ed3c4a493bbcc896c4dfb602 100644 (file)
@@ -444,7 +444,8 @@ mod tests {
                            Digest realm=\"atlanta.com\"\r\nProxy-Authorization:Digest \
                            username=\"Bob\"\r\nProxy-Require:foo\r\nRecord-Route:<sip:server10.\
                            biloxi.com;lr>\r\nReply-To:<sip:bob@biloxi.com>\r\nRequire:\
-                           baz\r\nRetry-After:18000;duration=3600\r\nVia: localhost\r\n\r\n")
+                           baz\r\nRetry-After:18000;duration=3600\r\nRoute:<sip:bigbox3.site3.\
+                           atlanta.com;lr>\r\nVia: localhost\r\n\r\n")
         });
 
         let finished = request.and_then(|(socket, _request)| {
index 3891e471b2c000eeff87e00790681378643dbfc6..f414787f40a49c5a9743e4b3b7479212c1a00fed 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 };
+            Challenge, OptionTag, Route, ReplyTo, RetryAfterParam, RetryAfter};
 
 fn is_mark(c: u8) -> bool {
     c == b'-' || c == b'_' || c == b'.' || c == b'!' || c == b'~' || c == b'*' || c == b'\'' ||
@@ -1086,6 +1086,12 @@ named!(retry_after_header<RetryAfter>, preceded!(
                        retry_after_param
                )))));
 
+named!(route_header<Vec<Route>>, preceded!(
+       tag!(b"Route:"),
+       separated_nonempty_list!(
+               tag!(b","),
+               route)));
+
 named!(pub header<Header>, alt!(
 // RFC 3261 Headers
        accept_header => { |a| Header::Accept(a) } |
@@ -1120,5 +1126,6 @@ named!(pub header<Header>, alt!(
        record_route_header => { |r| Header::RecordRoute(r) } |
        reply_to_header => { |r| Header::ReplyTo(r) } |
        require_header => { |r| Header::Require(r) } |
-       retry_after_header => { |r| Header::RetryAfter(r) }
+       retry_after_header => { |r| Header::RetryAfter(r) } |
+       route_header => { |r| Header::Route(r) }
 ));
index 826f6608136df6485b408f751fdd7faa83449e5f..db98598a24f62871993802ad7c24d6aad0fdfed6 100644 (file)
@@ -422,6 +422,7 @@ pub enum Header {
     ReplyTo(Vec<ReplyTo>),
     Require(Vec<OptionTag>),
     RetryAfter(RetryAfter),
+    Route(Vec<Route>),
     To(Uri),
     Extension { name: String, value: String },
 }