From 6bee9ca6317213ba575d8327df33f50af03b0cdf Mon Sep 17 00:00:00 2001 From: Bulat Kurbanov Date: Mon, 24 Jul 2023 00:25:37 +0200 Subject: [PATCH] Update --- Cargo.lock | 157 +++++++++++++++++++++++++++++++++----------------- Cargo.toml | 10 +++- src/config.rs | 7 ++- src/main.rs | 70 +++++++++++++++++----- 4 files changed, 168 insertions(+), 76 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 65c4de8..7343567 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -193,16 +193,17 @@ dependencies = [ "axum-prometheus", "base64", "bytes", - "env_logger", "futures", - "lazy_static", - "log", + "once_cell", "reqwest", "serde", "serde_json", "tempfile", "tokio", "tokio-util", + "tower-http", + "tracing", + "tracing-subscriber", "translit", "zip", ] @@ -363,19 +364,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "env_logger" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0" -dependencies = [ - "humantime", - "is-terminal", - "log", - "regex", - "termcolor", -] - [[package]] name = "errno" version = "0.3.1" @@ -637,12 +625,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" -[[package]] -name = "humantime" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" - [[package]] name = "hyper" version = "0.14.27" @@ -715,17 +697,6 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" -[[package]] -name = "is-terminal" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" -dependencies = [ - "hermit-abi", - "rustix", - "windows-sys", -] - [[package]] name = "itoa" version = "1.0.9" @@ -793,6 +764,15 @@ dependencies = [ "libc", ] +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + [[package]] name = "matchit" version = "0.7.0" @@ -923,6 +903,16 @@ dependencies = [ "tempfile", ] +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + [[package]] name = "num_cpus" version = "1.16.0" @@ -992,6 +982,12 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + [[package]] name = "parking_lot" version = "0.12.1" @@ -1154,8 +1150,17 @@ checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" dependencies = [ "aho-corasick", "memchr", - "regex-automata", - "regex-syntax", + "regex-automata 0.3.3", + "regex-syntax 0.7.4", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", ] [[package]] @@ -1166,9 +1171,15 @@ checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" dependencies = [ "aho-corasick", "memchr", - "regex-syntax", + "regex-syntax 0.7.4", ] +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + [[package]] name = "regex-syntax" version = "0.7.4" @@ -1359,6 +1370,15 @@ dependencies = [ "digest", ] +[[package]] +name = "sharded-slab" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +dependencies = [ + "lazy_static", +] + [[package]] name = "signal-hook-registry" version = "1.4.1" @@ -1435,15 +1455,6 @@ dependencies = [ "windows-sys", ] -[[package]] -name = "termcolor" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" -dependencies = [ - "winapi-util", -] - [[package]] name = "thiserror" version = "1.0.44" @@ -1464,6 +1475,16 @@ dependencies = [ "syn", ] +[[package]] +name = "thread_local" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +dependencies = [ + "cfg-if", + "once_cell", +] + [[package]] name = "time" version = "0.3.23" @@ -1583,6 +1604,7 @@ dependencies = [ "pin-project-lite", "tower-layer", "tower-service", + "tracing", ] [[package]] @@ -1628,6 +1650,36 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" dependencies = [ "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" +dependencies = [ + "lazy_static", + "log", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", ] [[package]] @@ -1689,6 +1741,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + [[package]] name = "vcpkg" version = "0.2.15" @@ -1821,15 +1879,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" -[[package]] -name = "winapi-util" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" -dependencies = [ - "winapi", -] - [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" diff --git a/Cargo.toml b/Cargo.toml index 4e1568a..e4d7cc4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,9 +10,13 @@ tokio = { version = "1.28.2", features = ["full"] } tokio-util = { version = "0.7.8", features = ["compat"] } futures = "0.3.28" reqwest = { version = "0.11.18", features = ["json", "stream", "multipart"] } -log = "0.4.18" -env_logger = "0.10.0" -lazy_static = "1.4.0" + +tracing = "0.1.37" +tracing-subscriber = { version = "0.3.17", features = ["env-filter"]} +tower-http = { version = "0.4.3", features = ["trace"] } + +once_cell = "1.18.0" + serde = { version = "1.0.163", features = ["derive"] } serde_json = "1.0.96" axum = "0.6.18" diff --git a/src/config.rs b/src/config.rs index 1876d86..c4210ea 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,3 +1,4 @@ +use once_cell::sync::Lazy; use serde::Deserialize; fn get_env(env: &'static str) -> String { @@ -40,6 +41,6 @@ impl Config { } } -lazy_static! { - pub static ref CONFIG: Config = Config::load(); -} +pub static CONFIG: Lazy = Lazy::new(|| { + Config::load() +}); diff --git a/src/main.rs b/src/main.rs index 959ed4e..a18e3be 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,34 +1,72 @@ -#[macro_use] -extern crate lazy_static; - pub mod config; pub mod views; pub mod services; use std::net::SocketAddr; -use axum::{Router, routing::get}; +use axum::{Router, routing::get, middleware::{self, Next}, http::{self, Request}, response::Response}; use axum_prometheus::PrometheusMetricLayer; +use config::CONFIG; +use reqwest::StatusCode; use views::{download, get_filename}; +use tracing::info; +use tower_http::trace::{TraceLayer, self}; +use tracing::Level; + + +async fn auth(req: Request, next: Next) -> Result { + let auth_header = req.headers() + .get(http::header::AUTHORIZATION) + .and_then(|header| header.to_str().ok()); + + let auth_header = if let Some(auth_header) = auth_header { + auth_header + } else { + return Err(StatusCode::UNAUTHORIZED); + }; + + if auth_header != CONFIG.api_key { + return Err(StatusCode::UNAUTHORIZED); + } + + Ok(next.run(req).await) +} + + +async fn get_router() -> Router { + let (prometheus_layer, metric_handle) = PrometheusMetricLayer::pair(); + + let app_router = Router::new() + .route("/download/:source_id/:remote_id/:file_type", get(download)) + .route("/filename/:book_id/:file_type", get(get_filename)) + .layer(middleware::from_fn(auth)) + .layer(prometheus_layer); + + let metric_router = Router::new() + .route("/metrics", get(|| async move { metric_handle.render() })); + + Router::new() + .nest("/", app_router) + .nest("/", metric_router) + .layer( + TraceLayer::new_for_http() + .make_span_with(trace::DefaultMakeSpan::new() + .level(Level::INFO)) + .on_response(trace::DefaultOnResponse::new() + .level(Level::INFO)), + ) +} #[tokio::main] async fn main() { - env_logger::init(); - - let (prometheus_layer, metric_handle) = PrometheusMetricLayer::pair(); - - let app = Router::new() - .route("/download/:source_id/:remote_id/:file_type", get(download)) - .route("/filename/:book_id/:file_type", get(get_filename)) - .route("/metrics", get(|| async move { metric_handle.render() })) - .layer(prometheus_layer); - let addr = SocketAddr::from(([0, 0, 0, 0], 8080)); - log::info!("Start webserver..."); + let app = get_router().await; + + info!("Start webserver..."); axum::Server::bind(&addr) .serve(app.into_make_service()) .await .unwrap(); - log::info!("Webserver shutdown...") + info!("Webserver shutdown...") }