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: () });