Header, MediaType, MediaFullType, MediaParameter, MediaRange, GenericParam,
AcceptParam, AcceptRange, Coding, Encoding, LanguageRange, Language, AlertParam, Qop,
AuthenticationInfo, AuthParam, Algorithm, DigestResponse, Credentials, CallId,
- Purpose, InfoParam, Info};
+ Purpose, InfoParam, Info, NameAddr, ContactParam, ContactTarget, Contact};
fn is_mark(c: u8) -> bool {
c == b'-' || c == b'_' || c == b'.' || c == b'!' || c == b'~' || c == b'*' || c == b'\'' ||
opaque_part => { |(b, o)| UriPath::Opaque(b, o) }
)));
-named!(request_uri<&[u8], Uri>, alt!(
+named!(uri<&[u8], Uri>, alt!(
sip_uri => { |(u, hp, p, h)| Uri::Sip(SipUri {
user_info: u,
host_port: hp,
method,
delimited!(
tag!(" "),
- request_uri,
+ uri,
tag!(" ")),
sip_version));
use nom::float as qvalue;
+named!(qparam<f32>, preceded!(tag!(b"q="), qvalue));
+
named!(accept_param<AcceptParam>, alt!(
- preceded!(tag!(b"q"), qvalue) => { |x| AcceptParam::Qvalue(x) } |
+ qparam => { |x| AcceptParam::Qvalue(x) } |
generic_param => { |x| AcceptParam::Generic(x) }));
named!(accept_range<AcceptRange>, tuple!(
tag!(","),
info)));
+named!(display_name<Vec<u8>>, alt!(
+ token |
+ quoted_string));
+
+named!(name_addr<NameAddr>, tuple!(
+ opt!(display_name),
+ delimited!(
+ tag!(b"<"),
+ uri,
+ tag!(b">"))));
+
+named!(expires<u32>, preceded!(
+ tag!(b"expires="),
+ number));
+
+named!(contact_param<ContactParam>, alt!(
+ qparam => {|q| ContactParam::Qvalue(q) } |
+ expires => {|e| ContactParam::Expires(e) } |
+ generic_param => {|g| ContactParam::Generic(g) }));
+
+named!(contact_target<(ContactTarget, Vec<ContactParam>)>, tuple!(
+ alt!(
+ name_addr => { |(n, u)| ContactTarget::Name(n, u) } |
+ uri => { |u| ContactTarget::Uri(u) }),
+ many0!(preceded!(
+ tag!(b";"),
+ contact_param
+ ))));
+
+named!(contact_header<Contact>, preceded!(
+ alt!(tag!(b"Contact:") | tag!(b"m")),
+ alt!(
+ tag!(b"*") => { |_| Contact::Star } |
+ separated_nonempty_list!(
+ tag!(","),
+ contact_target) => { |c| Contact::Contact(c) })));
+
named!(pub header<Header>, alt!(
// RFC 3261 Headers
accept_header => { |a| Header::Accept(a) } |
authentication_info_header => { |a| Header::AuthenticationInfo(a) } |
authorization_header => { |a| Header::Authorization(a) } |
call_id_header => { |c| Header::CallId(c) } |
- call_info_header => { |c| Header::CallInfo(c) }
+ call_info_header => { |c| Header::CallInfo(c) } |
+ contact_header => { |c| Header::Contact(c) }
));
pub type Info = (AbsoluteUri, Vec<InfoParam>);
+pub type NameAddr = (Option<Vec<u8>>, Uri);
+
+#[derive(Debug)]
+pub enum ContactParam {
+ Qvalue(f32),
+ Expires(u32),
+ Generic(GenericParam),
+}
+
+#[derive(Debug)]
+pub enum ContactTarget {
+ Name(Option<Vec<u8>>, Uri),
+ Uri(Uri),
+}
+
+#[derive(Debug)]
+pub enum Contact {
+ Star,
+ Contact(Vec<(ContactTarget, Vec<ContactParam>)>),
+}
+
#[derive(Debug)]
pub enum Header {
Accept(Vec<AcceptRange>),
Authorization(Credentials),
CallId(CallId),
CallInfo(Vec<Info>),
+ Contact(Contact),
From(Uri),
To(Uri),
Extension { name: String, value: String },