Support Timestamp header
authorRichard Whitehouse <github@richardwhiuk.com>
Sun, 29 Oct 2017 22:31:27 +0000 (22:31 +0000)
committerRichard Whitehouse <github@richardwhiuk.com>
Sun, 29 Oct 2017 22:31:27 +0000 (22:31 +0000)
Use custom float macro to avoid https://github.com/Geal/nom/pull/448

src/codec.rs
src/parser.rs
src/types.rs

index ff40f5f163602656e0abfa808c406d9e75b5d073..ea08ff0b48a98bb9a12469c6f9b313767b63a1c8 100644 (file)
@@ -446,7 +446,8 @@ mod tests {
                            biloxi.com;lr>\r\nReply-To:<sip:bob@biloxi.com>\r\nRequire:\
                            baz\r\nRetry-After:18000;duration=3600\r\nRoute:<sip:bigbox3.site3.\
                            atlanta.com;lr>\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)| {
index 2667bde53b4b7f48c444fbfc689ac92284976838..22c897c911ff0048a187fe8c500e3f61033e144a 100644 (file)
@@ -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<GenericParam>, separated_pair!(
        tag!(b"="),
        opt!(token)));
 
-use nom::float as qvalue;
+use self::float as qvalue;
 
 named!(qparam<f32>, preceded!(tag!(b"q="), qvalue));
 
@@ -1114,6 +1126,14 @@ named!(supported_header<Vec<OptionTag>>, preceded!(
                tag!(b","),
                token)));
 
+use self::float as delay;
+
+named!(timestamp_header<Vec<f32>>, dbg!(preceded!(
+       tag!(b"Timestamp:"),
+       dbg!(separated_nonempty_list!(
+               dbg!(tag!(b" ")),
+               dbg!(delay))))));
+
 named!(pub header<Header>, alt!(
 // RFC 3261 Headers
        accept_header => { |a| Header::Accept(a) } |
@@ -1152,5 +1172,6 @@ named!(pub header<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) }
 ));
index 89ac8e817b2143d5b520370e5bbb4d5cb7e23cb4..bfcc638792e22fd2446f5cca986328799791eb7e 100644 (file)
@@ -428,6 +428,7 @@ pub enum Header {
     Server(Vec<Server>),
     Subject(Vec<u8>),
     Supported(Vec<OptionTag>),
+    Timestamp(Vec<f32>),
     To(Uri),
     Extension { name: String, value: String },
 }