aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server.rs43
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(())