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

index 1ec9c14265bd99ba2e7aed6192bf68ed95efa78a..09e2a8e1a0aad1565c699b4562f26c6dd6954dda 100644 (file)
@@ -433,7 +433,8 @@ mod tests {
                            username=\"Alice\"\r\nCall-ID:f81d4fae-7dec-11d0-a765-00a0c91e6bf6@foo.\
                            bar.com\r\nCall-Info:<http://wwww.example.com/alice/photo.jpg>;\
                            purpose=icon\r\nContact:*\r\nContent-Disposition:\
-                           session\r\nContent-Encoding:gzip\r\nVia: localhost\r\n\r\n")
+                           session\r\nContent-Encoding:gzip\r\nContent-Language:en-gb\r\nVia: \
+                           localhost\r\n\r\n")
         });
 
         let finished = request.and_then(|(socket, _request)| {
index de7320adcbad18a845493062a3db73083afa51ac..95c045a7a9b8d85fc437134789ed6a0667b204c7 100644 (file)
@@ -12,10 +12,10 @@ use types::{PathSegment, HostPort, Host, Hostname, UriParameter, UriHeader, UriH
             AbsoluteUri, Uri, HierarchicalPath, Authority, UriPath, UserInfo, AbsolutePath,
             Scheme, Method, Transport, UserParam, Version, RequestLine, StatusLine, TopLine,
             Header, MediaType, MediaFullType, MediaParameter, MediaRange, GenericParam,
-            AcceptParam, AcceptRange, Coding, Encoding, LanguageRange, Language, AlertParam, Qop,
-            AuthenticationInfo, AuthParam, Algorithm, DigestResponse, Credentials, CallId,
-            Purpose, InfoParam, Info, NameAddr, ContactParam, ContactTarget, Contact,
-            DispositionType, Handling, DispositionParam, ContentCoding};
+            AcceptParam, AcceptRange, Coding, Encoding, LanguageTag, LanguageRange, Language,
+            AlertParam, Qop, AuthenticationInfo, AuthParam, Algorithm, DigestResponse,
+            Credentials, CallId, Purpose, InfoParam, Info, NameAddr, ContactParam, ContactTarget,
+            Contact, DispositionType, Handling, DispositionParam, ContentCoding};
 
 fn is_mark(c: u8) -> bool {
     c == b'-' || c == b'_' || c == b'.' || c == b'!' || c == b'~' || c == b'*' || c == b'\'' ||
@@ -560,13 +560,13 @@ named!(accept_encoding_header<Vec<Encoding>>, preceded!(
 
 named!(language_token<Vec<u8>>, many1!(alpha));
 
-named!(_language_range<Vec<Vec<u8>>>, separated_nonempty_list!(
+named!(language_tag<LanguageTag>, 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) }));
+       language_tag => { |x : LanguageTag| LanguageRange::Range(x) }));
 
 named!(language<Language>, tuple!(
        language_range,
@@ -816,6 +816,12 @@ named!(content_encoding_header<Vec<ContentCoding>>, preceded!(
                tag!(b","),
                token)));
 
+named!(content_language_header<Vec<LanguageTag>>, preceded!(
+       tag!(b"Content-Language:"),
+       separated_nonempty_list!(
+               tag!(b","),
+               language_tag)));
+
 named!(pub header<Header>, alt!(
 // RFC 3261 Headers
        accept_header => { |a| Header::Accept(a) } |
@@ -829,5 +835,6 @@ named!(pub header<Header>, alt!(
        call_info_header => { |c| Header::CallInfo(c) } |
        contact_header => { |c| Header::Contact(c) } |
        content_disposition_header => { |(t, p)| Header::ContentDisposition(t, p) } |
-       content_encoding_header => { |e| Header::ContentEncoding(e) }
+       content_encoding_header => { |e| Header::ContentEncoding(e) } |
+       content_language_header => { |l| Header::ContentLanguage(l) }
 ));
index 2beb957e782d549cc57affbd3730ec8d7bb4e4f0..2cb21a112b0127cf02226812f096ea62a6f815bf 100644 (file)
@@ -175,10 +175,12 @@ pub enum Coding {
 
 pub type Encoding = (Coding, Vec<AcceptParam>);
 
+pub type LanguageTag = Vec<Vec<u8>>;
+
 #[derive(Debug)]
 pub enum LanguageRange {
     All,
-    Range(Vec<Vec<u8>>),
+    Range(LanguageTag),
 }
 
 pub type Language = (LanguageRange, Vec<AcceptParam>);
@@ -308,6 +310,7 @@ pub enum Header {
     Contact(Contact),
     ContentDisposition(DispositionType, Vec<DispositionParam>),
     ContentEncoding(Vec<ContentCoding>),
+    ContentLanguage(Vec<LanguageTag>),
     From(Uri),
     To(Uri),
     Extension { name: String, value: String },