Skip to content

Commit 9e1808a

Browse files
authored
Merge pull request #127 from http-rs/arr-compare
Improve usage ergonomics
2 parents 70bd495 + 7bd00fa commit 9e1808a

File tree

14 files changed

+158
-160
lines changed

14 files changed

+158
-160
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ cookie = "0.12.0"
3535
infer = "0.1.2"
3636
omnom = "2.1.1"
3737
pin-project-lite = "0.1.0"
38-
url = "2.1.0"
38+
url = "2.1.1"
3939
serde_json = "1.0.51"
4040
serde = { version = "1.0.106", features = ["derive"] }
4141
serde_urlencoded = "0.6.1"

src/headers/header_name.rs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,15 @@ impl FromStr for HeaderName {
6363
}
6464
}
6565

66-
impl<'a> std::convert::TryFrom<&'a str> for HeaderName {
67-
type Error = Error;
66+
impl From<&HeaderName> for HeaderName {
67+
fn from(value: &HeaderName) -> HeaderName {
68+
value.clone()
69+
}
70+
}
6871

69-
fn try_from(value: &'a str) -> Result<Self, Self::Error> {
70-
Self::from_str(value)
72+
impl<'a> From<&'a str> for HeaderName {
73+
fn from(value: &'a str) -> Self {
74+
Self::from_str(value).expect("String slice should be valid ASCII")
7175
}
7276
}
7377

@@ -136,4 +140,10 @@ mod tests {
136140
// Must validate regardless of casing.
137141
assert_eq!(static_header, &String::from("Hello"));
138142
}
143+
144+
#[test]
145+
fn pass_name_by_ref() {
146+
let mut res = crate::Response::new(200);
147+
res.insert_header(&crate::headers::HOST, "127.0.0.1");
148+
}
139149
}

src/headers/header_value.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use std::convert::TryFrom;
12
use std::fmt::{self, Display};
23
use std::str::FromStr;
34

@@ -83,7 +84,7 @@ impl FromStr for HeaderValue {
8384
}
8485
}
8586

86-
impl<'a> std::convert::TryFrom<&'a str> for HeaderValue {
87+
impl<'a> TryFrom<&'a str> for HeaderValue {
8788
type Error = Error;
8889

8990
fn try_from(value: &'a str) -> Result<Self, Self::Error> {

src/headers/header_values.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,12 @@ impl<'a> PartialEq<&'a str> for HeaderValues {
9595
}
9696
}
9797

98+
impl<'a> PartialEq<[&'a str]> for HeaderValues {
99+
fn eq(&self, other: &[&'a str]) -> bool {
100+
self.inner.iter().eq(other.iter())
101+
}
102+
}
103+
98104
impl PartialEq<String> for HeaderValues {
99105
fn eq(&self, other: &String) -> bool {
100106
self.inner.len() == 1 && &self.inner[0] == other

src/headers/headers.rs

Lines changed: 25 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//! HTTP headers.
22
33
use std::collections::HashMap;
4-
use std::convert::TryInto;
4+
use std::convert::Into;
55
use std::iter::IntoIterator;
66
use std::ops::Index;
77
use std::str::FromStr;
@@ -23,7 +23,7 @@ use crate::headers::{
2323
/// use http_types::{Response, StatusCode};
2424
///
2525
/// let mut res = Response::new(StatusCode::Ok);
26-
/// res.insert_header("hello", "foo0").unwrap();
26+
/// res.insert_header("hello", "foo0");
2727
/// assert_eq!(res["hello"], "foo0");
2828
/// ```
2929
#[derive(Debug, Clone)]
@@ -46,14 +46,12 @@ impl Headers {
4646
/// use `Headers::append`
4747
pub fn insert(
4848
&mut self,
49-
name: impl TryInto<HeaderName>,
49+
name: impl Into<HeaderName>,
5050
values: impl ToHeaderValues,
51-
) -> crate::Result<Option<HeaderValues>> {
52-
let name = name
53-
.try_into()
54-
.map_err(|_| crate::format_err!("Could not convert into header name"))?;
55-
let values: HeaderValues = values.to_header_values()?.collect();
56-
Ok(self.headers.insert(name, values))
51+
) -> Option<HeaderValues> {
52+
let name = name.into();
53+
let values: HeaderValues = values.to_header_values().unwrap().collect();
54+
self.headers.insert(name, values)
5755
}
5856

5957
/// Append a header to the headers.
@@ -62,37 +60,35 @@ impl Headers {
6260
/// header if there aren't any. Or else append to the existing list of headers.
6361
pub fn append(
6462
&mut self,
65-
name: impl TryInto<HeaderName>,
63+
name: impl Into<HeaderName>,
6664
values: impl ToHeaderValues,
6765
) -> crate::Result<()> {
68-
let name = name
69-
.try_into()
70-
.map_err(|_| crate::format_err!("Could not convert into header name"))?;
71-
match self.get_mut(&name) {
66+
let name = name.into();
67+
match self.get_mut(name.clone()) {
7268
Some(headers) => {
7369
let mut values: HeaderValues = values.to_header_values()?.collect();
7470
headers.append(&mut values);
7571
}
7672
None => {
77-
self.insert(name, values)?;
73+
self.insert(name, values);
7874
}
7975
}
8076
Ok(())
8177
}
8278

8379
/// Get a reference to a header.
84-
pub fn get(&self, name: &HeaderName) -> Option<&HeaderValues> {
85-
self.headers.get(name)
80+
pub fn get(&self, name: impl Into<HeaderName>) -> Option<&HeaderValues> {
81+
self.headers.get(&name.into())
8682
}
8783

8884
/// Get a mutable reference to a header.
89-
pub fn get_mut(&mut self, name: &HeaderName) -> Option<&mut HeaderValues> {
90-
self.headers.get_mut(name)
85+
pub fn get_mut(&mut self, name: impl Into<HeaderName>) -> Option<&mut HeaderValues> {
86+
self.headers.get_mut(&name.into())
9187
}
9288

9389
/// Remove a header.
94-
pub fn remove(&mut self, name: &HeaderName) -> Option<HeaderValues> {
95-
self.headers.remove(name)
90+
pub fn remove(&mut self, name: impl Into<HeaderName>) -> Option<HeaderValues> {
91+
self.headers.remove(&name.into())
9692
}
9793

9894
/// An iterator visiting all header pairs in arbitrary order.
@@ -123,7 +119,7 @@ impl Headers {
123119
}
124120
}
125121

126-
impl Index<&HeaderName> for Headers {
122+
impl Index<HeaderName> for Headers {
127123
type Output = HeaderValues;
128124

129125
/// Returns a reference to the value corresponding to the supplied name.
@@ -132,7 +128,7 @@ impl Index<&HeaderName> for Headers {
132128
///
133129
/// Panics if the name is not present in `Headers`.
134130
#[inline]
135-
fn index(&self, name: &HeaderName) -> &HeaderValues {
131+
fn index(&self, name: HeaderName) -> &HeaderValues {
136132
self.get(name).expect("no entry found for name")
137133
}
138134
}
@@ -148,7 +144,7 @@ impl Index<&str> for Headers {
148144
#[inline]
149145
fn index(&self, name: &str) -> &HeaderValues {
150146
let name = HeaderName::from_str(name).expect("string slice needs to be valid ASCII");
151-
self.get(&name).expect("no entry found for name")
147+
self.get(name).expect("no entry found for name")
152148
}
153149
}
154150

@@ -202,28 +198,18 @@ mod tests {
202198
headers.append(static_header.clone(), "foo1")?;
203199
headers.append(non_static_header.clone(), "foo2")?;
204200

205-
assert_eq!(
206-
&headers.get(&STATIC_HEADER).unwrap()[..],
207-
&["foo0", "foo1", "foo2",][..]
208-
);
209-
210-
assert_eq!(
211-
&headers.get(&static_header).unwrap()[..],
212-
&["foo0", "foo1", "foo2",][..]
213-
);
214-
215-
assert_eq!(
216-
&headers.get(&non_static_header).unwrap()[..],
217-
&["foo0", "foo1", "foo2",][..]
218-
);
201+
assert_eq!(headers[STATIC_HEADER], ["foo0", "foo1", "foo2",][..]);
202+
assert_eq!(headers[static_header], ["foo0", "foo1", "foo2",][..]);
203+
assert_eq!(headers[non_static_header], ["foo0", "foo1", "foo2",][..]);
219204

220205
Ok(())
221206
}
222207

223208
#[test]
224209
fn index_into_headers() {
225210
let mut headers = Headers::new();
226-
headers.insert("hello", "foo0").unwrap();
211+
headers.insert("hello", "foo0");
227212
assert_eq!(headers["hello"], "foo0");
213+
assert_eq!(headers.get("hello").unwrap(), "foo0");
228214
}
229215
}

src/hyperium_http.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,7 @@ impl From<Request> for http::Request<Body> {
120120
impl From<http::Response<Body>> for Response {
121121
fn from(res: http::Response<Body>) -> Self {
122122
let (parts, body) = res.into_parts();
123-
let status = parts.status.into();
124-
let mut res = Response::new(status);
123+
let mut res = Response::new(parts.status);
125124
res.set_body(body);
126125
res.set_version(Some(parts.version.into()));
127126
hyperium_headers_to_headers(parts.headers, res.as_mut());

0 commit comments

Comments
 (0)