From b68ee94f38c37c8690b110f4acd31faedd6bf1f8 Mon Sep 17 00:00:00 2001 From: asonix Date: Thu, 1 Feb 2024 17:22:19 -0600 Subject: [PATCH] Remove dependency on once_cell --- Cargo.lock | 1 - Cargo.toml | 1 - src/main.rs | 63 +++++++++++++++++++++------------------- templates/layout.rs.html | 4 +-- 4 files changed, 35 insertions(+), 34 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7a19c5c..f3f60e9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1808,7 +1808,6 @@ dependencies = [ "dotenv", "mime", "minify-html", - "once_cell", "opentelemetry", "opentelemetry-otlp", "opentelemetry_sdk", diff --git a/Cargo.toml b/Cargo.toml index a738d6f..da9aeff 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,7 +25,6 @@ console-subscriber = "0.2" dotenv = "0.15.0" mime = "0.3" minify-html = "0.15.0" -once_cell = "1.4" opentelemetry = "0.21" opentelemetry_sdk = { version = "0.21", features = ["rt-tokio"] } opentelemetry-otlp = "0.14" diff --git a/src/main.rs b/src/main.rs index 5f0b26a..6f087d1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -14,7 +14,6 @@ use anyhow::Context; use awc::{Client, Connector}; use clap::Parser; use console_subscriber::ConsoleLayer; -use once_cell::sync::Lazy; use opentelemetry::KeyValue; use opentelemetry_otlp::WithExportConfig; use opentelemetry_sdk::{propagation::TraceContextPropagator, Resource}; @@ -26,7 +25,7 @@ use std::{ io::Cursor, net::SocketAddr, path::PathBuf, - sync::Arc, + sync::{Arc, OnceLock}, time::{Duration, SystemTime}, }; use tracing_actix_web::TracingLogger; @@ -121,7 +120,7 @@ struct Config { impl Config { fn domain(&self) -> Option<&str> { - CONFIG.domain.domain() + config().domain.domain() } fn upstream_upload_url(&self) -> String { @@ -218,7 +217,11 @@ impl Config { } } -static CONFIG: Lazy = Lazy::new(Config::parse); +static CONFIG: OnceLock = OnceLock::new(); + +fn config() -> &'static Config { + CONFIG.get_or_init(Config::parse) +} pub enum UploadResult<'a> { Image(Image), @@ -344,27 +347,27 @@ impl Image { } fn link(&self) -> String { - CONFIG.image_url(&self.file) + config().image_url(&self.file) } fn thumbnails(&self) -> String { - CONFIG.thumbnails_url(&self.file) + config().thumbnails_url(&self.file) } fn view(&self, size: Option) -> String { - CONFIG.view_url(size, &self.file) + config().view_url(size, &self.file) } fn thumb(&self, size: u64, filetype: FileType) -> String { - CONFIG.thumbnail_url(size, &self.file, filetype) + config().thumbnail_url(size, &self.file, filetype) } fn delete(&self) -> String { - CONFIG.delete_url(&self.delete_token, &self.file) + config().delete_url(&self.delete_token, &self.file) } fn confirm_delete(&self) -> String { - CONFIG.confirm_delete_url(&self.delete_token, &self.file) + config().confirm_delete_url(&self.delete_token, &self.file) } } @@ -473,7 +476,7 @@ async fn list_uploads( let mut details_handles = Vec::new(); for upload_id in &query.uploads { - let claim_url = CONFIG.upstream_claim_url(upload_id.as_str()); + let claim_url = config().upstream_claim_url(upload_id.as_str()); let client = client.clone(); upload_handles.push(actix_rt::spawn(async move { @@ -494,7 +497,7 @@ async fn list_uploads( } for (file, delete_token) in &query.files { - let details_url = CONFIG.upstream_details_url(file); + let details_url = config().upstream_details_url(file); let file = file.clone(); let delete_token = delete_token.clone(); @@ -586,7 +589,7 @@ async fn upload( body: web::Payload, client: web::Data, ) -> Result { - let client_request = client.request_from(CONFIG.upstream_upload_url(), req.head()); + let client_request = client.request_from(config().upstream_upload_url(), req.head()); let client_request = if let Some(addr) = req.head().peer_addr { client_request.append_header(("X-Forwarded-For", addr.to_string())) @@ -621,7 +624,7 @@ async fn thumbs( ) -> Result { let file = query.into_inner().image; - let url = CONFIG.upstream_details_url(&file); + let url = config().upstream_details_url(&file); let mut res = client.get(url).send().await?; if res.status() == StatusCode::NOT_FOUND { @@ -676,7 +679,7 @@ async fn view_original( ) -> Result { let file = file.into_inner(); - let url = CONFIG.upstream_details_url(&file); + let url = config().upstream_details_url(&file); let mut res = client.get(url).send().await?; if res.status() == StatusCode::NOT_FOUND { @@ -707,7 +710,7 @@ async fn view( return Ok(to_404()); } - let url = CONFIG.upstream_details_url(&file); + let url = config().upstream_details_url(&file); let mut res = client.get(url).send().await?; if res.status() == StatusCode::NOT_FOUND { @@ -736,7 +739,7 @@ async fn thumbnail( let (size, filetype, file) = parts.into_inner(); if valid_thumbnail_size(size) { - let url = CONFIG.upstream_thumbnail_url(size, &file, filetype); + let url = config().upstream_thumbnail_url(size, &file, filetype); return image(url, req, client).await; } @@ -754,7 +757,7 @@ async fn full_res( req: HttpRequest, client: web::Data, ) -> Result { - let url = CONFIG.upstream_image_url(&filename.into_inner()); + let url = config().upstream_image_url(&filename.into_inner()); image(url, req, client).await } @@ -799,7 +802,7 @@ async fn delete( confirm, } = query.into_inner(); - let url = CONFIG.upstream_details_url(&file); + let url = config().upstream_details_url(&file); let mut res = client.get(url).send().await?; if res.status() == StatusCode::NOT_FOUND { @@ -807,7 +810,7 @@ async fn delete( } if confirm { - let url = CONFIG.upstream_delete_url(&token, &file); + let url = config().upstream_delete_url(&token, &file); client.delete(url).send().await?; render(HttpResponse::Ok(), |cursor| { @@ -959,7 +962,7 @@ async fn rustls_client_config() -> anyhow::Result { .collect(), }; - if let Some(cert) = CONFIG.certificate.as_ref() { + if let Some(cert) = config().certificate.as_ref() { let cert_bytes = tokio::fs::read(&cert).await?; for res in rustls_pemfile::certs(&mut cert_bytes.as_slice()) { @@ -974,14 +977,14 @@ async fn rustls_client_config() -> anyhow::Result { } async fn rustls_server_key() -> anyhow::Result> { - let certificate_path = if let Some(c) = &CONFIG.server_certificate { + let certificate_path = if let Some(c) = &config().server_certificate { c } else { tracing::info!("No server certificate"); return Ok(None); }; - let private_key_path = if let Some(p) = &CONFIG.server_private_key { + let private_key_path = if let Some(p) = &config().server_private_key { p } else { tracing::info!("No server private_key"); @@ -1010,9 +1013,9 @@ async fn main() -> anyhow::Result<()> { init_tracing( "pict-rs-proxy", - CONFIG.opentelemetry_url.as_ref(), - CONFIG.console_addr, - CONFIG.console_event_buffer_size, + config().opentelemetry_url.as_ref(), + config().console_addr, + config().console_event_buffer_size, )?; let client_config = rustls_client_config().await?; @@ -1051,7 +1054,7 @@ async fn main() -> anyhow::Result<()> { }); if let Some(key) = rustls_server_key().await? { - tracing::info!("Serving pict-rs-proxy over TLS on {}", CONFIG.addr); + tracing::info!("Serving pict-rs-proxy over TLS on {}", config().addr); let (tx, rx) = rustls_channel_resolver::channel::<32>(key); @@ -1076,16 +1079,16 @@ async fn main() -> anyhow::Result<()> { .with_cert_resolver(rx); server - .bind_rustls_021(CONFIG.addr, server_config)? + .bind_rustls_021(config().addr, server_config)? .run() .await?; handle.abort(); let _ = handle.await; } else { - tracing::info!("Serving pict-rs-proxy on {}", CONFIG.addr); + tracing::info!("Serving pict-rs-proxy on {}", config().addr); - server.bind(CONFIG.addr)?.run().await?; + server.bind(config().addr)?.run().await?; } Ok(()) diff --git a/templates/layout.rs.html b/templates/layout.rs.html index b456b82..5484dda 100644 --- a/templates/layout.rs.html +++ b/templates/layout.rs.html @@ -1,5 +1,5 @@ @use super::statics::{layout_css, favicon_ico}; -@use crate::CONFIG; +@use crate::config; @(title: &str, description: Option<&str>, head: Content, body: Content) @@ -24,7 +24,7 @@ } - @if let Some(domain) = CONFIG.domain() { + @if let Some(domain) = config().domain() { }