1
- use super :: name:: { HdrName , HeaderName , InvalidHeaderName } ;
2
- use super :: HeaderValue ;
3
-
1
+ use std:: collections:: HashMap ;
4
2
use std:: collections:: hash_map:: RandomState ;
5
3
use std:: hash:: { BuildHasher , Hash , Hasher } ;
6
4
use std:: iter:: { FromIterator , FusedIterator } ;
7
5
use std:: marker:: PhantomData ;
8
6
use std:: { fmt, mem, ops, ptr, vec} ;
9
7
8
+ use crate :: convert:: { HttpTryFrom , HttpTryInto } ;
9
+ use crate :: 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());
@@ -1749,6 +1754,43 @@ impl<T> FromIterator<(HeaderName, T)> for HeaderMap<T> {
1749
1754
}
1750
1755
}
1751
1756
1757
+ /// Convert a collection of tuples into a HeaderMap
1758
+ ///
1759
+ /// # Examples
1760
+ ///
1761
+ /// ```
1762
+ /// # use http::{HttpTryFrom, Result, header::HeaderMap};
1763
+ /// # use std::collections::HashMap;
1764
+ /// let mut headers_hashmap: HashMap<String, String> = vec![
1765
+ /// ("X-Custom-Header".to_string(), "my value".to_string()),
1766
+ /// ].iter().cloned().collect();
1767
+ ///
1768
+ /// let good_headers: Result<HeaderMap> = HeaderMap::try_from(&headers_hashmap);
1769
+ /// assert!(good_headers.is_ok());
1770
+ ///
1771
+ /// headers_hashmap.insert("\r".into(), "\0".into());
1772
+ /// let bad_headers: Result<HeaderMap> = HeaderMap::try_from(&headers_hashmap);
1773
+ /// assert!(bad_headers.is_err());
1774
+ /// ```
1775
+ impl < ' a , K , V > HttpTryFrom < & ' a HashMap < K , V > > for HeaderMap < HeaderValue >
1776
+ where
1777
+ K : Eq + Hash ,
1778
+ HeaderName : HttpTryFrom < & ' a K > ,
1779
+ HeaderValue : HttpTryFrom < & ' a V >
1780
+ {
1781
+ type Error = Error ;
1782
+
1783
+ fn try_from ( c : & ' a HashMap < K , V > ) -> Result < Self , Self :: Error > {
1784
+ c. into_iter ( )
1785
+ . map ( |( k, v) | -> crate :: Result < ( HeaderName , HeaderValue ) > {
1786
+ let name : HeaderName = k. http_try_into ( ) ?;
1787
+ let value : HeaderValue = v. http_try_into ( ) ?;
1788
+ Ok ( ( name, value) )
1789
+ } )
1790
+ . collect ( )
1791
+ }
1792
+ }
1793
+
1752
1794
impl < T > Extend < ( Option < HeaderName > , T ) > for HeaderMap < T > {
1753
1795
/// Extend a `HeaderMap` with the contents of another `HeaderMap`.
1754
1796
///
@@ -3209,7 +3251,7 @@ mod as_header_name {
3209
3251
use super :: { Entry , HdrName , HeaderMap , HeaderName , InvalidHeaderName } ;
3210
3252
3211
3253
/// A marker trait used to identify values that can be used as search keys
3212
- /// to a `HeaderMap`.
3254
+ /// to a `HeaderMap`.
3213
3255
pub trait AsHeaderName : Sealed { }
3214
3256
3215
3257
// All methods are on this pub(super) trait, instead of `AsHeaderName`,
0 commit comments