diff options
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_")) |