Commit 495e42f4 authored by Sebastian Dröge's avatar Sebastian Dröge
Browse files

Move server into its own module and implement handling of static files

parent d2cf18ff
Loading
Loading
Loading
Loading
+91 −3
Original line number Diff line number Diff line
@@ -77,6 +77,27 @@ dependencies = [
 "trust-dns-resolver",
]

[[package]]
name = "actix-files"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "193b22cb1f7b4ff12a4eb2415d6d19e47e44ea93e05930b30d05375ea29d3529"
dependencies = [
 "actix-http",
 "actix-service",
 "actix-web",
 "bitflags",
 "bytes",
 "derive_more",
 "futures-core",
 "futures-util",
 "log",
 "mime",
 "mime_guess",
 "percent-encoding",
 "v_htmlescape",
]

[[package]]
name = "actix-http"
version = "1.0.1"
@@ -907,7 +928,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817"
dependencies = [
 "typenum",
 "version_check",
 "version_check 0.9.2",
]

[[package]]
@@ -1328,6 +1349,16 @@ version = "0.3.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d"

[[package]]
name = "mime_guess"
version = "2.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2684d4c2e97d99848d30b324b00c8fcc7e5c897b7cbb5819b09e7c90e8baf212"
dependencies = [
 "mime",
 "unicase",
]

[[package]]
name = "miniz_oxide"
version = "0.4.1"
@@ -1396,6 +1427,16 @@ dependencies = [
 "winapi 0.3.9",
]

[[package]]
name = "nom"
version = "4.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6"
dependencies = [
 "memchr",
 "version_check 0.1.5",
]

[[package]]
name = "num-integer"
version = "0.1.43"
@@ -1612,7 +1653,7 @@ dependencies = [
 "proc-macro2",
 "quote",
 "syn",
 "version_check",
 "version_check 0.9.2",
]

[[package]]
@@ -1623,7 +1664,7 @@ checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
dependencies = [
 "proc-macro2",
 "quote",
 "version_check",
 "version_check 0.9.2",
]

[[package]]
@@ -2162,6 +2203,15 @@ version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33"

[[package]]
name = "unicase"
version = "2.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6"
dependencies = [
 "version_check 0.9.2",
]

[[package]]
name = "unicode-bidi"
version = "0.3.4"
@@ -2215,6 +2265,37 @@ version = "0.7.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "05e42f7c18b8f902290b009cde6d651262f956c98bc51bca4cd1d511c9cd85c7"

[[package]]
name = "v_escape"
version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "660b101c07b5d0863deb9e7fb3138777e858d6d2a79f9e6049a27d1cc77c6da6"
dependencies = [
 "v_escape_derive",
]

[[package]]
name = "v_escape_derive"
version = "0.5.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c2ca2a14bc3fc5b64d188b087a7d3a927df87b152e941ccfbc66672e20c467ae"
dependencies = [
 "nom",
 "proc-macro2",
 "quote",
 "syn",
]

[[package]]
name = "v_htmlescape"
version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e33e939c0d8cf047514fb6ba7d5aac78bc56677a6938b2ee67000b91f2e97e41"
dependencies = [
 "cfg-if",
 "v_escape",
]

[[package]]
name = "vcpkg"
version = "0.2.10"
@@ -2233,6 +2314,12 @@ version = "0.0.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d63556a25bae6ea31b52e640d7c41d1ab27faba4ccb600013837a3d0b3994ca1"

[[package]]
name = "version_check"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd"

[[package]]
name = "version_check"
version = "0.9.2"
@@ -2278,6 +2365,7 @@ version = "0.1.0"
name = "webrtc-audio-server"
version = "0.1.0"
dependencies = [
 "actix-files",
 "actix-rt",
 "actix-service",
 "actix-tls 2.0.0",
+1 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@ actix-web = { version = "2", features = ["openssl"] }
actix-web-actors = "2"
actix-service = "1"
actix-tls = { version = "2", features = ["openssl"] }
actix-files = "0.2"
openssl = "0.10"
log = "0.4"
env_logger = "0.7"
+4 −0
Original line number Diff line number Diff line
@@ -16,6 +16,10 @@ pub struct Config {
    #[structopt(short, long, default_value = "8080")]
    pub port: u16,

    /// Directory with static HTML/CSS/JS files.
    #[structopt(short, long)]
    pub static_files: PathBuf,

    /// Use TLS.
    #[structopt(short = "t", long)]
    pub use_tls: bool,
+5 −37
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@
// Licensed under the MIT license, see the LICENSE file or <http://opensource.org/licenses/MIT>

mod config;
mod server;

use anyhow::Error;

@@ -10,41 +11,6 @@ use structopt::StructOpt;

use config::Config;

use actix_rt::System;

use actix_web::{web, App, HttpResponse, HttpServer, Responder};

async fn index() -> impl Responder {
    HttpResponse::Ok().body("Hello world!")
}

async fn run(cfg: Config) -> Result<(), Error> {
    let server = HttpServer::new(|| App::new().route("/", web::get().to(index)));

    let server = if cfg.use_tls {
        use openssl::ssl::{SslAcceptor, SslFiletype, SslMethod};

        let mut builder = SslAcceptor::mozilla_intermediate(SslMethod::tls())?;
        builder.set_private_key_file(
            cfg.key_file.as_ref().expect("No key file given"),
            SslFiletype::PEM,
        )?;
        builder.set_certificate_chain_file(
            cfg.certificate_file
                .as_ref()
                .expect("No certificate file given"),
        )?;

        server.bind_openssl(format!("0.0.0.0:{}", cfg.port), builder)?
    } else {
        server.bind(format!("0.0.0.0:{}", cfg.port))?
    };

    server.run().await?;

    Ok(())
}

fn main() -> Result<(), Error> {
    let cfg = Config::from_args();

@@ -55,6 +21,8 @@ fn main() -> Result<(), Error> {
        .write_style("WEBRTC_AUDIO_SERVER_LOG_STYLE");
    env_logger::init_from_env(env);

    let mut system = System::new("WebRTC Audio Server");
    system.block_on(run(cfg))
    let mut system = actix_rt::System::new("WebRTC Audio Server");
    system.block_on(server::run(cfg))?;

    Ok(())
}

server/src/server.rs

0 → 100644
+68 −0
Original line number Diff line number Diff line
// Copyright (C) 2020 Sebastian Dröge <sebastian@centricular.com>
//
// Licensed under the MIT license, see the LICENSE file or <http://opensource.org/licenses/MIT>

use crate::config::Config;

use actix_files::NamedFile;
use actix_web::{web, App, HttpRequest, HttpResponse, HttpServer, Responder};

async fn index(cfg: web::Data<Config>) -> Result<NamedFile, actix_web::Error> {
    let full_path = cfg.static_files.join("index.html");

    let file = NamedFile::open(full_path)?;

    Ok(file.use_last_modified(true))
}

async fn ws(_cfg: web::Data<Config>) -> impl Responder {
    HttpResponse::Ok().body("Hello world!")
}

async fn static_file(
    cfg: web::Data<Config>,
    req: HttpRequest,
) -> Result<NamedFile, actix_web::Error> {
    let path: std::path::PathBuf = req.match_info().query("filename").parse().unwrap();
    let full_path = cfg.static_files.join(path);

    let file = NamedFile::open(full_path)?;

    Ok(file.use_last_modified(true))
}

pub async fn run(cfg: Config) -> Result<(), anyhow::Error> {
    let cfg = web::Data::new(cfg);
    let cfg_clone = cfg.clone();

    let server = HttpServer::new(move || {
        App::new()
            .app_data(cfg_clone.clone())
            .route("/", web::get().to(index))
            .route("/ws", web::get().to(ws))
            .route("/static/{filename:.*}", web::get().to(static_file))
    });

    let server = if cfg.use_tls {
        use openssl::ssl::{SslAcceptor, SslFiletype, SslMethod};

        let mut builder = SslAcceptor::mozilla_intermediate(SslMethod::tls())?;
        builder.set_private_key_file(
            cfg.key_file.as_ref().expect("No key file given"),
            SslFiletype::PEM,
        )?;
        builder.set_certificate_chain_file(
            cfg.certificate_file
                .as_ref()
                .expect("No certificate file given"),
        )?;

        server.bind_openssl(format!("0.0.0.0:{}", cfg.port), builder)?
    } else {
        server.bind(format!("0.0.0.0:{}", cfg.port))?
    };

    server.run().await?;

    Ok(())
}
Loading