Skip to content

Commit 5ff049b

Browse files
committed
Use HeaderValues everywhere
1 parent 291527b commit 5ff049b

File tree

10 files changed

+97
-50
lines changed

10 files changed

+97
-50
lines changed

src/headers/header_values.rs

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,59 @@
11
use crate::headers::HeaderValue;
22
use std::fmt::{self, Display};
3+
use std::iter::FromIterator;
4+
use std::ops::Index;
5+
use std::slice::SliceIndex;
36

47
/// A list of `HeaderValue`s.
58
///
69
/// This always contains at least one header value.
7-
#[derive(Debug)]
10+
#[derive(Debug, Clone)]
811
pub struct HeaderValues {
912
inner: Vec<HeaderValue>,
1013
}
1114

15+
impl HeaderValues {
16+
/// Move all values from `other` into `self`, leaving `other` empty.
17+
pub fn append(&mut self, other: &mut Self) {
18+
self.inner.append(&mut other.inner)
19+
}
20+
21+
/// Returns a reference or a value depending on the type of index.
22+
pub fn get(&self, index: usize) -> Option<&HeaderValue> {
23+
self.inner.get(index)
24+
}
25+
26+
/// Returns the last `HeaderValue`.
27+
pub fn last(&mut self) -> &HeaderValue {
28+
self.inner
29+
.last()
30+
.expect("HeaderValues must always contain at least one value")
31+
}
32+
}
33+
34+
impl<I: SliceIndex<[HeaderValue]>> Index<I> for HeaderValues {
35+
type Output = I::Output;
36+
37+
#[inline]
38+
fn index(&self, index: I) -> &Self::Output {
39+
Index::index(&self.inner, index)
40+
}
41+
}
42+
43+
impl FromIterator<HeaderValue> for HeaderValues {
44+
fn from_iter<I>(iter: I) -> HeaderValues
45+
where
46+
I: IntoIterator<Item = HeaderValue>,
47+
{
48+
let iter = iter.into_iter();
49+
let mut output = Vec::with_capacity(iter.size_hint().0);
50+
for v in output {
51+
output.push(v);
52+
}
53+
HeaderValues { inner: output }
54+
}
55+
}
56+
1257
impl Display for HeaderValues {
1358
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1459
let mut list = f.debug_list();

src/headers/into_iter.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
use std::collections::hash_map;
22
use std::iter::Iterator;
33

4-
use crate::headers::{HeaderName, HeaderValue};
4+
use crate::headers::{HeaderName, HeaderValues};
55

66
/// An owning iterator over the entries of `Headers`.
77
#[derive(Debug)]
88
pub struct IntoIter {
9-
pub(super) inner: hash_map::IntoIter<HeaderName, Vec<HeaderValue>>,
9+
pub(super) inner: hash_map::IntoIter<HeaderName, HeaderValues>,
1010
}
1111

1212
impl Iterator for IntoIter {
13-
type Item = (HeaderName, Vec<HeaderValue>);
13+
type Item = (HeaderName, HeaderValues);
1414

1515
fn next(&mut self) -> Option<Self::Item> {
1616
self.inner.next()

src/headers/iter.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
use std::collections::hash_map;
22
use std::iter::Iterator;
33

4-
use crate::headers::{HeaderName, HeaderValue};
4+
use crate::headers::{HeaderName, HeaderValues};
55

66
/// Iterator over the headers.
77
#[derive(Debug)]
88
pub struct Iter<'a> {
9-
pub(super) inner: hash_map::Iter<'a, HeaderName, Vec<HeaderValue>>,
9+
pub(super) inner: hash_map::Iter<'a, HeaderName, HeaderValues>,
1010
}
1111

1212
impl<'a> Iterator for Iter<'a> {
13-
type Item = (&'a HeaderName, &'a Vec<HeaderValue>);
13+
type Item = (&'a HeaderName, &'a HeaderValues);
1414

1515
fn next(&mut self) -> Option<Self::Item> {
1616
self.inner.next()

src/headers/iter_mut.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
use std::collections::hash_map;
22
use std::iter::Iterator;
33

4-
use crate::headers::{HeaderName, HeaderValue};
4+
use crate::headers::{HeaderName, HeaderValues};
55

66
/// Iterator over the headers.
77
#[derive(Debug)]
88
pub struct IterMut<'a> {
9-
pub(super) inner: hash_map::IterMut<'a, HeaderName, Vec<HeaderValue>>,
9+
pub(super) inner: hash_map::IterMut<'a, HeaderName, HeaderValues>,
1010
}
1111

1212
impl<'a> Iterator for IterMut<'a> {
13-
type Item = (&'a HeaderName, &'a mut Vec<HeaderValue>);
13+
type Item = (&'a HeaderName, &'a mut HeaderValues);
1414

1515
fn next(&mut self) -> Option<Self::Item> {
1616
self.inner.next()

src/headers/mod.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ pub use values::Values;
2929
/// A collection of HTTP Headers.
3030
#[derive(Debug, Clone)]
3131
pub struct Headers {
32-
pub(crate) headers: HashMap<HeaderName, Vec<HeaderValue>>,
32+
pub(crate) headers: HashMap<HeaderName, HeaderValues>,
3333
}
3434

3535
impl Headers {
@@ -49,11 +49,11 @@ impl Headers {
4949
&mut self,
5050
name: impl TryInto<HeaderName>,
5151
values: impl ToHeaderValues,
52-
) -> crate::Result<Option<Vec<HeaderValue>>> {
52+
) -> crate::Result<Option<HeaderValues>> {
5353
let name = name
5454
.try_into()
5555
.map_err(|_| crate::format_err!("Could not convert into header name"))?;
56-
let values: Vec<HeaderValue> = values.to_header_values()?.collect();
56+
let values: HeaderValues = values.to_header_values()?.collect();
5757
Ok(self.headers.insert(name, values))
5858
}
5959

@@ -71,7 +71,7 @@ impl Headers {
7171
.map_err(|_| crate::format_err!("Could not convert into header name"))?;
7272
match self.get_mut(&name) {
7373
Some(headers) => {
74-
let mut values: Vec<HeaderValue> = values.to_header_values()?.collect();
74+
let mut values: HeaderValues = values.to_header_values()?.collect();
7575
headers.append(&mut values);
7676
}
7777
None => {
@@ -82,17 +82,17 @@ impl Headers {
8282
}
8383

8484
/// Get a reference to a header.
85-
pub fn get(&self, name: &HeaderName) -> Option<&Vec<HeaderValue>> {
85+
pub fn get(&self, name: &HeaderName) -> Option<&HeaderValues> {
8686
self.headers.get(name)
8787
}
8888

8989
/// Get a mutable reference to a header.
90-
pub fn get_mut(&mut self, name: &HeaderName) -> Option<&mut Vec<HeaderValue>> {
90+
pub fn get_mut(&mut self, name: &HeaderName) -> Option<&mut HeaderValues> {
9191
self.headers.get_mut(name)
9292
}
9393

9494
/// Remove a header.
95-
pub fn remove(&mut self, name: &HeaderName) -> Option<Vec<HeaderValue>> {
95+
pub fn remove(&mut self, name: &HeaderName) -> Option<HeaderValues> {
9696
self.headers.remove(name)
9797
}
9898

@@ -125,7 +125,7 @@ impl Headers {
125125
}
126126

127127
impl IntoIterator for Headers {
128-
type Item = (HeaderName, Vec<HeaderValue>);
128+
type Item = (HeaderName, HeaderValues);
129129
type IntoIter = IntoIter;
130130

131131
/// Returns a iterator of references over the remaining items.
@@ -138,7 +138,7 @@ impl IntoIterator for Headers {
138138
}
139139

140140
impl<'a> IntoIterator for &'a Headers {
141-
type Item = (&'a HeaderName, &'a Vec<HeaderValue>);
141+
type Item = (&'a HeaderName, &'a HeaderValues);
142142
type IntoIter = Iter<'a>;
143143

144144
#[inline]
@@ -148,7 +148,7 @@ impl<'a> IntoIterator for &'a Headers {
148148
}
149149

150150
impl<'a> IntoIterator for &'a mut Headers {
151-
type Item = (&'a HeaderName, &'a mut Vec<HeaderValue>);
151+
type Item = (&'a HeaderName, &'a mut HeaderValues);
152152
type IntoIter = IterMut<'a>;
153153

154154
#[inline]

src/headers/names.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
use std::collections::hash_map;
22
use std::iter::Iterator;
33

4-
use crate::headers::{HeaderName, HeaderValue};
4+
use crate::headers::{HeaderName, HeaderValues};
55

66
/// Iterator over the headers.
77
#[derive(Debug)]
88
pub struct Names<'a> {
9-
pub(super) inner: hash_map::Keys<'a, HeaderName, Vec<HeaderValue>>,
9+
pub(super) inner: hash_map::Keys<'a, HeaderName, HeaderValues>,
1010
}
1111

1212
impl<'a> Iterator for Names<'a> {

src/headers/values.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
use std::collections::hash_map;
22
use std::iter::Iterator;
33

4-
use crate::headers::{HeaderName, HeaderValue};
4+
use crate::headers::{HeaderName, HeaderValue, HeaderValues};
55

66
/// Iterator over the headers.
77
#[derive(Debug)]
88
pub struct Values<'a> {
9-
pub(super) inner: hash_map::Values<'a, HeaderName, Vec<HeaderValue>>,
10-
slot: Option<&'a Vec<HeaderValue>>,
9+
pub(super) inner: hash_map::Values<'a, HeaderName, HeaderValues>,
10+
slot: Option<&'a HeaderValues>,
1111
cursor: usize,
1212
}
1313

1414
impl<'a> Values<'a> {
15-
pub(crate) fn new(inner: hash_map::Values<'a, HeaderName, Vec<HeaderValue>>) -> Self {
15+
pub(crate) fn new(inner: hash_map::Values<'a, HeaderName, HeaderValues>) -> Self {
1616
Self {
1717
inner,
1818
slot: None,

src/request.rs

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ use std::pin::Pin;
77
use std::task::{Context, Poll};
88

99
use crate::headers::{
10-
self, HeaderName, HeaderValue, Headers, Names, ToHeaderValues, Values, CONTENT_TYPE,
10+
self, HeaderName, HeaderValue, HeaderValues, Headers, Names, ToHeaderValues, Values,
11+
CONTENT_TYPE,
1112
};
1213
use crate::mime::Mime;
1314
use crate::trailers::{Trailers, TrailersSender};
@@ -227,17 +228,17 @@ impl Request {
227228
}
228229

229230
/// Get an HTTP header.
230-
pub fn header(&self, name: &HeaderName) -> Option<&Vec<HeaderValue>> {
231+
pub fn header(&self, name: &HeaderName) -> Option<&HeaderValues> {
231232
self.headers.get(name)
232233
}
233234

234235
/// Get a mutable reference to a header.
235-
pub fn header_mut(&mut self, name: &HeaderName) -> Option<&mut Vec<HeaderValue>> {
236+
pub fn header_mut(&mut self, name: &HeaderName) -> Option<&mut HeaderValues> {
236237
self.headers.get_mut(name)
237238
}
238239

239240
/// Remove a header.
240-
pub fn remove_header(&mut self, name: &HeaderName) -> Option<Vec<HeaderValue>> {
241+
pub fn remove_header(&mut self, name: &HeaderName) -> Option<HeaderValues> {
241242
self.headers.remove(name)
242243
}
243244

@@ -259,7 +260,7 @@ impl Request {
259260
&mut self,
260261
name: impl TryInto<HeaderName>,
261262
values: impl ToHeaderValues,
262-
) -> crate::Result<Option<Vec<HeaderValue>>> {
263+
) -> crate::Result<Option<HeaderValues>> {
263264
self.headers.insert(name, values)
264265
}
265266

@@ -290,7 +291,7 @@ impl Request {
290291

291292
/// Set the response MIME.
292293
// TODO: return a parsed MIME
293-
pub fn set_content_type(&mut self, mime: Mime) -> Option<Vec<HeaderValue>> {
294+
pub fn set_content_type(&mut self, mime: Mime) -> Option<HeaderValues> {
294295
let value: HeaderValue = mime.into();
295296

296297
// A Mime instance is guaranteed to be valid header name.
@@ -306,7 +307,7 @@ impl Request {
306307

307308
/// Get the current content type
308309
pub fn content_type(&self) -> Option<Mime> {
309-
self.header(&CONTENT_TYPE)?.last()?.as_str().parse().ok()
310+
self.header(&CONTENT_TYPE)?.last().as_str().parse().ok()
310311
}
311312

312313
/// Get the length of the body stream, if it has been set.
@@ -549,7 +550,7 @@ impl From<Request> for Body {
549550
}
550551

551552
impl IntoIterator for Request {
552-
type Item = (HeaderName, Vec<HeaderValue>);
553+
type Item = (HeaderName, HeaderValues);
553554
type IntoIter = headers::IntoIter;
554555

555556
/// Returns a iterator of references over the remaining items.
@@ -560,7 +561,7 @@ impl IntoIterator for Request {
560561
}
561562

562563
impl<'a> IntoIterator for &'a Request {
563-
type Item = (&'a HeaderName, &'a Vec<HeaderValue>);
564+
type Item = (&'a HeaderName, &'a HeaderValues);
564565
type IntoIter = headers::Iter<'a>;
565566

566567
#[inline]
@@ -570,7 +571,7 @@ impl<'a> IntoIterator for &'a Request {
570571
}
571572

572573
impl<'a> IntoIterator for &'a mut Request {
573-
type Item = (&'a HeaderName, &'a mut Vec<HeaderValue>);
574+
type Item = (&'a HeaderName, &'a mut HeaderValues);
574575
type IntoIter = headers::IterMut<'a>;
575576

576577
#[inline]

src/response.rs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ use std::pin::Pin;
77
use std::task::{Context, Poll};
88

99
use crate::headers::{
10-
self, HeaderName, HeaderValue, Headers, Names, ToHeaderValues, Values, CONTENT_TYPE,
10+
self, HeaderName, HeaderValue, HeaderValues, Headers, Names, ToHeaderValues, Values,
11+
CONTENT_TYPE,
1112
};
1213
use crate::mime::Mime;
1314
use crate::trailers::{Trailers, TrailersSender};
@@ -62,17 +63,17 @@ impl Response {
6263
}
6364

6465
/// Get a mutable reference to a header.
65-
pub fn header_mut(&mut self, name: &HeaderName) -> Option<&mut Vec<HeaderValue>> {
66+
pub fn header_mut(&mut self, name: &HeaderName) -> Option<&mut HeaderValues> {
6667
self.headers.get_mut(name)
6768
}
6869

6970
/// Get an HTTP header.
70-
pub fn header(&self, name: &HeaderName) -> Option<&Vec<HeaderValue>> {
71+
pub fn header(&self, name: &HeaderName) -> Option<&HeaderValues> {
7172
self.headers.get(name)
7273
}
7374

7475
/// Remove a header.
75-
pub fn remove_header(&mut self, name: &HeaderName) -> Option<Vec<HeaderValue>> {
76+
pub fn remove_header(&mut self, name: &HeaderName) -> Option<HeaderValues> {
7677
self.headers.remove(name)
7778
}
7879

@@ -94,7 +95,7 @@ impl Response {
9495
&mut self,
9596
name: impl TryInto<HeaderName>,
9697
values: impl ToHeaderValues,
97-
) -> crate::Result<Option<Vec<HeaderValue>>> {
98+
) -> crate::Result<Option<HeaderValues>> {
9899
self.headers.insert(name, values)
99100
}
100101

@@ -255,7 +256,7 @@ impl Response {
255256
}
256257

257258
/// Set the response MIME.
258-
pub fn set_content_type(&mut self, mime: Mime) -> Option<Vec<HeaderValue>> {
259+
pub fn set_content_type(&mut self, mime: Mime) -> Option<HeaderValues> {
259260
let value: HeaderValue = mime.into();
260261

261262
// A Mime instance is guaranteed to be valid header name.
@@ -537,7 +538,7 @@ impl From<Vec<u8>> for Response {
537538
}
538539

539540
impl IntoIterator for Response {
540-
type Item = (HeaderName, Vec<HeaderValue>);
541+
type Item = (HeaderName, HeaderValues);
541542
type IntoIter = headers::IntoIter;
542543

543544
/// Returns a iterator of references over the remaining items.
@@ -548,7 +549,7 @@ impl IntoIterator for Response {
548549
}
549550

550551
impl<'a> IntoIterator for &'a Response {
551-
type Item = (&'a HeaderName, &'a Vec<HeaderValue>);
552+
type Item = (&'a HeaderName, &'a HeaderValues);
552553
type IntoIter = headers::Iter<'a>;
553554

554555
#[inline]
@@ -558,7 +559,7 @@ impl<'a> IntoIterator for &'a Response {
558559
}
559560

560561
impl<'a> IntoIterator for &'a mut Response {
561-
type Item = (&'a HeaderName, &'a mut Vec<HeaderValue>);
562+
type Item = (&'a HeaderName, &'a mut HeaderValues);
562563
type IntoIter = headers::IterMut<'a>;
563564

564565
#[inline]

0 commit comments

Comments
 (0)