Support Warning header
authorRichard Whitehouse <github@richardwhiuk.com>
Sat, 4 Nov 2017 19:21:25 +0000 (19:21 +0000)
committerRichard Whitehouse <github@richardwhiuk.com>
Sat, 4 Nov 2017 19:21:25 +0000 (19:21 +0000)
src/codec.rs
src/parser.rs
src/types.rs

index 106b977d7d33dc654721738d1203740888b075f3..8eddc2d675080ccf5712d43ac6078cabb9f0b00c 100644 (file)
@@ -449,7 +449,8 @@ mod tests {
                            tokio\r\nSubject:Foobaz\r\nSupported:rec\r\nTimestamp:1 \
                            2\r\nTo:<sip:operator@cs.columbia.edu>;tag=287447\r\nUnsupported:\
                            100rel\r\nUser-Agent:rust-sip\r\nVia:SIP/2.0/UDP \
-                           pc33.atlanta.com;branch=z9hG4bK776asdhds\r\n\r\n")
+                           pc33.atlanta.com;branch=z9hG4bK776asdhds\r\nWarning:370 devnull \
+                           \"Failure\"\r\n\r\n")
         });
 
         let finished = request.and_then(|(socket, _request)| {
index a4843da55294870710c87c550466bcf89cb0050e..7728c6c309682bbdfbe2916c2b228920b19f676b 100644 (file)
@@ -18,7 +18,7 @@ use types::{PathSegment, HostPort, Host, Hostname, UriParameter, UriHeader, UriH
             Contact, DispositionType, Handling, DispositionParam, ContentCoding, Day, Month, Date,
             Time, DateTime, ErrorUri, FromParam, From, Priority, Domain, DigestChallenge,
             Challenge, OptionTag, Route, ReplyTo, RetryAfterParam, RetryAfter, Server, ToParam,
-            To, Protocol, SentProtocol, Received, ViaParam, Via};
+            To, Protocol, SentProtocol, Received, ViaParam, Via, WarningAgent, Warning};
 
 pub fn float(input: &[u8]) -> IResult<&[u8], f32> {
     flat_map!(input,
@@ -1204,6 +1204,21 @@ named!(via_header<Vec<Via>>, preceded!(
                tag!(b","),
                via)));
 
+named!(warning_agent<WarningAgent>, alt!(
+       hostport => { |h| WarningAgent::Host(h) } |
+       token => { |p| WarningAgent::Pseudonym(p) }));
+
+named!(warning<Warning>, tuple!(
+       terminated!(number, tag!(b" ")),
+       terminated!(warning_agent, tag!(b" ")),
+       quoted_string));
+
+named!(warning_header<Vec<Warning>>, preceded!(
+       tag!(b"Warning:"),
+       separated_nonempty_list!(
+               tag!(b","),
+               warning)));
+
 named!(pub header<Header>, alt!(
 // RFC 3261 Headers
        accept_header => { |a| Header::Accept(a) } |
@@ -1247,5 +1262,6 @@ named!(pub header<Header>, alt!(
        to_header => { |t| Header::To(t) } |
        unsupported_header => { |u| Header::Unsupported(u) } |
        user_agent_header => { |u| Header::UserAgent(u) } |
-       via_header => { |v| Header::Via(v) }
+       via_header => { |v| Header::Via(v) } |
+       warning_header => { |w| Header::Warning(w) }
 ));
index 298bb803df9b2c21d5afd87d4043f4ca5b8bd2e4..71c9ce4e1895681e5d1f318028ed611c5a84c9d2 100644 (file)
@@ -422,6 +422,14 @@ pub enum ViaParam {
 
 pub type Via = (SentProtocol, HostPort, Vec<ViaParam>);
 
+#[derive(Debug)]
+pub enum WarningAgent {
+    Host(HostPort),
+    Pseudonym(Vec<u8>),
+}
+
+pub type Warning = (u16, WarningAgent, Vec<u8>);
+
 #[derive(Debug)]
 pub enum Header {
     Accept(Vec<AcceptRange>),
@@ -466,5 +474,6 @@ pub enum Header {
     Unsupported(Vec<OptionTag>),
     UserAgent(Vec<Server>),
     Via(Vec<Via>),
+    Warning(Vec<Warning>),
     Extension { name: String, value: String },
 }