Skip to content

Commit f1a6640

Browse files
committed
feat: ignore unparsable cookies in Cookie header
1 parent 97e7017 commit f1a6640

File tree

1 file changed

+19
-3
lines changed

1 file changed

+19
-3
lines changed

actix-web/src/request.rs

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -349,9 +349,9 @@ impl HttpRequest {
349349
let mut cookies = Vec::new();
350350
for hdr in self.headers().get_all(COOKIE) {
351351
let s = str::from_utf8(hdr.as_bytes()).map_err(CookieParseError::from)?;
352-
for cookie_str in s.split(';').map(|s| s.trim()) {
353-
if !cookie_str.is_empty() {
354-
cookies.push(Cookie::parse_encoded(cookie_str)?.into_owned());
352+
for cookie_str in s.split(';').map(|s| s.trim()).filter(|s| !s.is_empty()) {
353+
if let Ok(cookie) = Cookie::parse_encoded(cookie_str) {
354+
cookies.push(cookie.into_owned());
355355
}
356356
}
357357
}
@@ -602,6 +602,22 @@ mod tests {
602602
assert!(cookie.is_none());
603603
}
604604

605+
#[test]
606+
#[cfg(feature = "cookies")]
607+
fn test_empty_key() {
608+
let req = TestRequest::default()
609+
.append_header((header::COOKIE, "cookie1=value1; value2; cookie3=value3"))
610+
.to_http_request();
611+
{
612+
let cookies = req.cookies().unwrap();
613+
assert_eq!(cookies.len(), 2);
614+
assert_eq!(cookies[0].name(), "cookie1");
615+
assert_eq!(cookies[0].value(), "value1");
616+
assert_eq!(cookies[1].name(), "cookie3");
617+
assert_eq!(cookies[1].value(), "value3");
618+
}
619+
}
620+
605621
#[test]
606622
fn test_request_query() {
607623
let req = TestRequest::with_uri("/?id=test").to_http_request();

0 commit comments

Comments
 (0)