From 3354ecdaa30789454a43de3740752623c38d1f05 Mon Sep 17 00:00:00 2001 From: Jose Quintana Date: Tue, 3 Mar 2020 17:59:42 +0100 Subject: [PATCH] feat: preliminary implementation of #13 --- Cargo.lock | 30 ++++++++++++++++++++++++++++++ Cargo.toml | 1 + src/main.rs | 42 ++++++++++++++++++++++++++++++------------ 3 files changed, 61 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e42157b..9d29a7b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -157,6 +157,16 @@ dependencies = [ ] [[package]] +name = "ctrlc" +version = "3.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a4ba686dff9fa4c1c9636ce1010b0cf98ceb421361b0bb3d6faeec43bd217a7" +dependencies = [ + "nix", + "winapi", +] + +[[package]] name = "env_logger" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -420,6 +430,19 @@ dependencies = [ ] [[package]] +name = "nix" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e4785f2c3b7589a0d0c1dd60285e1188adac4006e8abd6dd578e1567027363" +dependencies = [ + "bitflags", + "cc", + "cfg-if", + "libc", + "void", +] + +[[package]] name = "num-integer" version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -856,6 +879,7 @@ name = "static-web-server" version = "1.5.0" dependencies = [ "chrono", + "ctrlc", "env_logger", "flate2", "hyper-native-tls", @@ -1081,6 +1105,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "078775d0255232fb988e6fccf26ddc9d1ac274299aaedcedce21c6f72cc533ce" [[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + +[[package]] name = "wasi" version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" diff --git a/Cargo.toml b/Cargo.toml index 9cab7d8..976047d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,6 +29,7 @@ structopt = "0.3" flate2 = "1.0" iron_staticfile_middleware = { git = "https://github.com/joseluisq/iron-staticfile-middleware.git" } hyper-native-tls = "0.3" +ctrlc = "3.1" [dev-dependencies] openssl = { version = "0.10", features = ["vendored"] } diff --git a/src/main.rs b/src/main.rs index cd0cfac..c9091bb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,5 @@ extern crate chrono; +extern crate ctrlc; extern crate env_logger; extern crate flate2; extern crate hyper_native_tls; @@ -23,8 +24,23 @@ use iron::prelude::*; use log::LevelFilter; use staticfiles::*; use std::io::Write; +use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::Arc; use structopt::StructOpt; +fn on_server_running(server_name: &str, proto: &str, addr: &str, running: Arc) { + info!( + "Static {} Server `{}` is running on {}", + proto, server_name, addr + ); + + println!("Waiting for Ctrl-C signal..."); + while running.load(Ordering::SeqCst) {} + + println!("Exiting server execution..."); + std::process::exit(0) +} + fn main() { Builder::new() .format(|buf, record| { @@ -40,7 +56,19 @@ fn main() { .init(); let opts = Options::from_args(); + let addr = &format!("{}{}{}", opts.host.to_string(), ":", opts.port.to_string()); + let proto = if opts.tls { "HTTPS" } else { "HTTP" }; + // Handle Ctrl+C interrupt signals + let running = Arc::new(AtomicBool::new(true)); + let r = running.clone(); + + ctrlc::set_handler(move || { + r.store(false, Ordering::SeqCst); + }) + .expect("Error setting Ctrl-C handler"); + + // Configure & launch the HTTP server let files = StaticFiles::new(StaticFilesOptions { root_dir: opts.root, assets_dir: opts.assets, @@ -48,26 +76,16 @@ fn main() { page_404_path: opts.page404, }); - let addr = &format!("{}{}{}", opts.host.to_string(), ":", opts.port.to_string()); - let proto = if opts.tls { "HTTPS" } else { "HTTP" }; - - let server_info = |server_name: &String, proto: &str, addr: &String| { - info!( - "Static {} Server `{}` is running on {}", - proto, server_name, addr - ); - }; - if opts.tls { let ssl = NativeTlsServer::new(opts.tls_pkcs12, &opts.tls_pkcs12_passwd).unwrap(); match Iron::new(files.handle()).https(addr, ssl) { - Result::Ok(_) => server_info(&opts.name, &proto, addr), + Result::Ok(_) => on_server_running(&opts.name, &proto, addr, running), Result::Err(err) => panic!("{:?}", err), } } else { match Iron::new(files.handle()).http(addr) { - Result::Ok(_) => server_info(&opts.name, &proto, addr), + Result::Ok(_) => on_server_running(&opts.name, &proto, addr, running), Result::Err(err) => panic!("{:?}", err), } } -- libgit2 1.7.2