From f5cd12b029e341ffd2f3717092b24fb77a161869 Mon Sep 17 00:00:00 2001 From: Richard Whitehouse Date: Sat, 4 Nov 2017 19:21:25 +0000 Subject: [PATCH] Support Warning header --- src/codec.rs | 3 ++- src/parser.rs | 20 ++++++++++++++++++-- src/types.rs | 9 +++++++++ 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/codec.rs b/src/codec.rs index 106b977..8eddc2d 100644 --- a/src/codec.rs +++ b/src/codec.rs @@ -449,7 +449,8 @@ mod tests { tokio\r\nSubject:Foobaz\r\nSupported:rec\r\nTimestamp:1 \ 2\r\nTo:;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)| { diff --git a/src/parser.rs b/src/parser.rs index a4843da..7728c6c 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -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>, preceded!( tag!(b","), via))); +named!(warning_agent, alt!( + hostport => { |h| WarningAgent::Host(h) } | + token => { |p| WarningAgent::Pseudonym(p) })); + +named!(warning, tuple!( + terminated!(number, tag!(b" ")), + terminated!(warning_agent, tag!(b" ")), + quoted_string)); + +named!(warning_header>, preceded!( + tag!(b"Warning:"), + separated_nonempty_list!( + tag!(b","), + warning))); + named!(pub header
, alt!( // RFC 3261 Headers accept_header => { |a| Header::Accept(a) } | @@ -1247,5 +1262,6 @@ named!(pub 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) } )); diff --git a/src/types.rs b/src/types.rs index 298bb80..71c9ce4 100644 --- a/src/types.rs +++ b/src/types.rs @@ -422,6 +422,14 @@ pub enum ViaParam { pub type Via = (SentProtocol, HostPort, Vec); +#[derive(Debug)] +pub enum WarningAgent { + Host(HostPort), + Pseudonym(Vec), +} + +pub type Warning = (u16, WarningAgent, Vec); + #[derive(Debug)] pub enum Header { Accept(Vec), @@ -466,5 +474,6 @@ pub enum Header { Unsupported(Vec), UserAgent(Vec), Via(Vec), + Warning(Vec), Extension { name: String, value: String }, } -- 2.34.1