Skip to content

Commit de1be67

Browse files
committed
refactor(headers): Use macros for headers where possible
1 parent f554c09 commit de1be67

11 files changed

+72
-204
lines changed

src/header/common/accept.rs

+29-39
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
1-
use std::fmt;
1+
use mime::Mime;
22

3-
use header;
4-
use header::parsing;
5-
6-
use mime;
3+
use header::QualityItem;
74

85
/// The `Accept` header.
96
///
@@ -26,43 +23,36 @@ use mime;
2623
/// qitem(Mime(Text, Xml, vec![])) ]));
2724
/// ```
2825
#[derive(Clone, PartialEq, Debug)]
29-
pub struct Accept(pub Vec<header::QualityItem<mime::Mime>>);
30-
31-
deref!(Accept => Vec<header::QualityItem<mime::Mime>>);
32-
33-
impl header::Header for Accept {
34-
fn header_name() -> &'static str {
35-
"Accept"
36-
}
37-
38-
fn parse_header(raw: &[Vec<u8>]) -> Option<Accept> {
39-
// TODO: Return */* if no value is given.
40-
parsing::from_comma_delimited(raw).map(Accept)
26+
pub struct Accept(pub Vec<QualityItem<Mime>>);
27+
28+
impl_list_header!(Accept,
29+
"Accept",
30+
Vec<QualityItem<Mime>>);
31+
32+
#[cfg(test)]
33+
mod tests {
34+
use mime::*;
35+
36+
use header::{Header, QualityItem, qitem};
37+
use super::Accept;
38+
39+
#[test]
40+
fn test_parse_header_no_quality() {
41+
let a: Accept = Header::parse_header([b"text/plain; charset=utf-8".to_vec()].as_slice()).unwrap();
42+
let b = Accept(vec![
43+
qitem(Mime(TopLevel::Text, SubLevel::Plain, vec![(Attr::Charset, Value::Utf8)])),
44+
]);
45+
assert_eq!(a, b);
4146
}
42-
}
4347

44-
impl header::HeaderFormat for Accept {
45-
fn fmt_header(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
46-
parsing::fmt_comma_delimited(fmt, &self[])
48+
#[test]
49+
fn test_parse_header_with_quality() {
50+
let a: Accept = Header::parse_header([b"text/plain; charset=utf-8; q=0.5".to_vec()].as_slice()).unwrap();
51+
let b = Accept(vec![
52+
QualityItem::new(Mime(TopLevel::Text, SubLevel::Plain, vec![(Attr::Charset, Value::Utf8)]), 0.5f32),
53+
]);
54+
assert_eq!(a, b);
4755
}
4856
}
4957

5058
bench_header!(bench, Accept, { vec![b"text/plain; q=0.5, text/html".to_vec()] });
51-
52-
#[test]
53-
fn test_parse_header_no_quality() {
54-
let a: Accept = header::Header::parse_header([b"text/plain; charset=utf-8".to_vec()].as_slice()).unwrap();
55-
let b = Accept(vec![
56-
header::QualityItem{item: mime::Mime(mime::TopLevel::Text, mime::SubLevel::Plain, vec![(mime::Attr::Charset, mime::Value::Utf8)]), quality: 1f32},
57-
]);
58-
assert_eq!(a, b);
59-
}
60-
61-
#[test]
62-
fn test_parse_header_with_quality() {
63-
let a: Accept = header::Header::parse_header([b"text/plain; charset=utf-8; q=0.5".to_vec()].as_slice()).unwrap();
64-
let b = Accept(vec![
65-
header::QualityItem{item: mime::Mime(mime::TopLevel::Text, mime::SubLevel::Plain, vec![(mime::Attr::Charset, mime::Value::Utf8)]), quality: 0.5f32},
66-
]);
67-
assert_eq!(a, b);
68-
}

src/header/common/accept_encoding.rs

+16-9
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use header::{self, Encoding, QualityItem};
1+
use header::{Encoding, QualityItem};
22

33
/// The `Accept-Encoding` header
44
///
@@ -11,12 +11,19 @@ impl_list_header!(AcceptEncoding,
1111
"Accept-Encoding",
1212
Vec<QualityItem<Encoding>>);
1313

14-
#[test]
15-
fn test_parse_header() {
16-
let a: AcceptEncoding = header::Header::parse_header([b"gzip;q=1.0, identity; q=0.5".to_vec()].as_slice()).unwrap();
17-
let b = AcceptEncoding(vec![
18-
QualityItem{item: Encoding::Gzip, quality: 1f32},
19-
QualityItem{item: Encoding::Identity, quality: 0.5f32},
20-
]);
21-
assert_eq!(a, b);
14+
#[cfg(test)]
15+
mod tests {
16+
use header::{Encoding, Header, QualityItem};
17+
18+
use super::*;
19+
20+
#[test]
21+
fn test_parse_header() {
22+
let a: AcceptEncoding = Header::parse_header([b"gzip;q=1.0, identity; q=0.5".to_vec()].as_slice()).unwrap();
23+
let b = AcceptEncoding(vec![
24+
QualityItem{item: Encoding::Gzip, quality: 1f32},
25+
QualityItem{item: Encoding::Identity, quality: 0.5f32},
26+
]);
27+
assert_eq!(a, b);
28+
}
2229
}

src/header/common/allow.rs

+3-20
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,14 @@
1-
use header::{Header, HeaderFormat};
21
use method::Method;
3-
use std::fmt::{self};
4-
use header::parsing::{from_comma_delimited, fmt_comma_delimited};
52

63
/// The `Allow` header.
74
/// See also https://tools.ietf.org/html/rfc7231#section-7.4.1
85
96
#[derive(Clone, PartialEq, Debug)]
107
pub struct Allow(pub Vec<Method>);
118

12-
deref!(Allow => Vec<Method>);
13-
14-
impl Header for Allow {
15-
fn header_name() -> &'static str {
16-
"Allow"
17-
}
18-
19-
fn parse_header(raw: &[Vec<u8>]) -> Option<Allow> {
20-
from_comma_delimited(raw).map(|vec| Allow(vec))
21-
}
22-
}
23-
24-
impl HeaderFormat for Allow {
25-
fn fmt_header(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
26-
fmt_comma_delimited(fmt, &self[])
27-
}
28-
}
9+
impl_list_header!(Allow,
10+
"Allow",
11+
Vec<Method>);
2912

3013
#[cfg(test)]
3114
mod tests {

src/header/common/content_length.rs

+4-24
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,11 @@
1-
use std::fmt;
2-
3-
use header::{Header, HeaderFormat};
4-
use header::parsing::from_one_raw_str;
5-
61
/// The `Content-Length` header.
72
///
8-
/// Simply a wrapper around a `usize`.
3+
/// Simply a wrapper around a `u64`.
94
#[derive(Copy, Clone, PartialEq, Debug)]
105
pub struct ContentLength(pub u64);
116

12-
deref!(ContentLength => u64);
13-
14-
impl Header for ContentLength {
15-
fn header_name() -> &'static str {
16-
"Content-Length"
17-
}
18-
19-
fn parse_header(raw: &[Vec<u8>]) -> Option<ContentLength> {
20-
from_one_raw_str(raw).map(|u| ContentLength(u))
21-
}
22-
}
23-
24-
impl HeaderFormat for ContentLength {
25-
fn fmt_header(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
26-
fmt::Display::fmt(&self.0, fmt)
27-
}
28-
}
7+
impl_header!(ContentLength,
8+
"Content-Length",
9+
u64);
2910

3011
bench_header!(bench, ContentLength, { vec![b"42349984".to_vec()] });
31-

src/header/common/content_type.rs

+3-21
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
use header::{Header, HeaderFormat};
2-
use std::fmt;
3-
use header::parsing::from_one_raw_str;
41
use mime::Mime;
52

63
/// The `Content-Type` header.
@@ -10,23 +7,8 @@ use mime::Mime;
107
#[derive(Clone, PartialEq, Debug)]
118
pub struct ContentType(pub Mime);
129

13-
deref!(ContentType => Mime);
14-
15-
impl Header for ContentType {
16-
fn header_name() -> &'static str {
17-
"Content-Type"
18-
}
19-
20-
fn parse_header(raw: &[Vec<u8>]) -> Option<ContentType> {
21-
from_one_raw_str(raw).map(|mime| ContentType(mime))
22-
}
23-
}
24-
25-
impl HeaderFormat for ContentType {
26-
fn fmt_header(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
27-
fmt::Display::fmt(&self.0, fmt)
28-
}
29-
}
10+
impl_header!(ContentType,
11+
"Content-Type",
12+
Mime);
3013

3114
bench_header!(bench, ContentType, { vec![b"application/json; charset=utf-8".to_vec()] });
32-

src/header/common/location.rs

+3-22
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
1-
use header::{Header, HeaderFormat};
2-
use std::fmt;
3-
use header::parsing::from_one_raw_str;
4-
51
/// The `Location` header.
62
///
73
/// The Location response-header field is used to redirect the recipient to
@@ -16,23 +12,8 @@ use header::parsing::from_one_raw_str;
1612
#[derive(Clone, PartialEq, Debug)]
1713
pub struct Location(pub String);
1814

19-
deref!(Location => String);
20-
21-
impl Header for Location {
22-
fn header_name() -> &'static str {
23-
"Location"
24-
}
25-
26-
fn parse_header(raw: &[Vec<u8>]) -> Option<Location> {
27-
from_one_raw_str(raw).map(|s| Location(s))
28-
}
29-
}
30-
31-
impl HeaderFormat for Location {
32-
fn fmt_header(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
33-
fmt.write_str(&*self.0)
34-
}
35-
}
15+
impl_header!(Location,
16+
"Location",
17+
String);
3618

3719
bench_header!(bench, Location, { vec![b"http://foo.com/hello:3000".to_vec()] });
38-

src/header/common/mod.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ macro_rules! impl_list_header(
8888
($from:ident, $name:expr, $item:ty) => {
8989
deref!($from => $item);
9090

91-
impl header::Header for $from {
91+
impl $crate::header::Header for $from {
9292
fn header_name() -> &'static str {
9393
$name
9494
}
@@ -98,7 +98,7 @@ macro_rules! impl_list_header(
9898
}
9999
}
100100

101-
impl header::HeaderFormat for $from {
101+
impl $crate::header::HeaderFormat for $from {
102102
fn fmt_header(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
103103
$crate::header::parsing::fmt_comma_delimited(fmt, &self[])
104104
}
@@ -118,7 +118,7 @@ macro_rules! impl_header(
118118
($from:ident, $name:expr, $item:ty) => {
119119
deref!($from => $item);
120120

121-
impl header::Header for $from {
121+
impl $crate::header::Header for $from {
122122
fn header_name() -> &'static str {
123123
$name
124124
}
@@ -128,7 +128,7 @@ macro_rules! impl_header(
128128
}
129129
}
130130

131-
impl header::HeaderFormat for $from {
131+
impl $crate::header::HeaderFormat for $from {
132132
fn fmt_header(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
133133
::std::fmt::Display::fmt(&**self, f)
134134
}

src/header/common/referer.rs

+3-21
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
1-
use header::{Header, HeaderFormat};
2-
use std::fmt;
3-
use header::parsing::from_one_raw_str;
4-
51
/// The `Referer` header.
62
///
73
/// The Referer header is used by user agents to inform server about
@@ -13,22 +9,8 @@ use header::parsing::from_one_raw_str;
139
#[derive(Clone, PartialEq, Debug)]
1410
pub struct Referer(pub String);
1511

16-
deref!(Referer => String);
17-
18-
impl Header for Referer {
19-
fn header_name() -> &'static str {
20-
"Referer"
21-
}
22-
23-
fn parse_header(raw: &[Vec<u8>]) -> Option<Referer> {
24-
from_one_raw_str(raw).map(|s| Referer(s))
25-
}
26-
}
27-
28-
impl HeaderFormat for Referer {
29-
fn fmt_header(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
30-
fmt::Display::fmt(&self.0, fmt)
31-
}
32-
}
12+
impl_header!(Referer,
13+
"Referer",
14+
String);
3315

3416
bench_header!(bench, Referer, { vec![b"http://foo.com/hello:3000".to_vec()] });

src/header/common/server.rs

-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
use header;
2-
31
/// The `Server` header field.
42
///
53
/// They can contain any value, so it just wraps a `String`.
+4-21
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
1-
use header::{Header, HeaderFormat};
2-
use std::fmt;
3-
use header::Encoding;
4-
use header::parsing::{from_comma_delimited, fmt_comma_delimited};
1+
use header::{self, Encoding};
52

63
/// The `Transfer-Encoding` header.
74
///
@@ -19,23 +16,9 @@ use header::parsing::{from_comma_delimited, fmt_comma_delimited};
1916
#[derive(Clone, PartialEq, Debug)]
2017
pub struct TransferEncoding(pub Vec<Encoding>);
2118

22-
deref!(TransferEncoding => Vec<Encoding>);
23-
24-
impl Header for TransferEncoding {
25-
fn header_name() -> &'static str {
26-
"Transfer-Encoding"
27-
}
28-
29-
fn parse_header(raw: &[Vec<u8>]) -> Option<TransferEncoding> {
30-
from_comma_delimited(raw).map(TransferEncoding)
31-
}
32-
}
33-
34-
impl HeaderFormat for TransferEncoding {
35-
fn fmt_header(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
36-
fmt_comma_delimited(fmt, &self[])
37-
}
38-
}
19+
impl_list_header!(TransferEncoding,
20+
"Transfer-Encoding",
21+
Vec<Encoding>);
3922

4023
bench_header!(normal, TransferEncoding, { vec![b"chunked, gzip".to_vec()] });
4124
bench_header!(ext, TransferEncoding, { vec![b"ext".to_vec()] });

0 commit comments

Comments
 (0)