index : static-web-server.git

ascending towards madness

author Jose Quintana <joseluisquintana20@gmail.com> 2020-03-03 16:59:42.0 +00:00:00
committer Jose Quintana <joseluisquintana20@gmail.com> 2020-03-03 17:00:48.0 +00:00:00
commit
3354ecdaa30789454a43de3740752623c38d1f05 [patch]
tree
6f0a06816832122241aa14277733a1c9f215dc2f
parent
478d1009756ca2fe514ed857f60218998012ea6d
download
3354ecdaa30789454a43de3740752623c38d1f05.tar.gz

feat: preliminary implementation of #13



Diff

 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<AtomicBool>) {
    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),
        }
    }