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)| {
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'\'' ||
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) }
));
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 },