From: Richard Whitehouse Date: Sun, 29 Oct 2017 11:00:43 +0000 (+0000) Subject: Support Accept-Encoding X-Git-Url: https://git.richardwhiuk.com/?a=commitdiff_plain;h=afcd70fc189b35ed162165b87808ec95b5a7de78;p=rust-sip.git Support Accept-Encoding --- diff --git a/src/codec.rs b/src/codec.rs index d4dead4..61069f8 100644 --- a/src/codec.rs +++ b/src/codec.rs @@ -424,12 +424,12 @@ mod tests { // Send a request let socket = TcpStream::connect(&addr, &handle); - let request = - socket.and_then(|socket| { - io::write_all(socket, - "MESSAGE sip:test.com SIP/2.0\r\nAccept:text/plain\r\nVia: \ - localhost\r\n\r\n") - }); + let request = socket.and_then(|socket| { + io::write_all(socket, + "MESSAGE sip:test.com \ + SIP/2.0\r\nAccept:text/plain\r\nAccept-Encoding:*\r\nVia: \ + localhost\r\n\r\n") + }); let finished = request.and_then(|(socket, _request)| { futures::done(socket.shutdown(Shutdown::Write).map(|_| socket)) diff --git a/src/parser.rs b/src/parser.rs index 081d7c4..ba3c361 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -11,7 +11,8 @@ use nom::ErrorKind::Custom; use types::{PathSegment, HostPort, Host, Hostname, UriParameter, UriHeader, UriHeaders, SipUri, Uri, HierarchicalPath, Authority, UriPath, UserInfo, AbsolutePath, Scheme, Method, Transport, UserParam, Version, RequestLine, StatusLine, TopLine, Header, MediaType, - MediaFullType, MediaParameter, MediaRange, GenericParam, AcceptParam, AcceptRange}; + MediaFullType, MediaParameter, MediaRange, GenericParam, AcceptParam, AcceptRange, + Coding, Encoding}; fn is_mark(c: u8) -> bool { c == b'-' || c == b'_' || c == b'.' || c == b'!' || c == b'~' || c == b'*' || c == b'\'' || @@ -519,12 +520,30 @@ named!(accept_range, tuple!( accept_param)))); named!(accept_header>, preceded!( - tag!("Accept:"), + tag!(b"Accept:"), separated_nonempty_list!( tag!(b","), accept_range))); +named!(codings, alt!( + tag!(b"*") => { |_| Coding::All } | + token => { |t| Coding::Content(t) } +)); + +named!(encoding, tuple!( + codings, + many0!(preceded!( + tag!(b";"), + accept_param)))); + +named!(accept_encoding_header>, preceded!( + tag!(b"Accept-Encoding:"), + separated_nonempty_list!( + tag!(b","), + encoding))); + named!(pub header
, alt!( // RFC 3261 Headers - accept_header => { |a| Header::Accept(a) } + accept_header => { |a| Header::Accept(a) } | + accept_encoding_header => { |a| Header::AcceptEncoding(a) } )); diff --git a/src/types.rs b/src/types.rs index 6135abf..747e00b 100644 --- a/src/types.rs +++ b/src/types.rs @@ -165,9 +165,18 @@ pub enum AcceptParam { pub type AcceptRange = (MediaRange, Vec); +#[derive(Debug)] +pub enum Coding { + All, + Content(Vec), +} + +pub type Encoding = (Coding, Vec); + #[derive(Debug)] pub enum Header { Accept(Vec), + AcceptEncoding(Vec), From(Uri), To(Uri), Extension { name: String, value: String },