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

index 61069f854cb76eb8285994e80215db90da9a9caa..2abd77929f83c2bec45e740a9e16a248e69b0dc2 100644 (file)
@@ -427,8 +427,8 @@ mod tests {
         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")
+                           SIP/2.0\r\nAccept:text/plain\r\nAccept-Encoding:*\r\nAccept-Language:\
+                           en-gb\r\nVia: localhost\r\n\r\n")
         });
 
         let finished = request.and_then(|(socket, _request)| {
index ba3c361a59dc5ac8d87c3b8e3817c4f801e57b43..5ba5dfb1e71f806bd87adad63b419b2b29c37f38 100644 (file)
@@ -12,7 +12,7 @@ use types::{PathSegment, HostPort, Host, Hostname, UriParameter, UriHeader, UriH
             Uri, HierarchicalPath, Authority, UriPath, UserInfo, AbsolutePath, Scheme, Method,
             Transport, UserParam, Version, RequestLine, StatusLine, TopLine, Header, MediaType,
             MediaFullType, MediaParameter, MediaRange, GenericParam, AcceptParam, AcceptRange,
-            Coding, Encoding};
+            Coding, Encoding, LanguageRange, Language};
 
 fn is_mark(c: u8) -> bool {
     c == b'-' || c == b'_' || c == b'.' || c == b'!' || c == b'~' || c == b'*' || c == b'\'' ||
@@ -542,8 +542,31 @@ named!(accept_encoding_header<Vec<Encoding>>, preceded!(
                tag!(b","),
                encoding)));
 
+named!(language_token<Vec<u8>>, many1!(alpha));
+
+named!(_language_range<Vec<Vec<u8>>>, separated_nonempty_list!(
+               tag!(b"-"),
+               language_token));
+
+named!(language_range<LanguageRange>, alt!(
+       tag!(b"*") => { |_| LanguageRange::All } |
+       _language_range => { |x : Vec<Vec<u8>>| LanguageRange::Range(x) }));
+
+named!(language<Language>, tuple!(
+       language_range,
+       many0!(preceded!(
+               tag!(b";"),
+               accept_param))));
+
+named!(accept_language_header<Vec<Language>>, preceded!(
+       tag!(b"Accept-Language:"),
+       separated_nonempty_list!(
+               tag!(b","),
+               language)));
+
 named!(pub header<Header>, alt!(
 // RFC 3261 Headers
        accept_header => { |a| Header::Accept(a) } |
-       accept_encoding_header => { |a| Header::AcceptEncoding(a) }
+       accept_encoding_header => { |a| Header::AcceptEncoding(a) } |
+       accept_language_header => { |a| Header::AcceptLanguage(a) }
 ));
index 747e00b58e59e3c03753d3dc4566f13d4139896f..f467a5b3d8c109df72b94bcf6ea28eb11cb471e6 100644 (file)
@@ -173,10 +173,19 @@ pub enum Coding {
 
 pub type Encoding = (Coding, Vec<AcceptParam>);
 
+#[derive(Debug)]
+pub enum LanguageRange {
+    All,
+    Range(Vec<Vec<u8>>),
+}
+
+pub type Language = (LanguageRange, Vec<AcceptParam>);
+
 #[derive(Debug)]
 pub enum Header {
     Accept(Vec<AcceptRange>),
     AcceptEncoding(Vec<Encoding>),
+    AcceptLanguage(Vec<Language>),
     From(Uri),
     To(Uri),
     Extension { name: String, value: String },