From: Richard Whitehouse Date: Sun, 29 Oct 2017 22:47:23 +0000 (+0000) Subject: Support To header X-Git-Url: https://git.richardwhiuk.com/?a=commitdiff_plain;h=834db5b3b68c32c8d4cebf6bf66c00c4286e97f4;p=rust-sip.git Support To header --- diff --git a/src/codec.rs b/src/codec.rs index ea08ff0..520986e 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\nTimestamp:1 2\r\nVia: \ + tokio\r\nSubject:Foobaz\r\nSupported:rec\r\nTimestamp:1 \ + 2\r\nTo:;tag=287447\r\nVia: \ localhost\r\n\r\n") }); diff --git a/src/parser.rs b/src/parser.rs index 22c897c..fb62ef9 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, RetryAfterParam, RetryAfter, Server}; + Challenge, OptionTag, Route, ReplyTo, RetryAfterParam, RetryAfter, Server, ToParam, To}; pub fn float(input: &[u8]) -> IResult<&[u8], f32> { flat_map!(input, @@ -1128,11 +1128,23 @@ named!(supported_header>, preceded!( use self::float as delay; -named!(timestamp_header>, dbg!(preceded!( +named!(timestamp_header>, preceded!( tag!(b"Timestamp:"), - dbg!(separated_nonempty_list!( - dbg!(tag!(b" ")), - dbg!(delay)))))); + separated_nonempty_list!( + tag!(b" "), + delay))); + +named!(to_param, alt!( + preceded!(tag!("tag="), token) => { |t| ToParam::Tag(t) } | + generic_param => { |g| ToParam::Generic(g) })); + +named!(to_header, preceded!( + alt!(tag!(b"To:") | tag!("t:")), + tuple!( + target, + many0!(preceded!( + tag!(b";"), + to_param))))); named!(pub header
, alt!( // RFC 3261 Headers @@ -1173,5 +1185,6 @@ named!(pub header
, alt!( server_header => { |s| Header::Server(s) } | subject_header => { |s| Header::Subject(s) } | supported_header => { |s| Header::Supported(s) } | - timestamp_header => { |t| Header::Timestamp(t) } + timestamp_header => { |t| Header::Timestamp(t) } | + to_header => { |t| Header::To(t) } )); diff --git a/src/types.rs b/src/types.rs index bfcc638..a126d35 100644 --- a/src/types.rs +++ b/src/types.rs @@ -389,6 +389,14 @@ pub type RetryAfter = (u32, Vec); pub type Server = (Vec, Option>); +#[derive(Debug)] +pub enum ToParam { + Tag(Vec), + Generic(GenericParam), +} + +pub type To = (Target, Vec); + #[derive(Debug)] pub enum Header { Accept(Vec), @@ -429,6 +437,6 @@ pub enum Header { Subject(Vec), Supported(Vec), Timestamp(Vec), - To(Uri), + To(To), Extension { name: String, value: String }, }