Support Accept-Encoding
authorRichard Whitehouse <github@richardwhiuk.com>
Sun, 29 Oct 2017 11:00:43 +0000 (11:00 +0000)
committerRichard Whitehouse <github@richardwhiuk.com>
Sun, 29 Oct 2017 11:00:43 +0000 (11:00 +0000)
src/codec.rs
src/parser.rs
src/types.rs

index d4dead4cace162c228fe92c722b1bfaa53839b55..61069f854cb76eb8285994e80215db90da9a9caa 100644 (file)
@@ -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))
index 081d7c497c4cd6b07bb9e4691a5a8c6732257457..ba3c361a59dc5ac8d87c3b8e3817c4f801e57b43 100644 (file)
@@ -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<AcceptRange>, tuple!(
                accept_param))));
 
 named!(accept_header<Vec<AcceptRange>>, preceded!(
-       tag!("Accept:"),
+       tag!(b"Accept:"),
        separated_nonempty_list!(
                tag!(b","),
                accept_range)));
 
+named!(codings<Coding>, alt!(
+       tag!(b"*") => { |_| Coding::All } |
+       token => { |t| Coding::Content(t) }
+));
+
+named!(encoding<Encoding>, tuple!(
+       codings,
+       many0!(preceded!(
+               tag!(b";"),
+               accept_param))));
+
+named!(accept_encoding_header<Vec<Encoding>>, preceded!(
+       tag!(b"Accept-Encoding:"),
+       separated_nonempty_list!(
+               tag!(b","),
+               encoding)));
+
 named!(pub header<Header>, alt!(
 // RFC 3261 Headers
-       accept_header => { |a| Header::Accept(a) }
+       accept_header => { |a| Header::Accept(a) } |
+       accept_encoding_header => { |a| Header::AcceptEncoding(a) }
 ));
index 6135abff1adf2325b8e8a131bad9f7ed3848b83e..747e00b58e59e3c03753d3dc4566f13d4139896f 100644 (file)
@@ -165,9 +165,18 @@ pub enum AcceptParam {
 
 pub type AcceptRange = (MediaRange, Vec<AcceptParam>);
 
+#[derive(Debug)]
+pub enum Coding {
+    All,
+    Content(Vec<u8>),
+}
+
+pub type Encoding = (Coding, Vec<AcceptParam>);
+
 #[derive(Debug)]
 pub enum Header {
     Accept(Vec<AcceptRange>),
+    AcceptEncoding(Vec<Encoding>),
     From(Uri),
     To(Uri),
     Extension { name: String, value: String },