diff options
author | Teddy Wing | 2020-06-27 18:32:41 +0200 |
---|---|---|
committer | Teddy Wing | 2020-06-27 18:32:41 +0200 |
commit | 13cc04731d01ce216b274f53c920f9e19d15e25e (patch) | |
tree | a7e2f55c1df00426632adfb0ff398982510b8e8e /src | |
parent | a99b8b984180d7089006ef9f92259984be4f74ef (diff) | |
download | fastcgi-conduit-13cc04731d01ce216b274f53c920f9e19d15e25e.tar.bz2 |
FastCgiRequest: Parse headers to a `conduit::HeaderMap`
Diffstat (limited to 'src')
-rw-r--r-- | src/lib.rs | 35 |
1 files changed, 29 insertions, 6 deletions
@@ -16,6 +16,12 @@ use snafu::{ResultExt, Snafu}; pub enum RequestError { #[snafu(display("{}", source))] InvalidMethod { source: http::method::InvalidMethod }, + + #[snafu(display("{}", source))] + InvalidHeaderName { source: conduit::header::InvalidHeaderName }, + + #[snafu(display("{}", source))] + InvalidHeaderValue { source: conduit::header::InvalidHeaderValue }, } pub type RequestResult<T, E = RequestError> = std::result::Result<T, E>; @@ -24,6 +30,7 @@ pub type RequestResult<T, E = RequestError> = std::result::Result<T, E>; struct FastCgiRequest<'a> { request: &'a fastcgi::Request, method: conduit::Method, + headers: conduit::HeaderMap, } impl<'a> FastCgiRequest<'a> { @@ -31,20 +38,17 @@ impl<'a> FastCgiRequest<'a> { let method = Self::method(request) .context(InvalidMethod)?; + let headers = Self::headers(request.params())?; + let r = Self { request: request, method: method, + headers: headers, }; - r.parse(); - Ok(r) } - fn parse(&self) { - let headers = Self::headers_from_params(self.request.params()); - } - fn method( request: &'a fastcgi::Request ) -> Result<conduit::Method, http::method::InvalidMethod> { @@ -55,6 +59,25 @@ impl<'a> FastCgiRequest<'a> { ) } + fn headers(params: fastcgi::Params) -> RequestResult<conduit::HeaderMap> { + let mut map = conduit::HeaderMap::new(); + let headers = Self::headers_from_params(params); + + for (name, value) in headers + .iter() + .map(|(name, value)| (name.as_bytes(), value.as_bytes())) + { + map.append( + conduit::header::HeaderName::from_bytes(name) + .context(InvalidHeaderName)?, + conduit::header::HeaderValue::from_bytes(value) + .context(InvalidHeaderValue)?, + ); + } + + Ok(map) + } + fn headers_from_params(params: fastcgi::Params) -> Vec<(String, String)> { return params .filter(|(key, _)| key.starts_with("HTTP_")) |