diff --git a/src/convert.rs b/src/convert.rs index 16943f7..4d937a6 100644 --- a/src/convert.rs +++ b/src/convert.rs @@ -56,10 +56,21 @@ reflexive! { Uri, Method, StatusCode, - HeaderMap, HeaderName, HeaderValue, Scheme, Authority, PathAndQuery, } + +// HeaderMap can't use reflexive easily due to the generic T + +impl HttpTryFrom> for HeaderMap { + type Error = Error; + + fn try_from(t: Self) -> Result { + Ok(t) + } +} + +impl Sealed for HeaderMap {} diff --git a/src/header/map.rs b/src/header/map.rs index fd86cc6..4462d37 100644 --- a/src/header/map.rs +++ b/src/header/map.rs @@ -27,7 +27,6 @@ pub use self::into_header_name::IntoHeaderName; /// ``` /// # use http::HeaderMap; /// # use http::header::{CONTENT_LENGTH, HOST, LOCATION}; -/// # use http::HttpTryFrom; /// let mut headers = HeaderMap::new(); /// /// headers.insert(HOST, "example.com".parse().unwrap()); @@ -1725,37 +1724,33 @@ impl FromIterator<(HeaderName, T)> for HeaderMap } } -/// Convert a collection of tuples into a HeaderMap +/// Try to convert a `HashMap` into a `HeaderMap`. /// /// # Examples /// /// ``` -/// # use http::{HttpTryFrom, Result, header::HeaderMap}; -/// # use std::collections::HashMap; -/// let mut headers_hashmap: HashMap = vec![ -/// ("X-Custom-Header".to_string(), "my value".to_string()), -/// ].iter().cloned().collect(); +/// use std::collections::HashMap; +/// use http::{HttpTryFrom, header::HeaderMap}; /// -/// let good_headers: Result = HeaderMap::try_from(&headers_hashmap); -/// assert!(good_headers.is_ok()); +/// let mut map = HashMap::new(); +/// map.insert("X-Custom-Header".to_string(), "my value".to_string()); /// -/// headers_hashmap.insert("\r".into(), "\0".into()); -/// let bad_headers: Result = HeaderMap::try_from(&headers_hashmap); -/// assert!(bad_headers.is_err()); +/// let headers: HeaderMap = HttpTryFrom::try_from(&map).expect("valid headers"); +/// assert_eq!(headers["X-Custom-Header"], "my value"); /// ``` -impl<'a, K, V> HttpTryFrom<&'a HashMap> for HeaderMap +impl<'a, K, V, T> HttpTryFrom<&'a HashMap> for HeaderMap where K: Eq + Hash, HeaderName: HttpTryFrom<&'a K>, - HeaderValue: HttpTryFrom<&'a V> + T: HttpTryFrom<&'a V> { type Error = Error; fn try_from(c: &'a HashMap) -> Result { c.into_iter() - .map(|(k, v)| -> ::Result<(HeaderName, HeaderValue)> { - let name : HeaderName = k.http_try_into()?; - let value : HeaderValue = v.http_try_into()?; + .map(|(k, v)| { + let name = k.http_try_into()?; + let value = v.http_try_into()?; Ok((name, value)) }) .collect()