1
- use super :: HeaderValue ;
2
- use super :: name:: { HeaderName , HdrName , InvalidHeaderName } ;
3
-
4
1
use std:: { fmt, mem, ops, ptr, vec} ;
5
2
use std:: collections:: hash_map:: RandomState ;
6
- use std:: hash:: { BuildHasher , Hasher , Hash } ;
3
+ use std:: collections:: HashMap ;
4
+ use std:: hash:: { BuildHasher , Hash , Hasher } ;
7
5
use std:: iter:: FromIterator ;
8
6
use std:: marker:: PhantomData ;
9
7
8
+ use convert:: { HttpTryFrom , HttpTryInto } ;
9
+ use Error ;
10
+
11
+ use super :: HeaderValue ;
12
+ use super :: name:: { HdrName , HeaderName , InvalidHeaderName } ;
13
+
10
14
pub use self :: as_header_name:: AsHeaderName ;
11
15
pub use self :: into_header_name:: IntoHeaderName ;
12
16
@@ -23,6 +27,7 @@ pub use self::into_header_name::IntoHeaderName;
23
27
/// ```
24
28
/// # use http::HeaderMap;
25
29
/// # use http::header::{CONTENT_LENGTH, HOST, LOCATION};
30
+ /// # use http::HttpTryFrom;
26
31
/// let mut headers = HeaderMap::new();
27
32
///
28
33
/// headers.insert(HOST, "example.com".parse().unwrap());
@@ -1720,6 +1725,43 @@ impl<T> FromIterator<(HeaderName, T)> for HeaderMap<T>
1720
1725
}
1721
1726
}
1722
1727
1728
+ /// Convert a collection of tuples into a HeaderMap
1729
+ ///
1730
+ /// # Examples
1731
+ ///
1732
+ /// ```
1733
+ /// # use http::{HttpTryFrom, Result, header::HeaderMap};
1734
+ /// # use std::collections::HashMap;
1735
+ /// let mut headers_hashmap: HashMap<String, String> = vec![
1736
+ /// ("X-Custom-Header".to_string(), "my value".to_string()),
1737
+ /// ].iter().cloned().collect();
1738
+ ///
1739
+ /// let good_headers: Result<HeaderMap> = HeaderMap::try_from(&headers_hashmap);
1740
+ /// assert!(good_headers.is_ok());
1741
+ ///
1742
+ /// headers_hashmap.insert("\r".into(), "\0".into());
1743
+ /// let bad_headers: Result<HeaderMap> = HeaderMap::try_from(&headers_hashmap);
1744
+ /// assert!(bad_headers.is_err());
1745
+ /// ```
1746
+ impl < ' a , K , V > HttpTryFrom < & ' a HashMap < K , V > > for HeaderMap < HeaderValue >
1747
+ where
1748
+ K : Eq + Hash ,
1749
+ HeaderName : HttpTryFrom < & ' a K > ,
1750
+ HeaderValue : HttpTryFrom < & ' a V >
1751
+ {
1752
+ type Error = Error ;
1753
+
1754
+ fn try_from ( c : & ' a HashMap < K , V > ) -> Result < Self , Self :: Error > {
1755
+ c. into_iter ( )
1756
+ . map ( |( k, v) | -> :: Result < ( HeaderName , HeaderValue ) > {
1757
+ let name : HeaderName = k. http_try_into ( ) ?;
1758
+ let value : HeaderValue = v. http_try_into ( ) ?;
1759
+ Ok ( ( name, value) )
1760
+ } )
1761
+ . collect ( )
1762
+ }
1763
+ }
1764
+
1723
1765
impl < T > Extend < ( Option < HeaderName > , T ) > for HeaderMap < T > {
1724
1766
/// Extend a `HeaderMap` with the contents of another `HeaderMap`.
1725
1767
///
@@ -3161,7 +3203,7 @@ mod as_header_name {
3161
3203
use super :: { Entry , HdrName , HeaderMap , HeaderName , InvalidHeaderName } ;
3162
3204
3163
3205
/// A marker trait used to identify values that can be used as search keys
3164
- /// to a `HeaderMap`.
3206
+ /// to a `HeaderMap`.
3165
3207
pub trait AsHeaderName : Sealed { }
3166
3208
3167
3209
// All methods are on this pub(super) trait, instead of `AsHeaderName`,
0 commit comments