Remove dependency on once_cell
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
8a6bb08134
commit
b68ee94f38
1
Cargo.lock
generated
1
Cargo.lock
generated
|
@ -1808,7 +1808,6 @@ dependencies = [
|
||||||
"dotenv",
|
"dotenv",
|
||||||
"mime",
|
"mime",
|
||||||
"minify-html",
|
"minify-html",
|
||||||
"once_cell",
|
|
||||||
"opentelemetry",
|
"opentelemetry",
|
||||||
"opentelemetry-otlp",
|
"opentelemetry-otlp",
|
||||||
"opentelemetry_sdk",
|
"opentelemetry_sdk",
|
||||||
|
|
|
@ -25,7 +25,6 @@ console-subscriber = "0.2"
|
||||||
dotenv = "0.15.0"
|
dotenv = "0.15.0"
|
||||||
mime = "0.3"
|
mime = "0.3"
|
||||||
minify-html = "0.15.0"
|
minify-html = "0.15.0"
|
||||||
once_cell = "1.4"
|
|
||||||
opentelemetry = "0.21"
|
opentelemetry = "0.21"
|
||||||
opentelemetry_sdk = { version = "0.21", features = ["rt-tokio"] }
|
opentelemetry_sdk = { version = "0.21", features = ["rt-tokio"] }
|
||||||
opentelemetry-otlp = "0.14"
|
opentelemetry-otlp = "0.14"
|
||||||
|
|
63
src/main.rs
63
src/main.rs
|
@ -14,7 +14,6 @@ use anyhow::Context;
|
||||||
use awc::{Client, Connector};
|
use awc::{Client, Connector};
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
use console_subscriber::ConsoleLayer;
|
use console_subscriber::ConsoleLayer;
|
||||||
use once_cell::sync::Lazy;
|
|
||||||
use opentelemetry::KeyValue;
|
use opentelemetry::KeyValue;
|
||||||
use opentelemetry_otlp::WithExportConfig;
|
use opentelemetry_otlp::WithExportConfig;
|
||||||
use opentelemetry_sdk::{propagation::TraceContextPropagator, Resource};
|
use opentelemetry_sdk::{propagation::TraceContextPropagator, Resource};
|
||||||
|
@ -26,7 +25,7 @@ use std::{
|
||||||
io::Cursor,
|
io::Cursor,
|
||||||
net::SocketAddr,
|
net::SocketAddr,
|
||||||
path::PathBuf,
|
path::PathBuf,
|
||||||
sync::Arc,
|
sync::{Arc, OnceLock},
|
||||||
time::{Duration, SystemTime},
|
time::{Duration, SystemTime},
|
||||||
};
|
};
|
||||||
use tracing_actix_web::TracingLogger;
|
use tracing_actix_web::TracingLogger;
|
||||||
|
@ -121,7 +120,7 @@ struct Config {
|
||||||
|
|
||||||
impl Config {
|
impl Config {
|
||||||
fn domain(&self) -> Option<&str> {
|
fn domain(&self) -> Option<&str> {
|
||||||
CONFIG.domain.domain()
|
config().domain.domain()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn upstream_upload_url(&self) -> String {
|
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> {
|
pub enum UploadResult<'a> {
|
||||||
Image(Image),
|
Image(Image),
|
||||||
|
@ -344,27 +347,27 @@ impl Image {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn link(&self) -> String {
|
fn link(&self) -> String {
|
||||||
CONFIG.image_url(&self.file)
|
config().image_url(&self.file)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn thumbnails(&self) -> String {
|
fn thumbnails(&self) -> String {
|
||||||
CONFIG.thumbnails_url(&self.file)
|
config().thumbnails_url(&self.file)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn view(&self, size: Option<u64>) -> String {
|
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 {
|
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 {
|
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 {
|
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();
|
let mut details_handles = Vec::new();
|
||||||
|
|
||||||
for upload_id in &query.uploads {
|
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();
|
let client = client.clone();
|
||||||
|
|
||||||
upload_handles.push(actix_rt::spawn(async move {
|
upload_handles.push(actix_rt::spawn(async move {
|
||||||
|
@ -494,7 +497,7 @@ async fn list_uploads(
|
||||||
}
|
}
|
||||||
|
|
||||||
for (file, delete_token) in &query.files {
|
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 file = file.clone();
|
||||||
let delete_token = delete_token.clone();
|
let delete_token = delete_token.clone();
|
||||||
|
@ -586,7 +589,7 @@ async fn upload(
|
||||||
body: web::Payload,
|
body: web::Payload,
|
||||||
client: web::Data<Client>,
|
client: web::Data<Client>,
|
||||||
) -> Result<HttpResponse, Error> {
|
) -> 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 {
|
let client_request = if let Some(addr) = req.head().peer_addr {
|
||||||
client_request.append_header(("X-Forwarded-For", addr.to_string()))
|
client_request.append_header(("X-Forwarded-For", addr.to_string()))
|
||||||
|
@ -621,7 +624,7 @@ async fn thumbs(
|
||||||
) -> Result<HttpResponse, Error> {
|
) -> Result<HttpResponse, Error> {
|
||||||
let file = query.into_inner().image;
|
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?;
|
let mut res = client.get(url).send().await?;
|
||||||
|
|
||||||
if res.status() == StatusCode::NOT_FOUND {
|
if res.status() == StatusCode::NOT_FOUND {
|
||||||
|
@ -676,7 +679,7 @@ async fn view_original(
|
||||||
) -> Result<HttpResponse, Error> {
|
) -> Result<HttpResponse, Error> {
|
||||||
let file = file.into_inner();
|
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?;
|
let mut res = client.get(url).send().await?;
|
||||||
|
|
||||||
if res.status() == StatusCode::NOT_FOUND {
|
if res.status() == StatusCode::NOT_FOUND {
|
||||||
|
@ -707,7 +710,7 @@ async fn view(
|
||||||
return Ok(to_404());
|
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?;
|
let mut res = client.get(url).send().await?;
|
||||||
|
|
||||||
if res.status() == StatusCode::NOT_FOUND {
|
if res.status() == StatusCode::NOT_FOUND {
|
||||||
|
@ -736,7 +739,7 @@ async fn thumbnail(
|
||||||
let (size, filetype, file) = parts.into_inner();
|
let (size, filetype, file) = parts.into_inner();
|
||||||
|
|
||||||
if valid_thumbnail_size(size) {
|
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;
|
return image(url, req, client).await;
|
||||||
}
|
}
|
||||||
|
@ -754,7 +757,7 @@ async fn full_res(
|
||||||
req: HttpRequest,
|
req: HttpRequest,
|
||||||
client: web::Data<Client>,
|
client: web::Data<Client>,
|
||||||
) -> Result<HttpResponse, Error> {
|
) -> 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
|
image(url, req, client).await
|
||||||
}
|
}
|
||||||
|
@ -799,7 +802,7 @@ async fn delete(
|
||||||
confirm,
|
confirm,
|
||||||
} = query.into_inner();
|
} = 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?;
|
let mut res = client.get(url).send().await?;
|
||||||
|
|
||||||
if res.status() == StatusCode::NOT_FOUND {
|
if res.status() == StatusCode::NOT_FOUND {
|
||||||
|
@ -807,7 +810,7 @@ async fn delete(
|
||||||
}
|
}
|
||||||
|
|
||||||
if confirm {
|
if confirm {
|
||||||
let url = CONFIG.upstream_delete_url(&token, &file);
|
let url = config().upstream_delete_url(&token, &file);
|
||||||
client.delete(url).send().await?;
|
client.delete(url).send().await?;
|
||||||
|
|
||||||
render(HttpResponse::Ok(), |cursor| {
|
render(HttpResponse::Ok(), |cursor| {
|
||||||
|
@ -959,7 +962,7 @@ async fn rustls_client_config() -> anyhow::Result<ClientConfig> {
|
||||||
.collect(),
|
.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?;
|
let cert_bytes = tokio::fs::read(&cert).await?;
|
||||||
|
|
||||||
for res in rustls_pemfile::certs(&mut cert_bytes.as_slice()) {
|
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>> {
|
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
|
c
|
||||||
} else {
|
} else {
|
||||||
tracing::info!("No server certificate");
|
tracing::info!("No server certificate");
|
||||||
return Ok(None);
|
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
|
p
|
||||||
} else {
|
} else {
|
||||||
tracing::info!("No server private_key");
|
tracing::info!("No server private_key");
|
||||||
|
@ -1010,9 +1013,9 @@ async fn main() -> anyhow::Result<()> {
|
||||||
|
|
||||||
init_tracing(
|
init_tracing(
|
||||||
"pict-rs-proxy",
|
"pict-rs-proxy",
|
||||||
CONFIG.opentelemetry_url.as_ref(),
|
config().opentelemetry_url.as_ref(),
|
||||||
CONFIG.console_addr,
|
config().console_addr,
|
||||||
CONFIG.console_event_buffer_size,
|
config().console_event_buffer_size,
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
let client_config = rustls_client_config().await?;
|
let client_config = rustls_client_config().await?;
|
||||||
|
@ -1051,7 +1054,7 @@ async fn main() -> anyhow::Result<()> {
|
||||||
});
|
});
|
||||||
|
|
||||||
if let Some(key) = rustls_server_key().await? {
|
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);
|
let (tx, rx) = rustls_channel_resolver::channel::<32>(key);
|
||||||
|
|
||||||
|
@ -1076,16 +1079,16 @@ async fn main() -> anyhow::Result<()> {
|
||||||
.with_cert_resolver(rx);
|
.with_cert_resolver(rx);
|
||||||
|
|
||||||
server
|
server
|
||||||
.bind_rustls_021(CONFIG.addr, server_config)?
|
.bind_rustls_021(config().addr, server_config)?
|
||||||
.run()
|
.run()
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
handle.abort();
|
handle.abort();
|
||||||
let _ = handle.await;
|
let _ = handle.await;
|
||||||
} else {
|
} 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(())
|
Ok(())
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
@use super::statics::{layout_css, favicon_ico};
|
@use super::statics::{layout_css, favicon_ico};
|
||||||
@use crate::CONFIG;
|
@use crate::config;
|
||||||
|
|
||||||
@(title: &str, description: Option<&str>, head: Content, body: Content)
|
@(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="og:description" content="Upload and share image files" />
|
||||||
<meta property="twitter: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" />
|
<meta property="twitter:domain" content="@domain" />
|
||||||
}
|
}
|
||||||
<link rel="stylesheet" href="@crate::statics(layout_css.name)" type="text/css" />
|
<link rel="stylesheet" href="@crate::statics(layout_css.name)" type="text/css" />
|
||||||
|
|
Loading…
Reference in a new issue