Skip to content

Commit 7d7323a

Browse files
authored
Merge pull request #385 from halvko/main
Change signature of insertion/appending of headers
2 parents 0127e5b + cc73cab commit 7d7323a

31 files changed

+181
-91
lines changed

src/auth/authorization.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,9 @@ mod test {
129129
#[test]
130130
fn bad_request_on_parse_error() {
131131
let mut headers = Headers::new();
132-
headers.insert(AUTHORIZATION, "<nori ate the tag. yum.>");
132+
headers
133+
.insert(AUTHORIZATION, "<nori ate the tag. yum.>")
134+
.unwrap();
133135
let err = Authorization::from_headers(headers).unwrap_err();
134136
assert_eq!(err.status(), 400);
135137
}

src/auth/basic_auth.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,9 @@ mod test {
135135
#[test]
136136
fn bad_request_on_parse_error() {
137137
let mut headers = Headers::new();
138-
headers.insert(AUTHORIZATION, "<nori ate the tag. yum.>");
138+
headers
139+
.insert(AUTHORIZATION, "<nori ate the tag. yum.>")
140+
.unwrap();
139141
let err = BasicAuth::from_headers(headers).unwrap_err();
140142
assert_eq!(err.status(), 400);
141143
}

src/auth/www_authenticate.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,9 @@ mod test {
156156
#[test]
157157
fn bad_request_on_parse_error() {
158158
let mut headers = Headers::new();
159-
headers.insert(WWW_AUTHENTICATE, "<nori ate the tag. yum.>");
159+
headers
160+
.insert(WWW_AUTHENTICATE, "<nori ate the tag. yum.>")
161+
.unwrap();
160162
let err = WwwAuthenticate::from_headers(headers).unwrap_err();
161163
assert_eq!(err.status(), 400);
162164
}

src/cache/age.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ mod test {
102102
#[test]
103103
fn bad_request_on_parse_error() {
104104
let mut headers = Headers::new();
105-
headers.insert(AGE, "<nori ate the tag. yum.>");
105+
headers.insert(AGE, "<nori ate the tag. yum.>").unwrap();
106106
let err = Age::from_headers(headers).unwrap_err();
107107
assert_eq!(err.status(), 400);
108108
}

src/cache/cache_control/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ mod test {
3737
#[test]
3838
fn ignore_unkonwn_directives() -> crate::Result<()> {
3939
let mut headers = Headers::new();
40-
headers.insert(CACHE_CONTROL, "barrel_roll");
40+
headers.insert(CACHE_CONTROL, "barrel_roll").unwrap();
4141
let entries = CacheControl::from_headers(headers)?.unwrap();
4242
let mut entries = entries.iter();
4343
assert!(entries.next().is_none());
@@ -47,7 +47,7 @@ mod test {
4747
#[test]
4848
fn bad_request_on_parse_error() {
4949
let mut headers = Headers::new();
50-
headers.insert(CACHE_CONTROL, "min-fresh=0.9"); // floats are not supported
50+
headers.insert(CACHE_CONTROL, "min-fresh=0.9").unwrap(); // floats are not supported
5151
let err = CacheControl::from_headers(headers).unwrap_err();
5252
assert_eq!(err.status(), 400);
5353
}

src/cache/clear_site_data/mod.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -278,15 +278,16 @@ mod test {
278278
#[test]
279279
fn parse_quotes_correctly() -> crate::Result<()> {
280280
let mut res = Response::new(200);
281-
res.insert_header("clear-site-data", r#""cookies""#);
281+
res.insert_header("clear-site-data", r#""cookies""#)
282+
.unwrap();
282283

283284
let entries = ClearSiteData::from_headers(res)?.unwrap();
284285
assert!(!entries.wildcard());
285286
let mut entries = entries.iter();
286287
assert_eq!(entries.next().unwrap(), &ClearDirective::Cookies);
287288

288289
let mut res = Response::new(200);
289-
res.insert_header("clear-site-data", r#""*""#);
290+
res.insert_header("clear-site-data", r#""*""#).unwrap();
290291

291292
let entries = ClearSiteData::from_headers(res)?.unwrap();
292293
assert!(entries.wildcard());

src/cache/expires.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ mod test {
107107
#[test]
108108
fn bad_request_on_parse_error() {
109109
let mut headers = Headers::new();
110-
headers.insert(EXPIRES, "<nori ate the tag. yum.>");
110+
headers.insert(EXPIRES, "<nori ate the tag. yum.>").unwrap();
111111
let err = Expires::from_headers(headers).unwrap_err();
112112
assert_eq!(err.status(), 400);
113113
}

src/conditional/etag.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ mod test {
164164
#[test]
165165
fn bad_request_on_parse_error() {
166166
let mut headers = Headers::new();
167-
headers.insert(ETAG, "<nori ate the tag. yum.>");
167+
headers.insert(ETAG, "<nori ate the tag. yum.>").unwrap();
168168
let err = ETag::from_headers(headers).unwrap_err();
169169
assert_eq!(err.status(), 400);
170170
}
@@ -179,7 +179,7 @@ mod test {
179179

180180
fn assert_entry_err(s: &str, msg: &str) {
181181
let mut headers = Headers::new();
182-
headers.insert(ETAG, s);
182+
headers.insert(ETAG, s).unwrap();
183183
let err = ETag::from_headers(headers).unwrap_err();
184184
assert_eq!(format!("{}", err), msg);
185185
}

src/conditional/if_modified_since.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,9 @@ mod test {
104104
#[test]
105105
fn bad_request_on_parse_error() {
106106
let mut headers = Headers::new();
107-
headers.insert(IF_MODIFIED_SINCE, "<nori ate the tag. yum.>");
107+
headers
108+
.insert(IF_MODIFIED_SINCE, "<nori ate the tag. yum.>")
109+
.unwrap();
108110
let err = IfModifiedSince::from_headers(headers).unwrap_err();
109111
assert_eq!(err.status(), 400);
110112
}

src/conditional/if_unmodified_since.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,9 @@ mod test {
104104
#[test]
105105
fn bad_request_on_parse_error() {
106106
let mut headers = Headers::new();
107-
headers.insert(IF_UNMODIFIED_SINCE, "<nori ate the tag. yum.>");
107+
headers
108+
.insert(IF_UNMODIFIED_SINCE, "<nori ate the tag. yum.>")
109+
.unwrap();
108110
let err = IfUnmodifiedSince::from_headers(headers).unwrap_err();
109111
assert_eq!(err.status(), 400);
110112
}

src/conditional/last_modified.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,9 @@ mod test {
103103
#[test]
104104
fn bad_request_on_parse_error() {
105105
let mut headers = Headers::new();
106-
headers.insert(LAST_MODIFIED, "<nori ate the tag. yum.>");
106+
headers
107+
.insert(LAST_MODIFIED, "<nori ate the tag. yum.>")
108+
.unwrap();
107109
let err = LastModified::from_headers(headers).unwrap_err();
108110
assert_eq!(err.status(), 400);
109111
}

src/content/content_length.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,9 @@ mod test {
9494
#[test]
9595
fn bad_request_on_parse_error() {
9696
let mut headers = Headers::new();
97-
headers.insert(CONTENT_LENGTH, "<nori ate the tag. yum.>");
97+
headers
98+
.insert(CONTENT_LENGTH, "<nori ate the tag. yum.>")
99+
.unwrap();
98100
let err = ContentLength::from_headers(headers).unwrap_err();
99101
assert_eq!(err.status(), 400);
100102
}

src/content/content_location.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,9 @@ mod test {
118118
#[test]
119119
fn bad_request_on_parse_error() {
120120
let mut headers = Headers::new();
121-
headers.insert(CONTENT_LOCATION, "htt://<nori ate the tag. yum.>");
121+
headers
122+
.insert(CONTENT_LOCATION, "htt://<nori ate the tag. yum.>")
123+
.unwrap();
122124
let err =
123125
ContentLocation::from_headers(Url::parse("https://example.net").unwrap(), headers)
124126
.unwrap_err();

src/content/content_type.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,9 @@ mod test {
127127
#[test]
128128
fn bad_request_on_parse_error() {
129129
let mut headers = Headers::new();
130-
headers.insert(CONTENT_TYPE, "<nori ate the tag. yum.>");
130+
headers
131+
.insert(CONTENT_TYPE, "<nori ate the tag. yum.>")
132+
.unwrap();
131133
let err = ContentType::from_headers(headers).unwrap_err();
132134
assert_eq!(err.status(), 400);
133135
}

src/headers/header.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@ pub trait Header {
1515
fn apply_header<H: AsMut<Headers>>(&self, mut headers: H) {
1616
let name = self.header_name();
1717
let value = self.header_value();
18-
headers.as_mut().insert(name, value);
18+
19+
// The value should already have been validated when it was created, so this should
20+
// possibly be done with an unsafe call
21+
headers.as_mut().insert(name, value).unwrap();
1922
}
2023
}
2124

src/headers/header_name.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,8 @@ mod tests {
172172
#[test]
173173
fn pass_name_by_ref() {
174174
let mut res = crate::Response::new(200);
175-
res.insert_header(&crate::headers::HOST, "127.0.0.1");
175+
res.insert_header(&crate::headers::HOST, "127.0.0.1")
176+
.unwrap();
176177
}
177178

178179
#[test]

src/headers/headers.rs

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -49,27 +49,32 @@ impl Headers {
4949
&mut self,
5050
name: impl Into<HeaderName>,
5151
values: impl ToHeaderValues,
52-
) -> Option<HeaderValues> {
52+
) -> crate::Result<Option<HeaderValues>> {
5353
let name = name.into();
54-
let values: HeaderValues = values.to_header_values().unwrap().collect();
55-
self.headers.insert(name, values)
54+
let values: HeaderValues = values.to_header_values()?.collect();
55+
Ok(self.headers.insert(name, values))
5656
}
5757

5858
/// Append a header to the headers.
5959
///
6060
/// Unlike `insert` this function will not override the contents of a header, but insert a
6161
/// header if there aren't any. Or else append to the existing list of headers.
62-
pub fn append(&mut self, name: impl Into<HeaderName>, values: impl ToHeaderValues) {
62+
pub fn append(
63+
&mut self,
64+
name: impl Into<HeaderName>,
65+
values: impl ToHeaderValues,
66+
) -> crate::Result<()> {
6367
let name = name.into();
6468
match self.get_mut(&name) {
6569
Some(headers) => {
66-
let mut values: HeaderValues = values.to_header_values().unwrap().collect();
70+
let mut values: HeaderValues = values.to_header_values()?.collect();
6771
headers.append(&mut values);
6872
}
6973
None => {
70-
self.insert(name, values);
74+
self.insert(name, values)?;
7175
}
7276
}
77+
Ok(())
7378
}
7479

7580
/// Get a reference to a header.
@@ -208,9 +213,9 @@ mod tests {
208213
let non_static_header = HeaderName::from_str("hello")?;
209214

210215
let mut headers = Headers::new();
211-
headers.append(STATIC_HEADER, "foo0");
212-
headers.append(static_header.clone(), "foo1");
213-
headers.append(non_static_header.clone(), "foo2");
216+
headers.append(STATIC_HEADER, "foo0").unwrap();
217+
headers.append(static_header.clone(), "foo1").unwrap();
218+
headers.append(non_static_header.clone(), "foo2").unwrap();
214219

215220
assert_eq!(headers[STATIC_HEADER], ["foo0", "foo1", "foo2",][..]);
216221
assert_eq!(headers[static_header], ["foo0", "foo1", "foo2",][..]);
@@ -222,23 +227,23 @@ mod tests {
222227
#[test]
223228
fn index_into_headers() {
224229
let mut headers = Headers::new();
225-
headers.insert("hello", "foo0");
230+
headers.insert("hello", "foo0").unwrap();
226231
assert_eq!(headers["hello"], "foo0");
227232
assert_eq!(headers.get("hello").unwrap(), "foo0");
228233
}
229234

230235
#[test]
231236
fn test_debug_single() {
232237
let mut headers = Headers::new();
233-
headers.insert("single", "foo0");
238+
headers.insert("single", "foo0").unwrap();
234239
assert_eq!(format!("{:?}", headers), r#"{"single": "foo0"}"#);
235240
}
236241

237242
#[test]
238243
fn test_debug_multiple() {
239244
let mut headers = Headers::new();
240-
headers.append("multi", "foo0");
241-
headers.append("multi", "foo1");
245+
headers.append("multi", "foo0").unwrap();
246+
headers.append("multi", "foo1").unwrap();
242247
assert_eq!(format!("{:?}", headers), r#"{"multi": ["foo0", "foo1"]}"#);
243248
}
244249
}

src/hyperium_http.rs

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ impl TryFrom<http::HeaderMap> for Headers {
102102
if let Some(name) = name {
103103
let value: HeaderValue = value.try_into()?;
104104
let name: HeaderName = name.try_into()?;
105-
headers.append(name, value);
105+
headers.append(name, value)?;
106106
}
107107
Ok(())
108108
})
@@ -140,16 +140,20 @@ impl TryFrom<Headers> for http::HeaderMap {
140140
}
141141
}
142142

143-
fn hyperium_headers_to_headers(hyperium_headers: http::HeaderMap, headers: &mut Headers) {
143+
fn hyperium_headers_to_headers(
144+
hyperium_headers: http::HeaderMap,
145+
headers: &mut Headers,
146+
) -> crate::Result<()> {
144147
for (name, value) in hyperium_headers {
145148
let value = value.as_bytes().to_owned();
146149
let value = unsafe { HeaderValue::from_bytes_unchecked(value) };
147150
if let Some(name) = name {
148151
let name = name.as_str().as_bytes().to_owned();
149152
let name = unsafe { HeaderName::from_bytes_unchecked(name) };
150-
headers.append(name, value);
153+
headers.append(name, value)?;
151154
}
152155
}
156+
Ok(())
153157
}
154158

155159
fn headers_to_hyperium_headers(headers: &mut Headers, hyperium_headers: &mut http::HeaderMap) {
@@ -176,7 +180,7 @@ fn from_url_to_uri(url: &Url) -> http::Uri {
176180
}
177181

178182
impl TryFrom<http::Request<Body>> for Request {
179-
type Error = crate::url::ParseError;
183+
type Error = crate::Error;
180184

181185
fn try_from(req: http::Request<Body>) -> Result<Self, Self::Error> {
182186
let (parts, body) = req.into_parts();
@@ -185,7 +189,7 @@ impl TryFrom<http::Request<Body>> for Request {
185189
let mut req = Request::new(method, url);
186190
req.set_body(body);
187191
req.set_version(Some(parts.version.into()));
188-
hyperium_headers_to_headers(parts.headers, req.as_mut());
192+
hyperium_headers_to_headers(parts.headers, req.as_mut())?;
189193
Ok(req)
190194
}
191195
}
@@ -203,14 +207,15 @@ impl From<Request> for http::Request<Body> {
203207
}
204208
}
205209

206-
impl From<http::Response<Body>> for Response {
207-
fn from(res: http::Response<Body>) -> Self {
210+
impl TryFrom<http::Response<Body>> for Response {
211+
type Error = crate::Error;
212+
fn try_from(res: http::Response<Body>) -> Result<Self, Self::Error> {
208213
let (parts, body) = res.into_parts();
209214
let mut res = Response::new(parts.status);
210215
res.set_body(body);
211216
res.set_version(Some(parts.version.into()));
212-
hyperium_headers_to_headers(parts.headers, res.as_mut());
213-
res
217+
hyperium_headers_to_headers(parts.headers, res.as_mut())?;
218+
Ok(res)
214219
}
215220
}
216221

src/other/date.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ mod test {
129129
#[test]
130130
fn bad_request_on_parse_error() {
131131
let mut headers = Headers::new();
132-
headers.insert(DATE, "<nori ate the tag. yum.>");
132+
headers.insert(DATE, "<nori ate the tag. yum.>").unwrap();
133133
let err = Date::from_headers(headers).unwrap_err();
134134
assert_eq!(err.status(), 400);
135135
}

src/other/expect.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ mod test {
8787
#[test]
8888
fn bad_request_on_parse_error() {
8989
let mut headers = Headers::new();
90-
headers.insert(EXPECT, "<nori ate the tag. yum.>");
90+
headers.insert(EXPECT, "<nori ate the tag. yum.>").unwrap();
9191
let err = Expect::from_headers(headers).unwrap_err();
9292
assert_eq!(err.status(), 400);
9393
}

src/other/referer.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,9 @@ mod test {
123123
#[test]
124124
fn bad_request_on_parse_error() {
125125
let mut headers = Headers::new();
126-
headers.insert(REFERER, "htt://<nori ate the tag. yum.>");
126+
headers
127+
.insert(REFERER, "htt://<nori ate the tag. yum.>")
128+
.unwrap();
127129
let err =
128130
Referer::from_headers(Url::parse("https://example.net").unwrap(), headers).unwrap_err();
129131
assert_eq!(err.status(), 500);
@@ -132,7 +134,7 @@ mod test {
132134
#[test]
133135
fn fallback_works() -> crate::Result<()> {
134136
let mut headers = Headers::new();
135-
headers.insert(REFERER, "/test.json");
137+
headers.insert(REFERER, "/test.json").unwrap();
136138

137139
let base_url = Url::parse("https://fallback.net/")?;
138140
let referer = Referer::from_headers(base_url, headers)?.unwrap();
@@ -142,7 +144,9 @@ mod test {
142144
);
143145

144146
let mut headers = Headers::new();
145-
headers.insert(REFERER, "https://example.com/test.json");
147+
headers
148+
.insert(REFERER, "https://example.com/test.json")
149+
.unwrap();
146150

147151
let base_url = Url::parse("https://fallback.net/")?;
148152
let referer = Referer::from_headers(base_url, headers)?.unwrap();

0 commit comments

Comments
 (0)