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:<sip:server10.\
- biloxi.com;lr>\r\nReply-To:<sip:bob@biloxi.com>\r\nRequire:baz\r\nVia: \
- localhost\r\n\r\n")
+ 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")
});
let finished = request.and_then(|(socket, _request)| {
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'\'' ||
tag!(b","),
token)));
+named!(retry_after_param<RetryAfterParam>, alt!(
+ preceded!(tag!(b"duration="), number) => { |d| RetryAfterParam::Duration(d) } |
+ generic_param => { |g| RetryAfterParam::Generic(g) }));
+
+named!(retry_after_header<RetryAfter>, preceded!(
+ tag!(b"Retry-After:"),
+ pair!(
+ number,
+ many0!(preceded!(
+ tag!(b";"),
+ retry_after_param
+ )))));
+
named!(pub header<Header>, alt!(
// RFC 3261 Headers
accept_header => { |a| Header::Accept(a) } |
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) }
));
pub type ReplyTo = (Target, Vec<GenericParam>);
+#[derive(Debug)]
+pub enum RetryAfterParam {
+ Duration(u32),
+ Generic(GenericParam),
+}
+
+pub type RetryAfter = (u32, Vec<RetryAfterParam>);
+
#[derive(Debug)]
pub enum Header {
Accept(Vec<AcceptRange>),
RecordRoute(Vec<Route>),
ReplyTo(Vec<ReplyTo>),
Require(Vec<OptionTag>),
+ RetryAfter(RetryAfter),
To(Uri),
Extension { name: String, value: String },
}