Skip to content

Commit 5c6e0e1

Browse files
committed
feat(http): impl FromIter for HeaderMap
1 parent e97e28d commit 5c6e0e1

File tree

3 files changed

+34
-3
lines changed

3 files changed

+34
-3
lines changed

actix-http/CHANGES.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
## Unreleased
44

5+
### Added
6+
7+
- Implement `FromIterator<(HeaderName, HeaderValue)>` for `HeaderMap`.
8+
59
## 3.8.0
610

711
### Added

actix-http/src/header/map.rs

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,9 @@ use super::AsHeaderName;
1313
/// `HeaderMap` is a "multi-map" of [`HeaderName`] to one or more [`HeaderValue`]s.
1414
///
1515
/// # Examples
16+
///
1617
/// ```
17-
/// use actix_http::header::{self, HeaderMap, HeaderValue};
18+
/// # use actix_http::header::{self, HeaderMap, HeaderValue};
1819
///
1920
/// let mut map = HeaderMap::new();
2021
///
@@ -29,6 +30,21 @@ use super::AsHeaderName;
2930
///
3031
/// assert!(!map.contains_key(header::ORIGIN));
3132
/// ```
33+
///
34+
/// Construct a header map using the [`FromIterator`] implementation. Note that it uses the append
35+
/// strategy, so duplicate header names are preserved.
36+
///
37+
/// ```
38+
/// use actix_http::header::{self, HeaderMap, HeaderValue};
39+
///
40+
/// let headers = HeaderMap::from_iter([
41+
/// (header::CONTENT_TYPE, HeaderValue::from_static("text/plain")),
42+
/// (header::COOKIE, HeaderValue::from_static("foo=1")),
43+
/// (header::COOKIE, HeaderValue::from_static("bar=1")),
44+
/// ]);
45+
///
46+
/// assert_eq!(headers.len(), 3);
47+
/// ```
3248
#[derive(Debug, Clone, Default)]
3349
pub struct HeaderMap {
3450
pub(crate) inner: AHashMap<HeaderName, Value>,
@@ -368,8 +384,8 @@ impl HeaderMap {
368384
/// let removed = map.insert(header::ACCEPT, HeaderValue::from_static("text/html"));
369385
/// assert!(!removed.is_empty());
370386
/// ```
371-
pub fn insert(&mut self, key: HeaderName, val: HeaderValue) -> Removed {
372-
let value = self.inner.insert(key, Value::one(val));
387+
pub fn insert(&mut self, name: HeaderName, val: HeaderValue) -> Removed {
388+
let value = self.inner.insert(name, Value::one(val));
373389
Removed::new(value)
374390
}
375391

@@ -636,6 +652,16 @@ impl<'a> IntoIterator for &'a HeaderMap {
636652
}
637653
}
638654

655+
impl FromIterator<(HeaderName, HeaderValue)> for HeaderMap {
656+
fn from_iter<T: IntoIterator<Item = (HeaderName, HeaderValue)>>(iter: T) -> Self {
657+
iter.into_iter()
658+
.fold(Self::new(), |mut map, (name, value)| {
659+
map.append(name, value);
660+
map
661+
})
662+
}
663+
}
664+
639665
/// Convert a `http::HeaderMap` to our `HeaderMap`.
640666
impl From<http::HeaderMap> for HeaderMap {
641667
fn from(mut map: http::HeaderMap) -> Self {

awc/src/any_body.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ mod tests {
163163

164164
use super::*;
165165

166+
#[allow(dead_code)]
166167
struct PinType(PhantomPinned);
167168

168169
impl MessageBody for PinType {

0 commit comments

Comments
 (0)