Skip to content

Commit 374f756

Browse files
Markus WesterlindMarwes
authored andcommitted
Re-add the Accept header
1 parent 0d73269 commit 374f756

File tree

6 files changed

+205
-181
lines changed

6 files changed

+205
-181
lines changed

src/common/accept.rs

Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
use http::HttpTryFrom;
2+
3+
use mime::{self, Mime};
4+
5+
use util::QualityValue;
6+
7+
fn qitem(mime: Mime) -> QualityValue<Mime> {
8+
QualityValue::new(mime, Default::default())
9+
}
10+
11+
/// `Accept` header, defined in [RFC7231](http://tools.ietf.org/html/rfc7231#section-5.3.2)
12+
///
13+
/// The `Accept` header field can be used by user agents to specify
14+
/// response media types that are acceptable. Accept header fields can
15+
/// be used to indicate that the request is specifically limited to a
16+
/// small set of desired types, as in the case of a request for an
17+
/// in-line image
18+
///
19+
/// # ABNF
20+
///
21+
/// ```text
22+
/// Accept = #( media-range [ accept-params ] )
23+
///
24+
/// media-range = ( "*/*"
25+
/// / ( type "/" "*" )
26+
/// / ( type "/" subtype )
27+
/// ) *( OWS ";" OWS parameter )
28+
/// accept-params = weight *( accept-ext )
29+
/// accept-ext = OWS ";" OWS token [ "=" ( token / quoted-string ) ]
30+
/// ```
31+
///
32+
/// # Example values
33+
/// * `audio/*; q=0.2, audio/basic`
34+
/// * `text/plain; q=0.5, text/html, text/x-dvi; q=0.8, text/x-c`
35+
///
36+
/// # Examples
37+
/// ```
38+
/// # extern crate headers;
39+
/// extern crate mime;
40+
/// extern crate http;
41+
/// use headers::{Accept, QualityValue, HeaderMapExt};
42+
///
43+
/// let mut headers = http::HeaderMap::new();
44+
///
45+
/// headers.typed_insert(
46+
/// Accept(vec![
47+
/// QualityValue::new(mime::TEXT_HTML, Default::default()),
48+
/// ])
49+
/// );
50+
/// ```
51+
///
52+
/// ```
53+
/// # extern crate headers;
54+
/// extern crate mime;
55+
/// use headers::{Accept, QualityValue, HeaderMapExt};
56+
///
57+
/// let mut headers = http::HeaderMap::new();
58+
/// headers.typed_insert(
59+
/// Accept(vec![
60+
/// QualityValue::new(mime::APPLICATION_JSON, Default::default()),
61+
/// ])
62+
/// );
63+
/// ```
64+
/// ```
65+
/// # extern crate headers;
66+
/// extern crate mime;
67+
/// use headers::{Accept, QualityValue, HeaderMapExt};
68+
///
69+
/// let mut headers = http::HeaderMap::new();
70+
///
71+
/// headers.typed_insert(
72+
/// Accept(vec![
73+
/// QualityValue::from(mime::TEXT_HTML),
74+
/// QualityValue::from("application/xhtml+xml".parse::<mime::Mime>().unwrap()),
75+
/// QualityValue::new(
76+
/// mime::TEXT_XML,
77+
/// 900.into()
78+
/// ),
79+
/// QualityValue::from("image/webp".parse::<mime::Mime>().unwrap()),
80+
/// QualityValue::new(
81+
/// mime::STAR_STAR,
82+
/// 800.into()
83+
/// ),
84+
/// ])
85+
/// );
86+
/// ```
87+
#[derive(Debug)]
88+
pub struct Accept(pub Vec<QualityValue<Mime>>);
89+
90+
impl ::Header for Accept {
91+
fn name() -> &'static ::HeaderName {
92+
&::http::header::ACCEPT
93+
}
94+
95+
fn decode<'i, I: Iterator<Item = &'i ::HeaderValue>>(values: &mut I) -> Result<Self, ::Error> {
96+
::util::csv::from_comma_delimited(values).map(Accept)
97+
}
98+
99+
fn encode<E: Extend<::HeaderValue>>(&self, values: &mut E) {
100+
use std::fmt;
101+
struct Format<F>(F);
102+
impl<F> fmt::Display for Format<F>
103+
where
104+
F: Fn(&mut fmt::Formatter<'_>) -> fmt::Result,
105+
{
106+
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
107+
(self.0)(f)
108+
}
109+
}
110+
let s = format!(
111+
"{}",
112+
Format(
113+
|f: &mut fmt::Formatter<'_>| ::util::csv::fmt_comma_delimited(
114+
&mut *f,
115+
self.0.iter()
116+
)
117+
)
118+
);
119+
values.extend(Some(::HeaderValue::try_from(s).unwrap()))
120+
}
121+
}
122+
123+
impl Accept {
124+
/// A constructor to easily create `Accept: */*`.
125+
pub fn star() -> Accept {
126+
Accept(vec![qitem(mime::STAR_STAR)])
127+
}
128+
129+
/// A constructor to easily create `Accept: application/json`.
130+
pub fn json() -> Accept {
131+
Accept(vec![qitem(mime::APPLICATION_JSON)])
132+
}
133+
134+
/// A constructor to easily create `Accept: text/*`.
135+
pub fn text() -> Accept {
136+
Accept(vec![qitem(mime::TEXT_STAR)])
137+
}
138+
139+
/// A constructor to easily create `Accept: image/*`.
140+
pub fn image() -> Accept {
141+
Accept(vec![qitem(mime::IMAGE_STAR)])
142+
}
143+
}

src/common/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
//pub use self::accept_charset::AcceptCharset;
1010
//pub use self::accept_encoding::AcceptEncoding;
1111
//pub use self::accept_language::AcceptLanguage;
12+
pub use self::accept::Accept;
1213
pub use self::accept_ranges::AcceptRanges;
13-
//pub use self::accept::Accept;
1414
pub use self::access_control_allow_credentials::AccessControlAllowCredentials;
1515
pub use self::access_control_allow_headers::AccessControlAllowHeaders;
1616
pub use self::access_control_allow_methods::AccessControlAllowMethods;
@@ -125,7 +125,7 @@ macro_rules! bench_header {
125125
};
126126
}
127127

128-
//mod accept;
128+
mod accept;
129129
//mod accept_charset;
130130
//mod accept_encoding;
131131
//mod accept_language;

src/disabled/accept.rs

Lines changed: 0 additions & 150 deletions
This file was deleted.

src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ extern crate bitflags;
7878
extern crate bytes;
7979
extern crate headers_core;
8080
extern crate http;
81-
extern crate mime;
81+
pub extern crate mime;
8282
extern crate sha1;
8383
#[cfg(all(test, feature = "nightly"))]
8484
extern crate test;
@@ -99,3 +99,4 @@ mod map_ext;
9999

100100
pub use self::common::*;
101101
pub use self::map_ext::HeaderMapExt;
102+
pub use self::util::QualityValue;

src/util/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ pub(crate) use self::fmt::fmt;
88
pub(crate) use self::http_date::HttpDate;
99
pub(crate) use self::iter::IterExt;
1010
//pub use language_tags::LanguageTag;
11-
//pub use self::quality_value::{Quality, QualityValue};
11+
pub use self::quality_value::{Quality, QualityValue};
1212
pub(crate) use self::seconds::Seconds;
1313
pub(crate) use self::value_string::HeaderValueString;
1414

@@ -20,7 +20,7 @@ mod flat_csv;
2020
mod fmt;
2121
mod http_date;
2222
mod iter;
23-
//mod quality_value;
23+
mod quality_value;
2424
mod seconds;
2525
mod value_string;
2626

0 commit comments

Comments
 (0)