From: Richard Whitehouse Date: Sun, 29 Oct 2017 11:42:49 +0000 (+0000) Subject: Support Accept-Language X-Git-Url: https://git.richardwhiuk.com/?a=commitdiff_plain;h=88ba82b56dea90b3cae4dffa34d3eed48e1f9aa2;p=rust-sip.git Support Accept-Language --- diff --git a/src/codec.rs b/src/codec.rs index 61069f8..2abd779 100644 --- a/src/codec.rs +++ b/src/codec.rs @@ -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)| { diff --git a/src/parser.rs b/src/parser.rs index ba3c361..5ba5dfb 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -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>, preceded!( tag!(b","), encoding))); +named!(language_token>, many1!(alpha)); + +named!(_language_range>>, separated_nonempty_list!( + tag!(b"-"), + language_token)); + +named!(language_range, alt!( + tag!(b"*") => { |_| LanguageRange::All } | + _language_range => { |x : Vec>| LanguageRange::Range(x) })); + +named!(language, tuple!( + language_range, + many0!(preceded!( + tag!(b";"), + accept_param)))); + +named!(accept_language_header>, preceded!( + tag!(b"Accept-Language:"), + separated_nonempty_list!( + tag!(b","), + language))); + named!(pub 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) } )); diff --git a/src/types.rs b/src/types.rs index 747e00b..f467a5b 100644 --- a/src/types.rs +++ b/src/types.rs @@ -173,10 +173,19 @@ pub enum Coding { pub type Encoding = (Coding, Vec); +#[derive(Debug)] +pub enum LanguageRange { + All, + Range(Vec>), +} + +pub type Language = (LanguageRange, Vec); + #[derive(Debug)] pub enum Header { Accept(Vec), AcceptEncoding(Vec), + AcceptLanguage(Vec), From(Uri), To(Uri), Extension { name: String, value: String },