From 1dbfdb01835927b08d6b583d46900aad96aeb4eb Mon Sep 17 00:00:00 2001 From: Richard Whitehouse Date: Sun, 29 Oct 2017 15:49:59 +0000 Subject: [PATCH] Support Content-Language header --- src/codec.rs | 3 ++- src/parser.rs | 21 ++++++++++++++------- src/types.rs | 5 ++++- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/codec.rs b/src/codec.rs index 1ec9c14..09e2a8e 100644 --- a/src/codec.rs +++ b/src/codec.rs @@ -433,7 +433,8 @@ mod tests { username=\"Alice\"\r\nCall-ID:f81d4fae-7dec-11d0-a765-00a0c91e6bf6@foo.\ bar.com\r\nCall-Info:;\ 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)| { diff --git a/src/parser.rs b/src/parser.rs index de7320a..95c045a 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -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>, preceded!( named!(language_token>, many1!(alpha)); -named!(_language_range>>, separated_nonempty_list!( +named!(language_tag, separated_nonempty_list!( tag!(b"-"), language_token)); named!(language_range, alt!( tag!(b"*") => { |_| LanguageRange::All } | - _language_range => { |x : Vec>| LanguageRange::Range(x) })); + language_tag => { |x : LanguageTag| LanguageRange::Range(x) })); named!(language, tuple!( language_range, @@ -816,6 +816,12 @@ named!(content_encoding_header>, preceded!( tag!(b","), token))); +named!(content_language_header>, preceded!( + tag!(b"Content-Language:"), + separated_nonempty_list!( + tag!(b","), + language_tag))); + named!(pub header
, alt!( // RFC 3261 Headers accept_header => { |a| Header::Accept(a) } | @@ -829,5 +835,6 @@ named!(pub 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) } )); diff --git a/src/types.rs b/src/types.rs index 2beb957..2cb21a1 100644 --- a/src/types.rs +++ b/src/types.rs @@ -175,10 +175,12 @@ pub enum Coding { pub type Encoding = (Coding, Vec); +pub type LanguageTag = Vec>; + #[derive(Debug)] pub enum LanguageRange { All, - Range(Vec>), + Range(LanguageTag), } pub type Language = (LanguageRange, Vec); @@ -308,6 +310,7 @@ pub enum Header { Contact(Contact), ContentDisposition(DispositionType, Vec), ContentEncoding(Vec), + ContentLanguage(Vec), From(Uri), To(Uri), Extension { name: String, value: String }, -- 2.34.1