1use std::convert::TryFrom;
2
3use http::header::{self, HeaderMap, HeaderName, HeaderValue};
4use httparse::Header;
5
6pub(crate) fn convert_raw_headers_to_header_map(raw_headers: &[Header<'_>]) -> crate::Result<HeaderMap> {
7 let mut headers = HeaderMap::with_capacity(raw_headers.len());
8
9 for raw_header in raw_headers {
10 let name = HeaderName::try_from(raw_header.name).map_err(|err| crate::Error::DecodeHeaderName {
11 name: raw_header.name.to_owned(),
12 cause: err.into(),
13 })?;
14
15 let value = HeaderValue::try_from(raw_header.value).map_err(|err| crate::Error::DecodeHeaderValue {
16 value: raw_header.value.to_owned(),
17 cause: err.into(),
18 })?;
19
20 headers.insert(name, value);
21 }
22
23 Ok(headers)
24}
25
26pub(crate) fn parse_content_type(headers: &HeaderMap) -> Option<mime::Mime> {
27 headers
28 .get(header::CONTENT_TYPE)
29 .and_then(|val| val.to_str().ok())
30 .and_then(|val| val.parse::<mime::Mime>().ok())
31}