From: Richard Whitehouse Date: Sun, 29 Oct 2017 21:52:25 +0000 (+0000) Subject: Support Retry-After header X-Git-Url: https://git.richardwhiuk.com/?a=commitdiff_plain;h=a1a34726f707fac7c9f94a84466a6a69ff38ca61;p=rust-sip.git Support Retry-After header --- diff --git a/src/codec.rs b/src/codec.rs index 28be0fa..c980030 100644 --- a/src/codec.rs +++ b/src/codec.rs @@ -443,8 +443,8 @@ mod tests { 30\r\nOrganization:Foobar\r\nPriority:normal\r\nProxy-Authenticate:\ Digest realm=\"atlanta.com\"\r\nProxy-Authorization:Digest \ username=\"Bob\"\r\nProxy-Require:foo\r\nRecord-Route:\r\nReply-To:\r\nRequire:baz\r\nVia: \ - localhost\r\n\r\n") + biloxi.com;lr>\r\nReply-To:\r\nRequire:\ + baz\r\nRetry-After:18000;duration=3600\r\nVia: localhost\r\n\r\n") }); let finished = request.and_then(|(socket, _request)| { diff --git a/src/parser.rs b/src/parser.rs index 4d419d4..3891e47 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -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}; + 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'\'' || @@ -1073,6 +1073,19 @@ named!(require_header>, preceded!( tag!(b","), token))); +named!(retry_after_param, alt!( + preceded!(tag!(b"duration="), number) => { |d| RetryAfterParam::Duration(d) } | + generic_param => { |g| RetryAfterParam::Generic(g) })); + +named!(retry_after_header, preceded!( + tag!(b"Retry-After:"), + pair!( + number, + many0!(preceded!( + tag!(b";"), + retry_after_param + ))))); + named!(pub header
, alt!( // RFC 3261 Headers accept_header => { |a| Header::Accept(a) } | @@ -1106,5 +1119,6 @@ named!(pub header
, alt!( proxy_require_header => { |p| Header::ProxyRequire(p) } | record_route_header => { |r| Header::RecordRoute(r) } | reply_to_header => { |r| Header::ReplyTo(r) } | - require_header => { |r| Header::Require(r) } + require_header => { |r| Header::Require(r) } | + retry_after_header => { |r| Header::RetryAfter(r) } )); diff --git a/src/types.rs b/src/types.rs index a409639..826f660 100644 --- a/src/types.rs +++ b/src/types.rs @@ -379,6 +379,14 @@ pub type Route = (NameAddr, Vec); pub type ReplyTo = (Target, Vec); +#[derive(Debug)] +pub enum RetryAfterParam { + Duration(u32), + Generic(GenericParam), +} + +pub type RetryAfter = (u32, Vec); + #[derive(Debug)] pub enum Header { Accept(Vec), @@ -413,6 +421,7 @@ pub enum Header { RecordRoute(Vec), ReplyTo(Vec), Require(Vec), + RetryAfter(RetryAfter), To(Uri), Extension { name: String, value: String }, }