about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorVincent Ambo <tazjin@gmail.com>2018-05-18T22·11+0200
committerVincent Ambo <github@tazj.in>2018-05-18T22·52+0200
commit98f9c5dd9436a4e184c2989976a9c7db64780195 (patch)
tree26020aa5c99193185f606505ab721b40edb110e7 /src
parentcda66c4cd3bf2f6f7a466a9e2246c95a5305bfa9 (diff)
refactor(handlers): Embed static files into binary
Diffstat (limited to 'src')
-rw-r--r--src/handlers.rs23
-rw-r--r--src/main.rs16
2 files changed, 26 insertions, 13 deletions
diff --git a/src/handlers.rs b/src/handlers.rs
index df03940b19..e5f21849fc 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<AppState>,
         .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<AppState> {
+    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 ce605af90f..9ca3c8552c 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)