From: Richard Whitehouse Date: Sun, 29 Oct 2017 22:31:27 +0000 (+0000) Subject: Support Timestamp header X-Git-Url: https://git.richardwhiuk.com/?a=commitdiff_plain;h=d15a32409bb3331dcb605e891f04bf23f11787fd;p=rust-sip.git Support Timestamp header Use custom float macro to avoid https://github.com/Geal/nom/pull/448 --- diff --git a/src/codec.rs b/src/codec.rs index ff40f5f..ea08ff0 100644 --- a/src/codec.rs +++ b/src/codec.rs @@ -446,7 +446,8 @@ mod tests { biloxi.com;lr>\r\nReply-To:\r\nRequire:\ baz\r\nRetry-After:18000;duration=3600\r\nRoute:\r\nServer:rust-sip \ - tokio\r\nSubject:Foobaz\r\nSupported:rec\r\nVia: localhost\r\n\r\n") + tokio\r\nSubject:Foobaz\r\nSupported:rec\r\nTimestamp:1 2\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 2667bde..22c897c 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -19,6 +19,18 @@ use types::{PathSegment, HostPort, Host, Hostname, UriParameter, UriHeader, UriH Time, DateTime, ErrorUri, FromParam, From, Priority, Domain, DigestChallenge, Challenge, OptionTag, Route, ReplyTo, RetryAfterParam, RetryAfter, Server}; +pub fn float(input: &[u8]) -> IResult<&[u8], f32> { + flat_map!(input, + recognize!(tuple!(opt!(alt!(tag!("+") | tag!("-"))), + alt!(delimited!(digits, tag!("."), opt!(digits)) | + delimited!(opt!(digits), tag!("."), digits) | + digits), + opt!(complete!(tuple!(alt!(tag!("e") | tag!("E")), + opt!(alt!(tag!("+") | tag!("-"))), + digit))))), + parse_to!(f32)) +} + fn is_mark(c: u8) -> bool { c == b'-' || c == b'_' || c == b'.' || c == b'!' || c == b'~' || c == b'*' || c == b'\'' || c == b'(' || c == b')' @@ -558,7 +570,7 @@ named!(generic_param, separated_pair!( tag!(b"="), opt!(token))); -use nom::float as qvalue; +use self::float as qvalue; named!(qparam, preceded!(tag!(b"q="), qvalue)); @@ -1114,6 +1126,14 @@ named!(supported_header>, preceded!( tag!(b","), token))); +use self::float as delay; + +named!(timestamp_header>, dbg!(preceded!( + tag!(b"Timestamp:"), + dbg!(separated_nonempty_list!( + dbg!(tag!(b" ")), + dbg!(delay)))))); + named!(pub header
, alt!( // RFC 3261 Headers accept_header => { |a| Header::Accept(a) } | @@ -1152,5 +1172,6 @@ named!(pub header
, alt!( route_header => { |r| Header::Route(r) } | server_header => { |s| Header::Server(s) } | subject_header => { |s| Header::Subject(s) } | - supported_header => { |s| Header::Supported(s) } + supported_header => { |s| Header::Supported(s) } | + timestamp_header => { |t| Header::Timestamp(t) } )); diff --git a/src/types.rs b/src/types.rs index 89ac8e8..bfcc638 100644 --- a/src/types.rs +++ b/src/types.rs @@ -428,6 +428,7 @@ pub enum Header { Server(Vec), Subject(Vec), Supported(Vec), + Timestamp(Vec), To(Uri), Extension { name: String, value: String }, }