From 212ffeab79c9880b31cd40c33d7b0b5389736430 Mon Sep 17 00:00:00 2001 From: yggverse Date: Sat, 28 Jun 2025 21:11:18 +0300 Subject: [PATCH] reorganize debug events --- README.md | 8 ++--- src/config.rs | 9 ++--- src/main.rs | 12 +++---- src/response.rs | 6 ++-- src/server.rs | 8 ++--- src/server/connection.rs | 72 +++++++++++++++++++++++--------------- src/session.rs | 7 ++-- src/session/debug.rs | 30 ---------------- src/session/debug/level.rs | 17 --------- src/session/public.rs | 23 ++++++------ 10 files changed, 75 insertions(+), 117 deletions(-) delete mode 100644 src/session/debug.rs delete mode 100644 src/session/debug/level.rs diff --git a/README.md b/README.md index e55ce15..aa5b11d 100644 --- a/README.md +++ b/README.md @@ -41,12 +41,8 @@ nexy -p /path/to/public_dir [default: 127.0.0.1:1900 [::1]:1900] --d, --debug - Debug level - - * `e` - error * `i` - info - - [default: ei] +-d, --debug + Print debug information -p, --public Absolute path to the public files directory diff --git a/src/config.rs b/src/config.rs index 5f0edfc..56378df 100644 --- a/src/config.rs +++ b/src/config.rs @@ -20,12 +20,9 @@ pub struct Config { ])] pub bind: Vec, - /// Debug level - /// - /// * `e` - error - /// * `i` - info - #[arg(short, long, default_value_t = String::from("ei"))] - pub debug: String, + /// Print debug information + #[arg(short, long, default_value_t = false)] + pub debug: bool, /// Absolute path to the public files directory #[arg(short, long)] diff --git a/src/main.rs b/src/main.rs index 12fd15b..d36f928 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,10 +5,10 @@ mod session; fn main() -> anyhow::Result<()> { use clap::Parser; - let a = config::Config::parse(); - let s = std::sync::Arc::new(session::Session::init(&a)?); - for b in a.bind { - s.debug.info(&format!("start server on `{b}`...")); + let c = config::Config::parse(); + let s = std::sync::Arc::new(session::Session::init(&c)?); + for b in c.bind { + println!("start server on `{b}`..."); match std::net::TcpListener::bind(&b) { Ok(r) => { std::thread::spawn({ @@ -16,9 +16,7 @@ fn main() -> anyhow::Result<()> { move || server::start(r, &s) }); } - Err(e) => s - .debug - .error(&format!("failed to start server on `{b}`: `{e}`")), + Err(e) => eprintln!("failed to start server on `{b}`: `{e}`"), } } std::thread::park(); diff --git a/src/response.rs b/src/response.rs index e508ec6..35eeaae 100644 --- a/src/response.rs +++ b/src/response.rs @@ -1,9 +1,9 @@ -/// Internal types +/// Internal server response types pub enum Response<'a> { /// Includes reference to the original request AccessDenied(&'a str), - /// Includes server-side error description - InternalServerError(String), + /// Includes query + server-side error description + InternalServerError(&'a str, String), /// Includes reference to the original request NotFound(&'a str), /// Includes bytes array diff --git a/src/server.rs b/src/server.rs index ab1ba27..9e716a8 100644 --- a/src/server.rs +++ b/src/server.rs @@ -12,15 +12,11 @@ pub fn start(server: TcpListener, session: &Arc) { let session = session.clone(); move || match Connection::init(&session, stream) { Ok(connection) => connection.handle(), - Err(e) => session - .debug - .error(&format!("failed to init connection: `{e}`")), + Err(e) => eprintln!("failed to init connection: `{e}`"), } }); } - Err(e) => session - .debug - .error(&format!("failed to accept incoming connection: `{e}`")), + Err(e) => eprintln!("failed to accept incoming connection: `{e}`"), } } } diff --git a/src/server/connection.rs b/src/server/connection.rs index 893d446..b7e4732 100644 --- a/src/server/connection.rs +++ b/src/server/connection.rs @@ -35,10 +35,12 @@ impl Connection { let mut t = 0; // total bytes match self.request() { Ok(q) => { - self.session.debug.info(&format!( - "[{}] < [{}] request `{q}`...", - self.address.server, self.address.client - )); + if self.session.is_debug { + println!( + "[{}] < [{}] request `{q}`...", + self.address.server, self.address.client + ) + } if let Some(ref i) = self.session.request { i.add(&self.address.client, &q) } @@ -51,10 +53,13 @@ impl Connection { .clf(&self.address.client, Some(&q), 0, t); } Err(e) => { - t += self.response(Response::InternalServerError(format!( - "[{}] < [{}] failed to handle incoming request: `{e}`", - self.address.server, self.address.client - ))); + t += self.response(Response::InternalServerError( + "", + format!( + "[{}] < [{}] failed to handle incoming request: `{e}`", + self.address.server, self.address.client + ), + )); self.session .access_log .clf(&self.address.client, None, 1, t); @@ -87,50 +92,61 @@ impl Connection { ) } } - Response::InternalServerError(e) => { - self.session.debug.error(&e); + Response::InternalServerError(q, e) => { + eprintln!( + "[{}] > [{}] `{q}`: internal server error: `{e}`", + self.address.server, self.address.client + ); self.session.template.internal_server_error() } Response::AccessDenied(q) => { - self.session.debug.error(&format!( + eprintln!( "[{}] < [{}] access to `{q}` denied.", self.address.server, self.address.client - )); + ); self.session.template.access_denied() } Response::NotFound(q) => { - self.session.debug.error(&format!( + eprintln!( "[{}] < [{}] requested resource `{q}` not found.", self.address.server, self.address.client - )); + ); self.session.template.not_found() } }; match self.stream.write_all(bytes) { - Ok(()) => self.session.debug.info(&format!( - "[{}] > [{}] sent {} bytes response.", - self.address.server, - self.address.client, - bytes.len() - )), - Err(e) => self.session.debug.error(&format!( + Ok(()) => { + if self.session.is_debug { + println!( + "[{}] > [{}] sent {} bytes response.", + self.address.server, + self.address.client, + bytes.len() + ) + } + } + Err(e) => eprintln!( "[{}] ! [{}] failed to response: `{e}`", self.address.server, self.address.client, - )), + ), }; bytes.len() } fn shutdown(self) { match self.stream.shutdown(std::net::Shutdown::Both) { - Ok(()) => self.session.debug.info(&format!( - "[{}] - [{}] connection closed by server.", - self.address.server, self.address.client, - )), - Err(e) => self.session.debug.error(&format!( + Ok(()) => { + if self.session.is_debug { + println!( + "[{}] - [{}] connection closed by server.", + self.address.server, self.address.client, + ) + } + } + Err(e) => eprintln!( "[{}] > [{}] failed to close connection: `{e}`", self.address.server, self.address.client, - )), + ), } } } diff --git a/src/session.rs b/src/session.rs index 7690491..1a56891 100644 --- a/src/session.rs +++ b/src/session.rs @@ -1,18 +1,17 @@ mod access_log; -mod debug; mod public; mod request; mod template; -use {access_log::AccessLog, debug::Debug, public::Public, request::Request, template::Template}; +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 debug: Debug, pub public: Public, pub request: Option, pub template: Template, + pub is_debug: bool, } impl Session { @@ -20,7 +19,6 @@ impl Session { let template = Template::init(config)?; Ok(Self { access_log: AccessLog::init(config)?, - debug: Debug::init(config)?, public: Public::init(config)?, request: if template.welcome.contains("{hosts}") || template.welcome.contains("{hits}") @@ -32,6 +30,7 @@ impl Session { None // do not int request collector if its features not in use }, template, + is_debug: config.debug, }) } } diff --git a/src/session/debug.rs b/src/session/debug.rs deleted file mode 100644 index 85f69e0..0000000 --- a/src/session/debug.rs +++ /dev/null @@ -1,30 +0,0 @@ -mod level; -use level::Level; - -pub struct Debug(Vec); - -impl Debug { - pub fn init(config: &crate::config::Config) -> anyhow::Result { - let mut l = Vec::with_capacity(config.debug.len()); - for s in config.debug.to_lowercase().chars() { - l.push(Level::parse(s)?); - } - Ok(Self(l)) - } - - pub fn error(&self, message: &str) { - if self.0.contains(&Level::Error) { - eprintln!("[{}] [error] {message}", now()); - } - } - - pub fn info(&self, message: &str) { - if self.0.contains(&Level::Info) { - println!("[{}] [info] {message}", now()); - } - } -} - -fn now() -> String { - chrono::Local::now().to_rfc3339() -} diff --git a/src/session/debug/level.rs b/src/session/debug/level.rs deleted file mode 100644 index 47ba317..0000000 --- a/src/session/debug/level.rs +++ /dev/null @@ -1,17 +0,0 @@ -use anyhow::{Result, bail}; - -#[derive(PartialEq)] -pub enum Level { - Error, - Info, -} - -impl Level { - pub fn parse(value: char) -> Result { - match value { - 'e' => Ok(Self::Error), - 'i' => Ok(Self::Info), - _ => bail!("unsupported debug level `{value}`!"), - } - } -} diff --git a/src/session/public.rs b/src/session/public.rs index 6a1841b..31676aa 100644 --- a/src/session/public.rs +++ b/src/session/public.rs @@ -61,7 +61,7 @@ impl Public { Ok(t) => match (t.is_dir(), t.is_file()) { (true, _) => callback(match self.list(&p) { Ok(list) => Response::Directory(query, list, p == self.public_dir), - Err(e) => Response::InternalServerError(e.to_string()), + Err(e) => Response::InternalServerError(query, e.to_string()), }), (_, true) => match fs::File::open(p) { Ok(mut f) => loop { @@ -70,21 +70,24 @@ impl Public { Ok(0) => break, Ok(n) => callback(Response::File(&b[..n])), Err(e) => { - return callback(Response::InternalServerError(format!( - "failed to read response chunk for `{query}`: `{e}`" - ))); + return callback(Response::InternalServerError( + query, + format!("failed to read response chunk: `{e}`"), + )); } } }, - Err(e) => callback(Response::InternalServerError(format!( - "failed to read response for query`{query}`: `{e}`" - ))), + Err(e) => callback(Response::InternalServerError( + query, + format!("failed to read response: `{e}`"), + )), }, _ => panic!(), // unexpected }, - Err(e) => callback(Response::InternalServerError(format!( - "failed to read storage for `{query}`: `{e}`" - ))), + Err(e) => callback(Response::InternalServerError( + query, + format!("failed to read storage: `{e}`"), + )), } }