mirror of
https://github.com/fafhrd91/actix-web
synced 2024-11-23 16:21:06 +01:00
feat(http): impl FromIter for HeaderMap
This commit is contained in:
parent
e97e28db4f
commit
5c6e0e17d3
@ -2,6 +2,10 @@
|
|||||||
|
|
||||||
## Unreleased
|
## Unreleased
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Implement `FromIterator<(HeaderName, HeaderValue)>` for `HeaderMap`.
|
||||||
|
|
||||||
## 3.8.0
|
## 3.8.0
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
@ -13,8 +13,9 @@ use super::AsHeaderName;
|
|||||||
/// `HeaderMap` is a "multi-map" of [`HeaderName`] to one or more [`HeaderValue`]s.
|
/// `HeaderMap` is a "multi-map" of [`HeaderName`] to one or more [`HeaderValue`]s.
|
||||||
///
|
///
|
||||||
/// # Examples
|
/// # Examples
|
||||||
|
///
|
||||||
/// ```
|
/// ```
|
||||||
/// use actix_http::header::{self, HeaderMap, HeaderValue};
|
/// # use actix_http::header::{self, HeaderMap, HeaderValue};
|
||||||
///
|
///
|
||||||
/// let mut map = HeaderMap::new();
|
/// let mut map = HeaderMap::new();
|
||||||
///
|
///
|
||||||
@ -29,6 +30,21 @@ use super::AsHeaderName;
|
|||||||
///
|
///
|
||||||
/// assert!(!map.contains_key(header::ORIGIN));
|
/// assert!(!map.contains_key(header::ORIGIN));
|
||||||
/// ```
|
/// ```
|
||||||
|
///
|
||||||
|
/// Construct a header map using the [`FromIterator`] implementation. Note that it uses the append
|
||||||
|
/// strategy, so duplicate header names are preserved.
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// use actix_http::header::{self, HeaderMap, HeaderValue};
|
||||||
|
///
|
||||||
|
/// let headers = HeaderMap::from_iter([
|
||||||
|
/// (header::CONTENT_TYPE, HeaderValue::from_static("text/plain")),
|
||||||
|
/// (header::COOKIE, HeaderValue::from_static("foo=1")),
|
||||||
|
/// (header::COOKIE, HeaderValue::from_static("bar=1")),
|
||||||
|
/// ]);
|
||||||
|
///
|
||||||
|
/// assert_eq!(headers.len(), 3);
|
||||||
|
/// ```
|
||||||
#[derive(Debug, Clone, Default)]
|
#[derive(Debug, Clone, Default)]
|
||||||
pub struct HeaderMap {
|
pub struct HeaderMap {
|
||||||
pub(crate) inner: AHashMap<HeaderName, Value>,
|
pub(crate) inner: AHashMap<HeaderName, Value>,
|
||||||
@ -368,8 +384,8 @@ impl HeaderMap {
|
|||||||
/// let removed = map.insert(header::ACCEPT, HeaderValue::from_static("text/html"));
|
/// let removed = map.insert(header::ACCEPT, HeaderValue::from_static("text/html"));
|
||||||
/// assert!(!removed.is_empty());
|
/// assert!(!removed.is_empty());
|
||||||
/// ```
|
/// ```
|
||||||
pub fn insert(&mut self, key: HeaderName, val: HeaderValue) -> Removed {
|
pub fn insert(&mut self, name: HeaderName, val: HeaderValue) -> Removed {
|
||||||
let value = self.inner.insert(key, Value::one(val));
|
let value = self.inner.insert(name, Value::one(val));
|
||||||
Removed::new(value)
|
Removed::new(value)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -636,6 +652,16 @@ impl<'a> IntoIterator for &'a HeaderMap {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl FromIterator<(HeaderName, HeaderValue)> for HeaderMap {
|
||||||
|
fn from_iter<T: IntoIterator<Item = (HeaderName, HeaderValue)>>(iter: T) -> Self {
|
||||||
|
iter.into_iter()
|
||||||
|
.fold(Self::new(), |mut map, (name, value)| {
|
||||||
|
map.append(name, value);
|
||||||
|
map
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Convert a `http::HeaderMap` to our `HeaderMap`.
|
/// Convert a `http::HeaderMap` to our `HeaderMap`.
|
||||||
impl From<http::HeaderMap> for HeaderMap {
|
impl From<http::HeaderMap> for HeaderMap {
|
||||||
fn from(mut map: http::HeaderMap) -> Self {
|
fn from(mut map: http::HeaderMap) -> Self {
|
||||||
|
@ -163,6 +163,7 @@ mod tests {
|
|||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
struct PinType(PhantomPinned);
|
struct PinType(PhantomPinned);
|
||||||
|
|
||||||
impl MessageBody for PinType {
|
impl MessageBody for PinType {
|
||||||
|
Loading…
Reference in New Issue
Block a user