From 85865968e36fe349c04e42f6796e1bc6e52ccfb4 Mon Sep 17 00:00:00 2001 From: chris west Date: Sat, 9 May 2020 13:04:51 -0700 Subject: [PATCH] hide info msgs in -r mode --- src/main.rs | 2 +- src/server.rs | 43 +++++++++++++++++++++++++++++++++++-------- 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/src/main.rs b/src/main.rs index 38a4d5f..8967776 100644 --- a/src/main.rs +++ b/src/main.rs @@ -58,7 +58,7 @@ fn main() { if !render.is_empty() { return match phd::server::render(host, port, root, &render) { - Ok(out) => println!("{}", out), + Ok(out) => print!("{}", out), Err(e) => eprintln!("{}", e), }; } diff --git a/src/server.rs b/src/server.rs index 84c0211..06e5190 100644 --- a/src/server.rs +++ b/src/server.rs @@ -23,6 +23,32 @@ const MAX_PEEK_SIZE: usize = 1024; /// Files not displayed in directory listings. const IGNORED_FILES: [&str; 3] = ["header.gph", "footer.gph", ".reverse"]; +use std::sync::atomic::{AtomicBool, Ordering as AtomicOrdering}; + +/// Whether to print info!() messages to stdout. +/// Defaults to true. +static SHOW_INFO: AtomicBool = AtomicBool::new(true); + +/// Hide info! messages. +fn hide_info() { + SHOW_INFO.swap(false, AtomicOrdering::Relaxed); +} + +/// Print status message to the server's stdout. +macro_rules! info { + ($e:expr) => { + if SHOW_INFO.load(AtomicOrdering::Relaxed) { + println!("{}", $e); + } + }; + ($fmt:expr, $($args:expr),*) => { + info!(format!($fmt, $($args),*)); + }; + ($fmt:expr, $($args:expr,)*) => { + info!(format!($fmt, $($args,)*)); + }; +} + /// Starts a Gopher server at the specified host, port, and root directory. pub fn start(host: &str, port: u16, root: &str) -> Result<()> { let addr = format!("{}:{}", "0.0.0.0", port); @@ -30,7 +56,7 @@ pub fn start(host: &str, port: u16, root: &str) -> Result<()> { let full_root_path = fs::canonicalize(&root)?.to_string_lossy().to_string(); let pool = ThreadPool::new(MAX_WORKERS); - println!( + info!( "{}» Listening {}on {}{}{} at {}{}{}", color::Yellow, color::Reset, @@ -43,7 +69,7 @@ pub fn start(host: &str, port: u16, root: &str) -> Result<()> { ); for stream in listener.incoming() { let stream = stream?; - println!( + info!( "{}┌ Connection{} from {}{}", color::Green, color::Reset, @@ -53,7 +79,7 @@ pub fn start(host: &str, port: u16, root: &str) -> Result<()> { let req = Request::from(host, port, root)?; pool.execute(move || { if let Err(e) = accept(stream, req) { - eprintln!("{}└ {}{}", color::Red, e, color::Reset); + info!("{}└ {}{}", color::Red, e, color::Reset); } }); } @@ -65,7 +91,7 @@ fn accept(mut stream: TcpStream, mut req: Request) -> Result<()> { let reader = BufReader::new(&stream); let mut lines = reader.lines(); if let Some(Ok(line)) = lines.next() { - println!( + info!( "{}│{} Client sent:\t{}{:?}{}", color::Green, color::Reset, @@ -81,6 +107,7 @@ fn accept(mut stream: TcpStream, mut req: Request) -> Result<()> { /// Render a response to a String. pub fn render(host: &str, port: u16, root: &str, selector: &str) -> Result { + hide_info(); let mut req = Request::from(host, port, root)?; req.parse_request(&selector); let mut out = vec![]; @@ -193,7 +220,7 @@ where write!(w, ".\r\n"); - println!( + info!( "{}│{} Server reply:\t{}DIR {}{}{}", color::Green, color::Reset, @@ -213,7 +240,7 @@ where let path = req.file_path(); let mut f = fs::File::open(&path)?; io::copy(&mut f, w)?; - println!( + info!( "{}│{} Server reply:\t{}FILE {}{}{}", color::Green, color::Reset, @@ -242,7 +269,7 @@ where for line in reader.lines() { write!(w, "{}", gph_line_to_gopher(line, &req))?; } - println!( + info!( "{}│{} Server reply:\t{}MAP {}{}{}", color::Green, color::Reset, @@ -313,7 +340,7 @@ where W: Write, { let line = format!("3Not Found: {}\t/\tnone\t70\r\n", req.selector); - println!( + info!( "{}│ Not found: {}{}{}", color::Red, color::Cyan,