Skip to content

Commit 99ff7e6

Browse files
committed
feat(langtags): use true language tags in headers
Make hyper dependant on rust-language-tags providing complete parsing and formatting of language tags. Remove builtin solution for simple tags. BREAKING CHANGE: AcceptLanguage and ContentLanguage use LanguageTag now, Language removed from Hyper.
1 parent c3935d6 commit 99ff7e6

File tree

7 files changed

+47
-105
lines changed

7 files changed

+47
-105
lines changed

Diff for: Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ keywords = ["http", "hyper", "hyperium"]
1313

1414
[dependencies]
1515
httparse = "0.1"
16+
language-tags = "0.0.7"
1617
log = "0.3"
1718
mime = "0.0.12"
1819
num_cpus = "0.2"

Diff for: src/header/common/accept_language.rs

+22-35
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
use header::{Language, QualityItem};
1+
use language_tags::LanguageTag;
2+
use header::QualityItem;
23

34
header! {
45
#[doc="`Accept-Language` header, defined in"]
@@ -20,61 +21,47 @@ header! {
2021
#[doc=""]
2122
#[doc="# Examples"]
2223
#[doc="```"]
23-
#[doc="use hyper::header::{Headers, AcceptLanguage, Language, qitem};"]
24+
#[doc="use hyper::LanguageTag;"]
25+
#[doc="use hyper::header::{Headers, AcceptLanguage, qitem};"]
2426
#[doc=""]
2527
#[doc="let mut headers = Headers::new();"]
28+
#[doc="let mut langtag: LanguageTag = Default::default();"]
29+
#[doc="langtag.language = Some(\"en\".to_owned());"]
30+
#[doc="langtag.region = Some(\"US\".to_owned());"]
2631
#[doc="headers.set("]
2732
#[doc=" AcceptLanguage(vec!["]
28-
#[doc=" qitem("]
29-
#[doc=" Language {"]
30-
#[doc=" primary: \"en\".to_owned(),"]
31-
#[doc=" sub: Some(\"us\".to_owned()),"]
32-
#[doc=" }"]
33-
#[doc=" ),"]
33+
#[doc=" qitem(langtag),"]
3434
#[doc=" ])"]
3535
#[doc=");"]
3636
#[doc="```"]
3737
#[doc="```"]
38-
#[doc="use hyper::header::{Headers, AcceptLanguage, Language, QualityItem, Quality, qitem};"]
39-
#[doc=""]
38+
#[doc="# extern crate hyper;"]
39+
#[doc="# #[macro_use] extern crate language_tags;"]
40+
#[doc="# use hyper::header::{Headers, AcceptLanguage, QualityItem, Quality, qitem};"]
41+
#[doc="# "]
42+
#[doc="# fn main() {"]
4043
#[doc="let mut headers = Headers::new();"]
4144
#[doc="headers.set("]
4245
#[doc=" AcceptLanguage(vec!["]
43-
#[doc=" qitem("]
44-
#[doc=" Language {"]
45-
#[doc=" primary: \"da\".to_owned(),"]
46-
#[doc=" sub: None,"]
47-
#[doc=" }"]
48-
#[doc=" ),"]
49-
#[doc=" QualityItem::new("]
50-
#[doc=" Language {"]
51-
#[doc=" primary: \"en\".to_owned(),"]
52-
#[doc=" sub: Some(\"gb\".to_owned()),"]
53-
#[doc=" },"]
54-
#[doc=" Quality(800),"]
55-
#[doc=" ),"]
56-
#[doc=" QualityItem::new("]
57-
#[doc=" Language {"]
58-
#[doc=" primary: \"en\".to_owned(),"]
59-
#[doc=" sub: None,"]
60-
#[doc=" },"]
61-
#[doc=" Quality(700),"]
62-
#[doc=" ),"]
46+
#[doc=" qitem(langtag!(da)),"]
47+
#[doc=" QualityItem::new(langtag!(en;;;GB), Quality(800)),"]
48+
#[doc=" QualityItem::new(langtag!(en), Quality(700)),"]
6349
#[doc=" ])"]
6450
#[doc=");"]
51+
#[doc="# }"]
6552
#[doc="```"]
66-
(AcceptLanguage, "Accept-Language") => (QualityItem<Language>)+
53+
(AcceptLanguage, "Accept-Language") => (QualityItem<LanguageTag>)+
6754

6855
test_accept_language {
6956
// From the RFC
7057
test_header!(test1, vec![b"da, en-gb;q=0.8, en;q=0.7"]);
7158
// Own test
7259
test_header!(
73-
test2, vec![b"en-us, en; q=0.5, fr"],
60+
test2, vec![b"en-US, en; q=0.5, fr"],
7461
Some(AcceptLanguage(vec![
75-
qitem(Language {primary: "en".to_owned(), sub: Some("us".to_owned())}),
76-
QualityItem::new(Language{primary: "en".to_owned(), sub: None}, Quality(500)),
77-
qitem(Language {primary: "fr".to_owned(), sub: None}),
62+
qitem(langtag!(en;;;US)),
63+
QualityItem::new(langtag!(en), Quality(500)),
64+
qitem(langtag!(fr)),
7865
])));
7966
}
8067
}

Diff for: src/header/common/content_language.rs

+18-23
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
use header::{Language, QualityItem};
1+
use language_tags::LanguageTag;
2+
use header::QualityItem;
23

34
header! {
45
#[doc="`Content-Language` header, defined in"]
@@ -20,42 +21,36 @@ header! {
2021
#[doc=""]
2122
#[doc="# Examples"]
2223
#[doc="```"]
23-
#[doc="use hyper::header::{Headers, ContentLanguage, Language, qitem};"]
24-
#[doc=""]
24+
#[doc="# extern crate hyper;"]
25+
#[doc="# #[macro_use] extern crate language_tags;"]
26+
#[doc="# use hyper::header::{Headers, ContentLanguage, qitem};"]
27+
#[doc="# "]
28+
#[doc="# fn main() {"]
2529
#[doc="let mut headers = Headers::new();"]
2630
#[doc="headers.set("]
2731
#[doc=" ContentLanguage(vec!["]
28-
#[doc=" qitem("]
29-
#[doc=" Language { "]
30-
#[doc=" primary: \"en\".to_owned(),"]
31-
#[doc=" sub: None,"]
32-
#[doc=" }"]
33-
#[doc=" ),"]
32+
#[doc=" qitem(langtag!(en)),"]
3433
#[doc=" ])"]
3534
#[doc=");"]
35+
#[doc="# }"]
3636
#[doc="```"]
3737
#[doc="```"]
38-
#[doc="use hyper::header::{Headers, ContentLanguage, Language, qitem};"]
38+
#[doc="# extern crate hyper;"]
39+
#[doc="# #[macro_use] extern crate language_tags;"]
40+
#[doc="# use hyper::header::{Headers, ContentLanguage, qitem};"]
41+
#[doc="# "]
42+
#[doc="# fn main() {"]
3943
#[doc=""]
4044
#[doc="let mut headers = Headers::new();"]
4145
#[doc="headers.set("]
4246
#[doc=" ContentLanguage(vec!["]
43-
#[doc=" qitem("]
44-
#[doc=" Language {"]
45-
#[doc=" primary: \"da\".to_owned(),"]
46-
#[doc=" sub: None,"]
47-
#[doc=" }"]
48-
#[doc=" ),"]
49-
#[doc=" qitem("]
50-
#[doc=" Language {"]
51-
#[doc=" primary: \"en\".to_owned(),"]
52-
#[doc=" sub: Some(\"gb\".to_owned()),"]
53-
#[doc=" }"]
54-
#[doc=" ),"]
47+
#[doc=" qitem(langtag!(da)),"]
48+
#[doc=" qitem(langtag!(en;;;GB)),"]
5549
#[doc=" ])"]
5650
#[doc=");"]
51+
#[doc="# }"]
5752
#[doc="```"]
58-
(ContentLanguage, "Content-Language") => (QualityItem<Language>)+
53+
(ContentLanguage, "Content-Language") => (QualityItem<LanguageTag>)+
5954

6055
test_content_language {
6156
test_header!(test1, vec![b"da"]);

Diff for: src/header/common/mod.rs

+2
Original file line numberDiff line numberDiff line change
@@ -103,10 +103,12 @@ macro_rules! __hyper__deref {
103103
macro_rules! __hyper__tm {
104104
($id:ident, $tm:ident{$($tf:item)*}) => {
105105
#[allow(unused_imports)]
106+
#[cfg(test)]
106107
mod $tm{
107108
use std::str;
108109
use $crate::header::*;
109110
use $crate::mime::*;
111+
use $crate::language_tags::*;
110112
use $crate::method::Method;
111113
use super::$id as HeaderField;
112114
$($tf)*

Diff for: src/header/shared/language.rs

-45
This file was deleted.

Diff for: src/header/shared/mod.rs

-2
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,10 @@ pub use self::charset::Charset;
22
pub use self::encoding::Encoding;
33
pub use self::entity::EntityTag;
44
pub use self::httpdate::HttpDate;
5-
pub use self::language::Language;
65
pub use self::quality_item::{Quality, QualityItem, qitem, q};
76

87
mod charset;
98
mod encoding;
109
mod entity;
1110
mod httpdate;
12-
mod language;
1311
mod quality_item;

Diff for: src/lib.rs

+4
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,9 @@ extern crate traitobject;
141141
extern crate typeable;
142142
extern crate solicit;
143143

144+
#[macro_use]
145+
extern crate language_tags;
146+
144147
#[macro_use]
145148
extern crate mime as mime_crate;
146149

@@ -157,6 +160,7 @@ pub use error::{Result, Error};
157160
pub use method::Method::{Get, Head, Post, Delete};
158161
pub use status::StatusCode::{Ok, BadRequest, NotFound};
159162
pub use server::Server;
163+
pub use language_tags::LanguageTag;
160164

161165
macro_rules! todo(
162166
($($arg:tt)*) => (if cfg!(not(ndebug)) {

0 commit comments

Comments
 (0)