Skip to content

Commit 998ad22

Browse files
kyle-mccarthyFishrock123
authored andcommitted
feat: add TryFrom impl for HeaderName, HeaderValue, and Headers
1 parent 22ba873 commit 998ad22

File tree

2 files changed

+106
-3
lines changed

2 files changed

+106
-3
lines changed

src/headers/header_values.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ impl AsMut<HeaderValue> for HeaderValues {
146146
&mut self.inner[0]
147147
}
148148
}
149+
149150
impl Deref for HeaderValues {
150151
type Target = HeaderValue;
151152

@@ -170,6 +171,22 @@ impl<'a> IntoIterator for &'a HeaderValues {
170171
}
171172
}
172173

174+
impl From<Vec<HeaderValue>> for HeaderValues {
175+
fn from(headers: Vec<HeaderValue>) -> Self {
176+
Self { inner: headers }
177+
}
178+
}
179+
180+
impl IntoIterator for HeaderValues {
181+
type Item = HeaderValue;
182+
type IntoIter = std::vec::IntoIter<HeaderValue>;
183+
184+
#[inline]
185+
fn into_iter(self) -> Self::IntoIter {
186+
self.inner.into_iter()
187+
}
188+
}
189+
173190
#[cfg(test)]
174191
mod tests {
175192
use super::*;

src/hyperium_http.rs

Lines changed: 89 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
// This is the compat file for the "hyperium/http" crate.
22

3-
use crate::headers::{HeaderName, HeaderValue};
4-
use crate::{Body, Headers, Method, Request, Response, StatusCode, Url, Version};
5-
use std::convert::TryFrom;
3+
use crate::headers::{HeaderName, HeaderValue, Headers};
4+
use crate::{Body, Error, Method, Request, Response, StatusCode, Url, Version};
5+
use std::convert::{TryFrom, TryInto};
66
use std::str::FromStr;
77

88
impl From<http::Method> for Method {
@@ -54,6 +54,92 @@ impl From<Version> for http::Version {
5454
}
5555
}
5656

57+
impl TryFrom<http::header::HeaderName> for HeaderName {
58+
type Error = Error;
59+
60+
fn try_from(name: http::header::HeaderName) -> Result<Self, Self::Error> {
61+
let name = name.as_str().as_bytes().to_owned();
62+
HeaderName::from_bytes(name)
63+
}
64+
}
65+
66+
impl TryFrom<HeaderName> for http::header::HeaderName {
67+
type Error = Error;
68+
69+
fn try_from(name: HeaderName) -> Result<Self, Self::Error> {
70+
let name = name.as_str().as_bytes();
71+
http::header::HeaderName::from_bytes(name).map_err(|e| Error::new_adhoc(e))
72+
}
73+
}
74+
75+
impl TryFrom<http::header::HeaderValue> for HeaderValue {
76+
type Error = Error;
77+
78+
fn try_from(value: http::header::HeaderValue) -> Result<Self, Self::Error> {
79+
let value = value.as_bytes().to_owned();
80+
HeaderValue::from_bytes(value)
81+
}
82+
}
83+
84+
impl TryFrom<HeaderValue> for http::header::HeaderValue {
85+
type Error = Error;
86+
87+
fn try_from(value: HeaderValue) -> Result<Self, Self::Error> {
88+
let value = value.as_str().as_bytes();
89+
http::header::HeaderValue::from_bytes(value).map_err(|e| Error::new_adhoc(e))
90+
}
91+
}
92+
93+
impl TryFrom<http::HeaderMap> for Headers {
94+
type Error = Error;
95+
96+
fn try_from(hyperium_headers: http::HeaderMap) -> Result<Self, Self::Error> {
97+
let mut headers = Headers::new();
98+
99+
hyperium_headers
100+
.into_iter()
101+
.map(|(name, value)| {
102+
if let Some(name) = name {
103+
let value: HeaderValue = value.try_into()?;
104+
let name: HeaderName = name.try_into()?;
105+
headers.append(name, value);
106+
}
107+
Ok(())
108+
})
109+
.collect::<Result<Vec<()>, Error>>()?;
110+
111+
Ok(headers)
112+
}
113+
}
114+
115+
impl TryFrom<Headers> for http::HeaderMap {
116+
type Error = Error;
117+
118+
fn try_from(headers: Headers) -> Result<Self, Self::Error> {
119+
let mut hyperium_headers = http::HeaderMap::new();
120+
121+
headers
122+
.into_iter()
123+
.map(|(name, values)| {
124+
let name: http::header::HeaderName = name.try_into()?;
125+
126+
values
127+
.into_iter()
128+
.map(|value| {
129+
let value: http::header::HeaderValue = value.try_into()?;
130+
hyperium_headers.append(&name, value);
131+
Ok(())
132+
})
133+
.collect::<Result<Vec<()>, Error>>()?;
134+
135+
Ok(())
136+
})
137+
.collect::<Result<Vec<()>, Error>>()?;
138+
139+
Ok(hyperium_headers)
140+
}
141+
}
142+
57143
fn hyperium_headers_to_headers(hyperium_headers: http::HeaderMap, headers: &mut Headers) {
58144
for (name, value) in hyperium_headers {
59145
let value = value.as_bytes().to_owned();

0 commit comments

Comments
 (0)