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

index 3d28cbe33b25c607ed3c4a493bbcc896c4dfb602..51c802a5d701a04dd7d52a93e5ddc83a92bc78cb 100644 (file)
@@ -445,7 +445,7 @@ mod tests {
                            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\nRoute:<sip:bigbox3.site3.\
-                           atlanta.com;lr>\r\nVia: localhost\r\n\r\n")
+                           atlanta.com;lr>\r\nServer:rust-sip tokio\r\nVia: localhost\r\n\r\n")
         });
 
         let finished = request.and_then(|(socket, _request)| {
index f414787f40a49c5a9743e4b3b7479212c1a00fed..271d44c8aabff7ec50d19df131e77240eaa02533 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, Server};
 
 fn is_mark(c: u8) -> bool {
     c == b'-' || c == b'_' || c == b'.' || c == b'!' || c == b'~' || c == b'*' || c == b'\'' ||
@@ -1092,6 +1092,18 @@ named!(route_header<Vec<Route>>, preceded!(
                tag!(b","),
                route)));
 
+named!(server<Server>, pair!(
+       token,
+       opt!(preceded!(
+               tag!(b"/"),
+               token))));
+
+named!(server_header<Vec<Server>>, preceded!(
+       tag!(b"Server:"),
+       separated_nonempty_list!(
+               tag!(b" "),
+               server)));
+
 named!(pub header<Header>, alt!(
 // RFC 3261 Headers
        accept_header => { |a| Header::Accept(a) } |
@@ -1127,5 +1139,6 @@ named!(pub header<Header>, alt!(
        reply_to_header => { |r| Header::ReplyTo(r) } |
        require_header => { |r| Header::Require(r) } |
        retry_after_header => { |r| Header::RetryAfter(r) } |
-       route_header => { |r| Header::Route(r) }
+       route_header => { |r| Header::Route(r) } |
+       server_header => { |s| Header::Server(s) }
 ));
index db98598a24f62871993802ad7c24d6aad0fdfed6..4b39daf9bf9969e4366a5c5dd221ded7235b2524 100644 (file)
@@ -387,6 +387,8 @@ pub enum RetryAfterParam {
 
 pub type RetryAfter = (u32, Vec<RetryAfterParam>);
 
+pub type Server = (Vec<u8>, Option<Vec<u8>>);
+
 #[derive(Debug)]
 pub enum Header {
     Accept(Vec<AcceptRange>),
@@ -423,6 +425,7 @@ pub enum Header {
     Require(Vec<OptionTag>),
     RetryAfter(RetryAfter),
     Route(Vec<Route>),
+    Server(Vec<Server>),
     To(Uri),
     Extension { name: String, value: String },
 }