diff --git a/src/server/connection.rs b/src/server/connection.rs index cc99eb0..4f2b625 100644 --- a/src/server/connection.rs +++ b/src/server/connection.rs @@ -56,14 +56,14 @@ impl Connection { true }) }) { - self.session - .access_log - .clf(&self.address.client, Some(&q), 0, t); + if let Some(ref a) = self.session.access_log { + a.clf(&self.address.client, Some(&q), 0, t) + } self.shutdown() } else { - self.session - .access_log - .clf(&self.address.client, Some(&q), 1, t); + if let Some(ref a) = self.session.access_log { + a.clf(&self.address.client, Some(&q), 1, t) + } if self.session.is_debug { println!( "[{}] - [{}] connection closed by client.", @@ -87,9 +87,9 @@ impl Connection { self.address.server, self.address.client ) }; - self.session - .access_log - .clf(&self.address.client, None, 2, t); + if let Some(ref a) = self.session.access_log { + a.clf(&self.address.client, None, 2, t) + } self.shutdown() } Err(e) => { @@ -97,9 +97,9 @@ impl Connection { "[{}] > [{}] handle request error: `{e}`", self.address.server, self.address.client ); - self.session - .access_log - .clf(&self.address.client, None, 1, t); + if let Some(ref a) = self.session.access_log { + a.clf(&self.address.client, None, 1, t) + } self.shutdown() } }, diff --git a/src/session.rs b/src/session.rs index 1a56891..a0e535d 100644 --- a/src/session.rs +++ b/src/session.rs @@ -7,7 +7,7 @@ use {access_log::AccessLog, public::Public, request::Request, template::Template /// Shared, multi-thread features for the current server session pub struct Session { - pub access_log: AccessLog, + pub access_log: Option, pub public: Public, pub request: Option, pub template: Template, diff --git a/src/session/access_log.rs b/src/session/access_log.rs index 6025f5b..db97883 100644 --- a/src/session/access_log.rs +++ b/src/session/access_log.rs @@ -5,33 +5,32 @@ use std::{fs::File, io::Write, net::SocketAddr, sync::RwLock}; /// Writes log as -pub struct AccessLog(Option>); +pub struct AccessLog(RwLock); impl AccessLog { - pub fn init(config: &crate::config::Config) -> anyhow::Result { - Ok(Self(match config.access_log { - Some(ref p) => Some(RwLock::new(File::create(p)?)), + pub fn init(config: &crate::config::Config) -> anyhow::Result> { + Ok(match config.access_log { + Some(ref p) => Some(Self(RwLock::new(File::create(p)?))), None => None, - })) + }) } /// [CLF](https://en.wikipedia.org/wiki/Common_Log_Format) /// /// * the code value (`u8`) is relative, use 1|0 for failure / success pub fn clf(&self, client: &SocketAddr, query: Option<&str>, code: u8, size: usize) { - if let Some(ref f) = self.0 { - f.write() - .unwrap() - .write_all( - format!( - "{} {} - [{}] \"GET {}\" {code} {size}\n", - client.ip(), - client.port(), - chrono::Local::now().format("%d/%b/%Y:%H:%M:%S %z"), - query.unwrap_or_default(), - ) - .as_bytes(), + self.0 + .write() + .unwrap() + .write_all( + format!( + "{} {} - [{}] \"GET {}\" {code} {size}\n", + client.ip(), + client.port(), + chrono::Local::now().format("%d/%b/%Y:%H:%M:%S %z"), + query.unwrap_or_default(), ) - .unwrap() - } + .as_bytes(), + ) + .unwrap() } }