From 98f9c5dd9436a4e184c2989976a9c7db64780195 Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Sat, 19 May 2018 00:11:10 +0200 Subject: [PATCH] refactor(handlers): Embed static files into binary --- src/handlers.rs | 23 ++++++++++++++++++++++- src/main.rs | 16 ++++------------ 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/handlers.rs b/src/handlers.rs index df03940b1..e5f21849f 100644 --- a/src/handlers.rs +++ b/src/handlers.rs @@ -24,13 +24,15 @@ //! project root. use actix::prelude::*; -use actix_web; use actix_web::*; +use actix_web::http::Method; use actix_web::middleware::identity::RequestIdentity; use actix_web::middleware::{Started, Middleware}; +use actix_web; use db::*; use errors::ConverseError; use futures::Future; +use mime_guess::guess_mime_type; use models::*; use oidc::*; use render::*; @@ -296,6 +298,25 @@ pub fn callback(state: State, .responder() } +/// This is an extension trait to enable easy serving of embedded +/// static content. +/// +/// It is intended to be called with `include_bytes!()` when setting +/// up the actix-web application. +pub trait EmbeddedFile { + fn static_file(self, path: &'static str, content: &'static [u8]) -> Self; +} + +impl EmbeddedFile for App { + fn static_file(self, path: &'static str, content: &'static [u8]) -> Self { + self.route(path, Method::GET, move |_: HttpRequest<_>| { + let mime = format!("{}", guess_mime_type(path)); + HttpResponse::Ok() + .content_type(mime.as_str()) + .body(content) + }) + } +} /// Middleware used to enforce logins unceremoniously. pub struct RequireLogin; diff --git a/src/main.rs b/src/main.rs index ce605af90..9ca3c8552 100644 --- a/src/main.rs +++ b/src/main.rs @@ -36,6 +36,7 @@ extern crate env_logger; extern crate futures; extern crate hyper; extern crate md5; +extern crate mime_guess; extern crate r2d2; extern crate rand; extern crate reqwest; @@ -78,7 +79,6 @@ use oidc::OidcExecutor; use rand::{OsRng, Rng}; use render::Renderer; use std::env; -use std::path::PathBuf; use tera::Tera; fn config(name: &str) -> String { @@ -174,15 +174,6 @@ fn start_http_server(base_url: String, let bind_host = config_default("CONVERSE_BIND_HOST", "127.0.0.1:4567"); let key = gen_session_key(); let require_login = config_default("REQUIRE_LOGIN", "true".into()) == "true"; - let static_dir = env::var("CONVERSE_STATIC_DIR") - .map(PathBuf::from) - .or_else(|_| env::current_dir().map(|mut p| { - p.push("static"); - p - })) - .expect("Could not determine static file directory"); - - info!("Serving static files from {:?}", static_dir); server::new(move || { let state = AppState { @@ -201,7 +192,6 @@ fn start_http_server(base_url: String, let app = App::with_state(state) .middleware(Logger::default()) .middleware(identity) - .handler("/static", fs::StaticFiles::new(static_dir.clone())) .resource("/", |r| r.method(Method::GET).with(forum_index)) .resource("/thread/new", |r| r.method(Method::GET).with(new_thread)) .resource("/thread/submit", |r| r.method(Method::POST).with3(submit_thread)) @@ -211,7 +201,9 @@ fn start_http_server(base_url: String, .resource("/post/edit", |r| r.method(Method::POST).with3(edit_post)) .resource("/search", |r| r.method(Method::GET).with2(search_forum)) .resource("/oidc/login", |r| r.method(Method::GET).with(login)) - .resource("/oidc/callback", |r| r.method(Method::POST).with3(callback)); + .resource("/oidc/callback", |r| r.method(Method::POST).with3(callback)) + .static_file("/static/highlight.css", include_bytes!("../static/highlight.css")) + .static_file("/static/highlight.js", include_bytes!("../static/highlight.js")); if require_login { app.middleware(RequireLogin)