Remove dependency on once_cell
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
asonix 2024-02-01 17:22:19 -06:00
parent 8a6bb08134
commit b68ee94f38
4 changed files with 35 additions and 34 deletions

1
Cargo.lock generated
View file

@ -1808,7 +1808,6 @@ dependencies = [
"dotenv",
"mime",
"minify-html",
"once_cell",
"opentelemetry",
"opentelemetry-otlp",
"opentelemetry_sdk",

View file

@ -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"

View file

@ -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<Config> = Lazy::new(Config::parse);
static CONFIG: OnceLock<Config> = 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<u64>) -> 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<Client>,
) -> Result<HttpResponse, Error> {
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<HttpResponse, Error> {
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<HttpResponse, Error> {
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<Client>,
) -> Result<HttpResponse, Error> {
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<ClientConfig> {
.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<ClientConfig> {
}
async fn rustls_server_key() -> anyhow::Result<Option<CertifiedKey>> {
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(())

View file

@ -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 @@
<meta property="og:description" content="Upload and share image files" />
<meta property="twitter:description" content="Upload and share image files" />
}
@if let Some(domain) = CONFIG.domain() {
@if let Some(domain) = config().domain() {
<meta property="twitter:domain" content="@domain" />
}
<link rel="stylesheet" href="@crate::statics(layout_css.name)" type="text/css" />