From 62a7be9c35bbd8f39f3a67485bded1a89bb8abbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sylwester=20R=C4=85pa=C5=82a?= Date: Thu, 17 Feb 2022 20:52:04 +0100 Subject: [PATCH] validate if string is valid ascii. close #519 --- src/header/value.rs | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/header/value.rs b/src/header/value.rs index 3ebb8451..d14ba571 100644 --- a/src/header/value.rs +++ b/src/header/value.rs @@ -123,7 +123,15 @@ impl HeaderValue { /// ``` #[inline] pub fn from_str(src: &str) -> Result { - HeaderValue::try_from_generic(src, |s| Bytes::copy_from_slice(s.as_bytes())) + for &b in src.as_bytes() { + if !is_visible_ascii(b) { + return Err(InvalidHeaderValue { _priv: () }); + } + } + Ok(HeaderValue { + inner: Bytes::copy_from_slice(src.as_bytes()), + is_sensitive: false, + }) } /// Converts a HeaderName into a HeaderValue @@ -203,7 +211,6 @@ impl HeaderValue { } } } else { - if_downcast_into!(T, Bytes, src, { return HeaderValue { inner: src, @@ -223,7 +230,10 @@ impl HeaderValue { HeaderValue::try_from_generic(src, std::convert::identity) } - fn try_from_generic, F: FnOnce(T) -> Bytes>(src: T, into: F) -> Result { + fn try_from_generic, F: FnOnce(T) -> Bytes>( + src: T, + into: F, + ) -> Result { for &b in src.as_ref() { if !is_valid(b) { return Err(InvalidHeaderValue { _priv: () });