kern 1.8.3

General library for Rust
Documentation
extern crate kern;

use kern::http::name;
use kern::http::server::{HttpRequest, HttpServerBuilder, load_certificate_provider};
use kern::http::server::{HttpSettings, ResponseData, respond};
use kern::meta::version;
use kern::{Error, Fail, Result};
use std::fs::File;
use std::io::prelude::Read;
use std::sync::RwLock;

static SHARED: RwLock<u32> = RwLock::new(0);

fn main() {
    let tls_config = load_certificate_provider("examples/cert.pem", "examples/key.pem").unwrap();
    let settings = HttpSettings::new().threads_num(4);
    let server = HttpServerBuilder::new()
        .addr("[::]:8443")
        .settings(settings)
        .tls_on(tls_config)
        .handler(handler)
        .error_handler(error_handler)
        .build()
        .unwrap();
    server.block().unwrap();
}

fn handler(req: HttpRequest) -> Result<Vec<u8>> {
    let mut num = SHARED.write().unwrap();
    *num += 1;
    dbg!(*num);
    println!("New request from IP: {}", req.ip());
    let filename = req
        .get()
        .get("file")
        .ok_or_else(|| Fail::new("filename missing, try adding ?file=... to the url"))?;
    let mut file = File::open(filename)?;
    let mut buf = String::new();
    file.read_to_string(&mut buf)?;
    Ok(respond(buf, "text/html", None))
}

fn error_handler(err: Error) -> Vec<u8> {
    let msg = format!(
        "<!DOCTYPE html><html><head><title>{0}</title></head><body><h3>Fileserver error</h3><p>{0}</p><hr><address>{1} v{2}</address></body></html>",
        err,
        name(),
        version()
    );
    respond(
        msg.into_bytes(),
        "text/html",
        ResponseData::bad_request().build(),
    )
}