From 892e84348db44f5a055a34f19676c30552c40213 Mon Sep 17 00:00:00 2001 From: Gunwant Jain Date: Tue, 18 Jan 2022 12:16:07 +0530 Subject: [PATCH] static_files: embed files in-binary Signed-off-by: Gunwant Jain --- Cargo.lock | 101 +++++++++++++++++++++++++++++++++++-- Cargo.toml | 1 + src/routes/static_files.rs | 25 ++++++--- 3 files changed, 115 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 67f25cb..621f49f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -103,6 +103,7 @@ dependencies = [ "rand", "rocket", "rocket_dyn_templates", + "rust-embed", "syntect", "tree_magic", ] @@ -137,7 +138,16 @@ dependencies = [ "block-padding", "byte-tools", "byteorder", - "generic-array", + "generic-array 0.12.4", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array 0.14.5", ] [[package]] @@ -260,6 +270,15 @@ dependencies = [ "version_check", ] +[[package]] +name = "cpufeatures" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95059428f66df56b63431fdb4e1947ed2190586af5c5a8a8b71122bdf5a7f469" +dependencies = [ + "libc", +] + [[package]] name = "crc32fast" version = "1.3.0" @@ -324,7 +343,16 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" dependencies = [ - "generic-array", + "generic-array 0.12.4", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array 0.14.5", ] [[package]] @@ -559,6 +587,16 @@ dependencies = [ "typenum", ] +[[package]] +name = "generic-array" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803" +dependencies = [ + "typenum", + "version_check", +] + [[package]] name = "getrandom" version = "0.2.4" @@ -1118,6 +1156,12 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + [[package]] name = "parking_lot" version = "0.10.2" @@ -1579,6 +1623,40 @@ dependencies = [ "uncased", ] +[[package]] +name = "rust-embed" +version = "6.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d40377bff8cceee81e28ddb73ac97f5c2856ce5522f0b260b763f434cdfae602" +dependencies = [ + "rust-embed-impl", + "rust-embed-utils", + "walkdir", +] + +[[package]] +name = "rust-embed-impl" +version = "6.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94e763e24ba2bf0c72bc6be883f967f794a019fafd1b86ba1daff9c91a7edd30" +dependencies = [ + "proc-macro2", + "quote", + "rust-embed-utils", + "syn", + "walkdir", +] + +[[package]] +name = "rust-embed-utils" +version = "7.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad22c7226e4829104deab21df575e995bfbc4adfad13a595e387477f238c1aec" +dependencies = [ + "sha2", + "walkdir", +] + [[package]] name = "rustc_version" version = "0.2.3" @@ -1679,10 +1757,10 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df" dependencies = [ - "block-buffer", - "digest", + "block-buffer 0.7.3", + "digest 0.8.1", "fake-simd", - "opaque-debug", + "opaque-debug 0.2.3", ] [[package]] @@ -1700,6 +1778,19 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012" +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if 1.0.0", + "cpufeatures", + "digest 0.9.0", + "opaque-debug 0.3.0", +] + [[package]] name = "sharded-slab" version = "0.1.4" diff --git a/Cargo.toml b/Cargo.toml index d555efb..3475c84 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,6 +9,7 @@ rand = "0.8.4" rocket = "0.5.0-rc.1" tree_magic = "0.2.3" syntect = "4.6.0" +rust-embed="6.3.0" [dependencies.rocket_dyn_templates] version = "0.1.0-rc.1" diff --git a/src/routes/static_files.rs b/src/routes/static_files.rs index f020680..c43d5cd 100644 --- a/src/routes/static_files.rs +++ b/src/routes/static_files.rs @@ -1,10 +1,21 @@ -use rocket::fs::NamedFile; -use rocket::response::status::NotFound; -use std::path::{Path, PathBuf}; +use rocket::http::ContentType; +use rust_embed::RustEmbed; +use std::{borrow::Cow, ffi::OsStr, path::PathBuf}; + +#[derive(RustEmbed)] +#[folder = "static/"] +struct Static; #[get("/static/")] -pub async fn static_files(file: PathBuf) -> Result> { - NamedFile::open(Path::new("static/").join(file)) - .await - .map_err(|e| NotFound(e.to_string())) +pub fn static_files(file: PathBuf) -> Option<(ContentType, Cow<'static, [u8]>)> { + let filename = file.display().to_string(); + let asset = Static::get(&filename)?; + + let content_type = file + .extension() + .and_then(OsStr::to_str) + .and_then(ContentType::from_extension) + .unwrap_or(ContentType::Bytes); + + Some((content_type, asset.data)) }