From 13cc04731d01ce216b274f53c920f9e19d15e25e Mon Sep 17 00:00:00 2001 From: Teddy Wing Date: Sat, 27 Jun 2020 18:32:41 +0200 Subject: FastCgiRequest: Parse headers to a `conduit::HeaderMap` --- src/lib.rs | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/lib.rs b/src/lib.rs index 6253bf0..a8f55a5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -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 = std::result::Result; @@ -24,6 +30,7 @@ pub type RequestResult = std::result::Result; 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 { @@ -55,6 +59,25 @@ impl<'a> FastCgiRequest<'a> { ) } + fn headers(params: fastcgi::Params) -> RequestResult { + 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_")) -- cgit v1.2.3