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/lib.rs | |
| parent | a99b8b984180d7089006ef9f92259984be4f74ef (diff) | |
| download | fastcgi-conduit-13cc04731d01ce216b274f53c920f9e19d15e25e.tar.bz2 | |
FastCgiRequest: Parse headers to a `conduit::HeaderMap`
Diffstat (limited to 'src/lib.rs')
| -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_")) | 
