diff options
| author | Teddy Wing | 2020-06-29 01:42:01 +0200 | 
|---|---|---|
| committer | Teddy Wing | 2020-06-29 01:42:01 +0200 | 
| commit | f630e894ea3a4d789e802bf569e1056e46510faf (patch) | |
| tree | 43ea87f5a51b149ceb522031ef7804e676251c9c | |
| parent | 7b4e04adbcc2a7892a45ce537871a2efcb826dd4 (diff) | |
| download | fastcgi-conduit-f630e894ea3a4d789e802bf569e1056e46510faf.tar.bz2 | |
server::handle_request: Return errors
Add a new error type that we can use to collect and match errors from
`handle_request()`.
| -rw-r--r-- | src/server.rs | 43 | 
1 files changed, 31 insertions, 12 deletions
| diff --git a/src/server.rs b/src/server.rs index 297e555..0dd6d70 100644 --- a/src/server.rs +++ b/src/server.rs @@ -3,7 +3,22 @@ use std::io::Write;  use conduit::Handler; -use crate::request::FastCgiRequest; +use snafu::{ResultExt, Snafu}; + +use crate::request; + + +#[derive(Debug, Snafu)] +pub enum Error { +    #[snafu(display("{}", source))] +    Io { source: io::Error }, + +    #[snafu(display("Couldn't build request: {}", source))] +    RequestBuilder { source: request::RequestError }, + +    #[snafu(display("Couldn't parse response: {}", source))] +    ConduitResponse { source: conduit::BoxError }, +}  pub struct Server; @@ -21,35 +36,39 @@ impl Server {  fn handle_request<H>(      mut raw_request: &mut fastcgi::Request,      handler: &H, -) -> Result<(), ()> +) -> Result<(), Error>  where H: Handler + 'static + Sync  { -    let mut request = FastCgiRequest::new(&mut raw_request).unwrap(); +    let mut request = request::FastCgiRequest::new(&mut raw_request) +        .context(RequestBuilder)?;      let response = handler.call(&mut request);      let mut stdout = raw_request.stdout(); -    let (head, body) = response.unwrap().into_parts(); +    let (head, body) = response +        .context(ConduitResponse)? +        .into_parts();      write!(          &mut stdout,          "HTTP/1.1 {} {}\r\n",          head.status.as_str(),          head.status.canonical_reason().unwrap_or("UNKNOWN"), -    ); +    ) +        .context(Io)?;      for (name, value) in head.headers.iter() { -        write!(&mut stdout, "{}: ", name).unwrap(); -        stdout.write(value.as_bytes()).unwrap(); -        stdout.write(b"\r\n").unwrap(); +        write!(&mut stdout, "{}: ", name).context(Io)?; +        stdout.write(value.as_bytes()).context(Io)?; +        stdout.write(b"\r\n").context(Io)?;      } -    stdout.write(b"\r\n").unwrap(); +    stdout.write(b"\r\n").context(Io)?;      match body { -        conduit::Body::Static(slice) => stdout.write(slice).map(|_| ()).unwrap(), -        conduit::Body::Owned(vec) => stdout.write(&vec).map(|_| ()).unwrap(), -        conduit::Body::File(mut file) => io::copy(&mut file, &mut stdout).map(|_| ()).unwrap(), +        conduit::Body::Static(slice) => stdout.write(slice).map(|_| ()).context(Io)?, +        conduit::Body::Owned(vec) => stdout.write(&vec).map(|_| ()).context(Io)?, +        conduit::Body::File(mut file) => io::copy(&mut file, &mut stdout).map(|_| ()).context(Io)?,      };      Ok(()) | 
