aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTeddy Wing2020-06-27 18:32:41 +0200
committerTeddy Wing2020-06-27 18:32:41 +0200
commit13cc04731d01ce216b274f53c920f9e19d15e25e (patch)
treea7e2f55c1df00426632adfb0ff398982510b8e8e /src
parenta99b8b984180d7089006ef9f92259984be4f74ef (diff)
downloadfastcgi-conduit-13cc04731d01ce216b274f53c920f9e19d15e25e.tar.bz2
FastCgiRequest: Parse headers to a `conduit::HeaderMap`
Diffstat (limited to 'src')
-rw-r--r--src/lib.rs35
1 files changed, 29 insertions, 6 deletions
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<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_"))