From ab8b50d5b98ab071c5f70d929f1ca76f3faf71ca Mon Sep 17 00:00:00 2001 From: Teddy Wing Date: Sat, 4 Jul 2020 03:28:02 +0200 Subject: server: Log errors Provide a mechanism to get detailed error messages when 500 internal server errors happen. We don't want to expose any detailed error information to clients, but it would be useful for administrators to know the cause of any errors. --- Cargo.toml | 1 + src/lib.rs | 1 + src/server.rs | 36 +++++++++++++++++++++++------------- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 4d6eb50..60e1ece 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,4 +9,5 @@ conduit-router = "0.9.0-alpha.2" fastcgi = "1.0.0" http = "0.2.1" Inflector = "0.11.4" +log = "0.4.8" snafu = "0.6.8" diff --git a/src/lib.rs b/src/lib.rs index ab40fa9..2ffe77e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,7 @@ extern crate conduit; extern crate fastcgi; extern crate http; +extern crate log; mod request; mod server; diff --git a/src/server.rs b/src/server.rs index 9bbba00..22bf244 100644 --- a/src/server.rs +++ b/src/server.rs @@ -3,6 +3,8 @@ use std::io::Write; use conduit::Handler; +use log::error; + use snafu::{ResultExt, Snafu}; use crate::request; @@ -31,16 +33,22 @@ impl Server { fastcgi::run(move |mut raw_request| { match handle_request(&mut raw_request, &handler) { Ok(_) => (), - - // TODO: log - // Ignore write errors as clients will have closed the - // connection by this point. - Err(Error::Write { .. }) => (), - - Err(Error::RequestBuilder { .. }) => - internal_server_error(&mut raw_request.stdout()), - Err(Error::ConduitResponse { .. }) => - internal_server_error(&mut raw_request.stdout()), + Err(e) => match e { + // Ignore write errors as clients will have closed the + // connection by this point. + Error::Write { .. } => error!("Write error: {}", e), + + Error::RequestBuilder { .. } => { + error!("Unable to build request: {}", e); + + internal_server_error(&mut raw_request.stdout()) + }, + Error::ConduitResponse { .. } => { + error!("Error getting response: {}", e); + + internal_server_error(&mut raw_request.stdout()) + }, + } } }); @@ -95,13 +103,15 @@ where H: Handler + 'static + Sync fn internal_server_error(mut w: W) { let code = conduit::StatusCode::INTERNAL_SERVER_ERROR; - write!( + match write!( w, "{} {} {}\r\n{}\r\n\r\n", HTTP_VERSION, code, code.canonical_reason().unwrap_or_default(), "Content-Length: 0", - ) - .unwrap_or(()) + ) { + Ok(_) => (), + Err(e) => error!("Write error: {}", e), + } } -- cgit v1.2.3