From b8f2cabd05b78b81d43e7bbb6e35bf0e2d7772f4 Mon Sep 17 00:00:00 2001 From: Nicolas Kamzol Date: Mon, 23 Feb 2026 10:25:52 +0100 Subject: [PATCH 1/2] Rendering support for all backends --- src/api/wado/routes.rs | 55 ++++++++++++++++++++++++++++++--------- src/api/wado/service.rs | 34 +++++++++++++++++++++--- src/backend/dimse/wado.rs | 2 +- src/backend/s3/wado.rs | 12 ++++----- 4 files changed, 79 insertions(+), 24 deletions(-) diff --git a/src/api/wado/routes.rs b/src/api/wado/routes.rs index ce5eb6c..a2cd627 100644 --- a/src/api/wado/routes.rs +++ b/src/api/wado/routes.rs @@ -1,9 +1,11 @@ use crate::api::wado::{ - MetadataRequest, RenderedResponse, RenderingRequest, RetrieveInstanceRequest, ThumbnailRequest, + MetadataRequest, RenderedResponse, RenderingRequest, RetrieveError, RetrieveInstanceRequest, + ThumbnailRequest, }; use crate::backend::dimse::cmove::movescu::MoveError; use crate::backend::dimse::wado::DicomMultipartStream; use crate::backend::ServiceProvider; +use crate::rendering::render_instances; use crate::types::UI; use crate::AppState; use axum::body::Body; @@ -21,7 +23,8 @@ use dicom_json::DicomJson; use futures::{StreamExt, TryStreamExt}; use std::pin::Pin; use std::sync::Arc; -use tracing::{error, instrument}; +use tokio::pin; +use tracing::{error, instrument, trace}; /// HTTP Router for the Retrieve Transaction /// @@ -109,23 +112,46 @@ async fn instance_resource( async fn rendered_resource( provider: ServiceProvider, request: RenderingRequest, -) -> impl IntoResponse { +) -> Result { let Some(wado) = provider.wado else { - return Response::builder() + return Ok(Response::builder() .status(StatusCode::SERVICE_UNAVAILABLE) .body(Body::from("WADO-RS endpoint is disabled")) - .unwrap(); + .unwrap()); }; let content_type = request.options.media_type.to_string(); - match wado.render(request).await { - Ok(RenderedResponse(content)) => Response::builder() + + match wado.render(&request).await { + Ok(RenderedResponse(content)) => Ok(Response::builder() .header(CONTENT_TYPE, content_type) .body(Body::from(content)) - .unwrap(), + .unwrap()), + Err(RetrieveError::Unimplemented) => { + trace!("Using default rendering"); + let instance_request = RetrieveInstanceRequest { + query: request.query, + }; + + let stream = wado + .retrieve(instance_request) + .await? + .stream + .filter_map(|x| async { x.ok() }); + pin!(stream); + + let render_output = render_instances(&mut stream, &request.options) + .await + .map_err(|err| RetrieveError::Backend { source: err })?; + + Ok(Response::builder() + .header(CONTENT_TYPE, content_type) + .body(Body::from(render_output)) + .unwrap()) + } Err(err) => { error!("{err:?}"); - (StatusCode::INTERNAL_SERVER_ERROR, err.to_string()).into_response() + Ok((StatusCode::INTERNAL_SERVER_ERROR, err.to_string()).into_response()) } } } @@ -268,7 +294,10 @@ async fn instance_metadata( } #[instrument(skip_all)] -async fn rendered_study(provider: ServiceProvider, request: RenderingRequest) -> impl IntoResponse { +async fn rendered_study( + provider: ServiceProvider, + request: RenderingRequest, +) -> Result { rendered_resource(provider, request).await } @@ -276,7 +305,7 @@ async fn rendered_study(provider: ServiceProvider, request: RenderingRequest) -> async fn rendered_series( provider: ServiceProvider, request: RenderingRequest, -) -> impl IntoResponse { +) -> Result { rendered_resource(provider, request).await } @@ -284,7 +313,7 @@ async fn rendered_series( async fn rendered_instance( provider: ServiceProvider, request: RenderingRequest, -) -> impl IntoResponse { +) -> Result { rendered_resource(provider, request).await } @@ -292,7 +321,7 @@ async fn rendered_instance( async fn rendered_frames( provider: ServiceProvider, request: RenderingRequest, -) -> impl IntoResponse { +) -> Result { rendered_resource(provider, request).await } diff --git a/src/api/wado/service.rs b/src/api/wado/service.rs index cb51347..aee00f1 100644 --- a/src/api/wado/service.rs +++ b/src/api/wado/service.rs @@ -3,10 +3,12 @@ use crate::rendering::{RenderedMediaType, RenderingOptions}; use crate::types::{AE, UI}; use crate::AppState; use async_trait::async_trait; +use axum::body::Body; use axum::extract::rejection::{PathRejection, QueryRejection}; use axum::extract::{FromRef, FromRequestParts, Path, Query}; use axum::http::header::ACCEPT; use axum::http::request::Parts; +use axum::http::StatusCode; use axum::response::{IntoResponse, Response}; use dicom::object::{FileDicomObject, InMemDicomObject}; use futures::stream::BoxStream; @@ -22,20 +24,44 @@ use thiserror::Error; pub trait WadoService: Send + Sync { async fn retrieve( &self, - request: RetrieveInstanceRequest, - ) -> Result; + _request: RetrieveInstanceRequest, + ) -> Result { + return Err(RetrieveError::Unimplemented); + } - async fn render(&self, request: RenderingRequest) -> Result; + /// Some backends might prefer to store pre-rendered images and serve them directly. + /// In that case, this function can be implemented to bypass the integrated rendering and + /// serve the pre-rendered images directly. + async fn render(&self, _request: &RenderingRequest) -> Result { + return Err(RetrieveError::Unimplemented); + } - async fn metadata(&self, request: MetadataRequest) -> Result; + async fn metadata(&self, _request: MetadataRequest) -> Result { + return Err(RetrieveError::Unimplemented); + } } #[derive(Debug, Error)] pub enum RetrieveError { #[error(transparent)] Backend { source: anyhow::Error }, + #[error("Unimplemented")] + Unimplemented, } +impl IntoResponse for RetrieveError { + fn into_response(self) -> Response { + match self { + RetrieveError::Backend { source } => { + (StatusCode::INTERNAL_SERVER_ERROR, source.to_string()).into_response() + } + RetrieveError::Unimplemented => Response::builder() + .status(StatusCode::NOT_IMPLEMENTED) + .body(Body::from("This transaction is not implemented.")) + .unwrap(), + } + } +} pub struct RetrieveInstanceRequest { pub query: ResourceQuery, } diff --git a/src/backend/dimse/wado.rs b/src/backend/dimse/wado.rs index 903e8db..02b91a0 100644 --- a/src/backend/dimse/wado.rs +++ b/src/backend/dimse/wado.rs @@ -69,7 +69,7 @@ impl WadoService for DimseWadoService { }) } - async fn render(&self, request: RenderingRequest) -> Result { + async fn render(&self, request: &RenderingRequest) -> Result { if self.config.receivers.len() > 1 { warn!("Multiple receivers are not supported yet."); } diff --git a/src/backend/s3/wado.rs b/src/backend/s3/wado.rs index 9715ed1..f5cac3b 100644 --- a/src/backend/s3/wado.rs +++ b/src/backend/s3/wado.rs @@ -1,6 +1,6 @@ use crate::api::wado::{ - InstanceResponse, MetadataRequest, RenderedRequest, RenderedResponse, RenderingRequest, - RetrieveError, RetrieveInstanceRequest, WadoService, + InstanceResponse, MetadataRequest, RenderedResponse, RenderingRequest, RetrieveError, + RetrieveInstanceRequest, WadoService, }; use crate::backend::dimse::cmove::movescu::MoveError; use crate::config::{S3Config, S3EndpointStyle}; @@ -119,11 +119,11 @@ impl WadoService for S3WadoService { }) } - async fn render(&self, _request: RenderingRequest) -> Result { - unimplemented!() + async fn render(&self, _request: &RenderingRequest) -> Result { + Err(RetrieveError::Unimplemented) } - async fn metadata(&self, request: MetadataRequest) -> Result { - unimplemented!() + async fn metadata(&self, _request: MetadataRequest) -> Result { + Err(RetrieveError::Unimplemented) } } From d734c9f45abaf33142308eeaee5f6daef8607c86 Mon Sep 17 00:00:00 2001 From: Nicolas Kamzol Date: Mon, 23 Feb 2026 10:25:52 +0100 Subject: [PATCH 2/2] chore(deps): update S3 dependencies --- Cargo.lock | 205 +++++++++++++++++++++++++++-------------------------- Cargo.toml | 6 +- 2 files changed, 108 insertions(+), 103 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6e9508c..3fd4375 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -35,7 +35,7 @@ dependencies = [ "bytestring", "derive_more", "encoding_rs", - "foldhash", + "foldhash 0.1.5", "futures-core", "http 0.2.12", "httparse", @@ -133,7 +133,7 @@ dependencies = [ "cfg-if", "derive_more", "encoding_rs", - "foldhash", + "foldhash 0.1.5", "futures-core", "futures-util", "impl-more", @@ -307,9 +307,9 @@ dependencies = [ [[package]] name = "aws-config" -version = "1.8.8" +version = "1.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37cf2b6af2a95a20e266782b4f76f1a5e12bf412a9db2de9c1e9123b9d8c0ad8" +checksum = "8a8fc176d53d6fe85017f230405e3255cedb4a02221cb55ed6d76dccbbb099b2" dependencies = [ "aws-credential-types", "aws-runtime", @@ -337,9 +337,9 @@ dependencies = [ [[package]] name = "aws-credential-types" -version = "1.2.8" +version = "1.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faf26925f4a5b59eb76722b63c2892b1d70d06fa053c72e4a100ec308c1d47bc" +checksum = "6d203b0bf2626dcba8665f5cd0871d7c2c0930223d6b6be9097592fea21242d0" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", @@ -372,9 +372,9 @@ dependencies = [ [[package]] name = "aws-runtime" -version = "1.5.12" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa006bb32360ed90ac51203feafb9d02e3d21046e1fd3a450a404b90ea73e5d" +checksum = "ede2ddc593e6c8acc6ce3358c28d6677a6dc49b65ba4b37a2befe14a11297e75" dependencies = [ "aws-credential-types", "aws-sigv4", @@ -386,9 +386,12 @@ dependencies = [ "aws-smithy-types", "aws-types", "bytes", + "bytes-utils", "fastrand", "http 0.2.12", + "http 1.3.1", "http-body 0.4.6", + "http-body 1.0.1", "percent-encoding", "pin-project-lite", "tracing", @@ -397,9 +400,9 @@ dependencies = [ [[package]] name = "aws-sdk-s3" -version = "1.108.0" +version = "1.124.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200be4aed61e3c0669f7268bacb768f283f1c32a7014ce57225e1160be2f6ccb" +checksum = "744c09d75dfec039a05cf8e117c995ded3b0baffa6eb83f3ed7075a01d8d8947" dependencies = [ "aws-credential-types", "aws-runtime", @@ -409,6 +412,7 @@ dependencies = [ "aws-smithy-eventstream", "aws-smithy-http", "aws-smithy-json", + "aws-smithy-observability", "aws-smithy-runtime", "aws-smithy-runtime-api", "aws-smithy-types", @@ -420,7 +424,7 @@ dependencies = [ "hmac", "http 0.2.12", "http 1.3.1", - "http-body 0.4.6", + "http-body 1.0.1", "lru", "percent-encoding", "regex-lite", @@ -431,15 +435,16 @@ dependencies = [ [[package]] name = "aws-sdk-sso" -version = "1.86.0" +version = "1.95.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a0abbfab841446cce6e87af853a3ba2cc1bc9afcd3f3550dd556c43d434c86d" +checksum = "00c5ff27c6ba2cbd95e6e26e2e736676fdf6bcf96495b187733f521cfe4ce448" dependencies = [ "aws-credential-types", "aws-runtime", "aws-smithy-async", "aws-smithy-http", "aws-smithy-json", + "aws-smithy-observability", "aws-smithy-runtime", "aws-smithy-runtime-api", "aws-smithy-types", @@ -447,21 +452,23 @@ dependencies = [ "bytes", "fastrand", "http 0.2.12", + "http 1.3.1", "regex-lite", "tracing", ] [[package]] name = "aws-sdk-ssooidc" -version = "1.88.0" +version = "1.97.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a68d675582afea0e94d38b6ca9c5aaae4ca14f1d36faa6edb19b42e687e70d7" +checksum = "4d186f1e5a3694a188e5a0640b3115ccc6e084d104e16fd6ba968dca072ffef8" dependencies = [ "aws-credential-types", "aws-runtime", "aws-smithy-async", "aws-smithy-http", "aws-smithy-json", + "aws-smithy-observability", "aws-smithy-runtime", "aws-smithy-runtime-api", "aws-smithy-types", @@ -469,21 +476,23 @@ dependencies = [ "bytes", "fastrand", "http 0.2.12", + "http 1.3.1", "regex-lite", "tracing", ] [[package]] name = "aws-sdk-sts" -version = "1.88.0" +version = "1.99.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d30990923f4f675523c51eb1c0dec9b752fb267b36a61e83cbc219c9d86da715" +checksum = "9acba7c62f3d4e2408fa998a3a8caacd8b9a5b5549cf36e2372fbdae329d5449" dependencies = [ "aws-credential-types", "aws-runtime", "aws-smithy-async", "aws-smithy-http", "aws-smithy-json", + "aws-smithy-observability", "aws-smithy-query", "aws-smithy-runtime", "aws-smithy-runtime-api", @@ -492,15 +501,16 @@ dependencies = [ "aws-types", "fastrand", "http 0.2.12", + "http 1.3.1", "regex-lite", "tracing", ] [[package]] name = "aws-sigv4" -version = "1.3.5" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bffc03068fbb9c8dd5ce1c6fb240678a5cffb86fb2b7b1985c999c4b83c8df68" +checksum = "37411f8e0f4bea0c3ca0958ce7f18f6439db24d555dbd809787262cd00926aa9" dependencies = [ "aws-credential-types", "aws-smithy-eventstream", @@ -526,9 +536,9 @@ dependencies = [ [[package]] name = "aws-smithy-async" -version = "1.2.6" +version = "1.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "127fcfad33b7dfc531141fda7e1c402ac65f88aca5511a4d31e2e3d2cd01ce9c" +checksum = "5cc50d0f63e714784b84223abd7abbc8577de8c35d699e0edd19f0a88a08ae13" dependencies = [ "futures-util", "pin-project-lite", @@ -537,17 +547,18 @@ dependencies = [ [[package]] name = "aws-smithy-checksums" -version = "0.63.9" +version = "0.64.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "165d8583d8d906e2fb5511d29201d447cc710864f075debcdd9c31c265412806" +checksum = "180dddf5ef0f52a2f99e2fada10e16ea610e507ef6148a42bdc4d5867596aa00" dependencies = [ "aws-smithy-http", "aws-smithy-types", "bytes", "crc-fast", "hex", - "http 0.2.12", - "http-body 0.4.6", + "http 1.3.1", + "http-body 1.0.1", + "http-body-util", "md-5", "pin-project-lite", "sha1", @@ -557,9 +568,9 @@ dependencies = [ [[package]] name = "aws-smithy-eventstream" -version = "0.60.12" +version = "0.60.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9656b85088f8d9dc7ad40f9a6c7228e1e8447cdf4b046c87e152e0805dea02fa" +checksum = "1c0b3e587fbaa5d7f7e870544508af8ce82ea47cd30376e69e1e37c4ac746f79" dependencies = [ "aws-smithy-types", "bytes", @@ -568,9 +579,9 @@ dependencies = [ [[package]] name = "aws-smithy-http" -version = "0.62.4" +version = "0.63.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3feafd437c763db26aa04e0cc7591185d0961e64c61885bece0fb9d50ceac671" +checksum = "d619373d490ad70966994801bc126846afaa0d1ee920697a031f0cf63f2568e7" dependencies = [ "aws-smithy-eventstream", "aws-smithy-runtime-api", @@ -578,9 +589,10 @@ dependencies = [ "bytes", "bytes-utils", "futures-core", - "http 0.2.12", + "futures-util", "http 1.3.1", - "http-body 0.4.6", + "http-body 1.0.1", + "http-body-util", "percent-encoding", "pin-project-lite", "pin-utils", @@ -589,9 +601,9 @@ dependencies = [ [[package]] name = "aws-smithy-http-client" -version = "1.1.3" +version = "1.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1053b5e587e6fa40ce5a79ea27957b04ba660baa02b28b7436f64850152234f1" +checksum = "00ccbb08c10f6bcf912f398188e42ee2eab5f1767ce215a02a73bc5df1bbdd95" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", @@ -609,7 +621,7 @@ dependencies = [ "pin-project-lite", "rustls 0.21.12", "rustls 0.23.34", - "rustls-native-certs 0.8.2", + "rustls-native-certs", "rustls-pki-types", "tokio", "tokio-rustls 0.26.4", @@ -619,27 +631,27 @@ dependencies = [ [[package]] name = "aws-smithy-json" -version = "0.61.6" +version = "0.62.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff418fc8ec5cadf8173b10125f05c2e7e1d46771406187b2c878557d4503390" +checksum = "27b3a779093e18cad88bbae08dc4261e1d95018c4c5b9356a52bcae7c0b6e9bb" dependencies = [ "aws-smithy-types", ] [[package]] name = "aws-smithy-observability" -version = "0.1.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d1881b1ea6d313f9890710d65c158bdab6fb08c91ea825f74c1c8c357baf4cc" +checksum = "4d3f39d5bb871aaf461d59144557f16d5927a5248a983a40654d9cf3b9ba183b" dependencies = [ "aws-smithy-runtime-api", ] [[package]] name = "aws-smithy-query" -version = "0.60.8" +version = "0.60.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d28a63441360c477465f80c7abac3b9c4d075ca638f982e605b7dc2a2c7156c9" +checksum = "05f76a580e3d8f8961e5d48763214025a2af65c2fa4cd1fb7f270a0e107a71b0" dependencies = [ "aws-smithy-types", "urlencoding", @@ -647,9 +659,9 @@ dependencies = [ [[package]] name = "aws-smithy-runtime" -version = "1.9.3" +version = "1.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ab99739082da5347660c556689256438defae3bcefd66c52b095905730e404" +checksum = "22ccf7f6eba8b2dcf8ce9b74806c6c185659c311665c4bf8d6e71ebd454db6bf" dependencies = [ "aws-smithy-async", "aws-smithy-http", @@ -663,6 +675,7 @@ dependencies = [ "http 1.3.1", "http-body 0.4.6", "http-body 1.0.1", + "http-body-util", "pin-project-lite", "pin-utils", "tokio", @@ -671,9 +684,9 @@ dependencies = [ [[package]] name = "aws-smithy-runtime-api" -version = "1.9.1" +version = "1.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3683c5b152d2ad753607179ed71988e8cfd52964443b4f74fd8e552d0bbfeb46" +checksum = "b4af6e5def28be846479bbeac55aa4603d6f7986fc5da4601ba324dd5d377516" dependencies = [ "aws-smithy-async", "aws-smithy-types", @@ -688,9 +701,9 @@ dependencies = [ [[package]] name = "aws-smithy-types" -version = "1.3.3" +version = "1.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f5b3a7486f6690ba25952cabf1e7d75e34d69eaff5081904a47bc79074d6457" +checksum = "8ca2734c16913a45343b37313605d84e7d8b34a4611598ce1d25b35860a2bed3" dependencies = [ "base64-simd", "bytes", @@ -714,18 +727,18 @@ dependencies = [ [[package]] name = "aws-smithy-xml" -version = "0.60.11" +version = "0.60.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9c34127e8c624bc2999f3b657e749c1393bedc9cd97b92a804db8ced4d2e163" +checksum = "b53543b4b86ed43f051644f704a98c7291b3618b67adf057ee77a366fa52fcaa" dependencies = [ "xmlparser", ] [[package]] name = "aws-types" -version = "1.3.9" +version = "1.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2fd329bf0e901ff3f60425691410c69094dc2a1f34b331f37bfc4e9ac1565a1" +checksum = "0470cc047657c6e286346bdf10a8719d26efd6a91626992e0e64481e44323e96" dependencies = [ "aws-credential-types", "aws-smithy-async", @@ -1185,15 +1198,14 @@ checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" [[package]] name = "crc-fast" -version = "1.3.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bf62af4cc77d8fe1c22dde4e721d87f2f54056139d8c412e1366b740305f56f" +checksum = "2fd92aca2c6001b1bf5ba0ff84ee74ec8501b52bbef0cac80bf25a6c1d87a83d" dependencies = [ "crc", "digest", - "libc", - "rand 0.9.2", - "regex", + "rustversion", + "spin 0.10.0", ] [[package]] @@ -1831,6 +1843,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + [[package]] name = "foreign-types" version = "0.3.2" @@ -2077,9 +2095,7 @@ version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ - "allocator-api2", - "equivalent", - "foldhash", + "foldhash 0.1.5", ] [[package]] @@ -2087,6 +2103,11 @@ name = "hashbrown" version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash 0.2.0", +] [[package]] name = "hashlink" @@ -2261,7 +2282,6 @@ dependencies = [ "hyper 0.14.32", "log", "rustls 0.21.12", - "rustls-native-certs 0.6.3", "tokio", "tokio-rustls 0.24.1", ] @@ -2276,7 +2296,7 @@ dependencies = [ "hyper 1.7.0", "hyper-util", "rustls 0.23.34", - "rustls-native-certs 0.8.2", + "rustls-native-certs", "rustls-pki-types", "tokio", "tokio-rustls 0.26.4", @@ -2592,9 +2612,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.15" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" [[package]] name = "jobserver" @@ -2898,11 +2918,11 @@ dependencies = [ [[package]] name = "lru" -version = "0.12.5" +version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +checksum = "a1dc47f592c06f33f8e3aea9591776ec7c9f9e4124778ff8a3c3b87159f7e593" dependencies = [ - "hashbrown 0.15.5", + "hashbrown 0.16.0", ] [[package]] @@ -3003,7 +3023,7 @@ dependencies = [ "httparse", "memchr", "mime", - "spin", + "spin 0.9.8", "version_check", ] @@ -3820,18 +3840,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rustls-native-certs" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" -dependencies = [ - "openssl-probe", - "rustls-pemfile 1.0.4", - "schannel", - "security-framework 2.11.1", -] - [[package]] name = "rustls-native-certs" version = "0.8.2" @@ -3844,15 +3852,6 @@ dependencies = [ "security-framework 3.5.1", ] -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.7", -] - [[package]] name = "rustls-pemfile" version = "2.2.0" @@ -3901,9 +3900,9 @@ checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" -version = "1.0.20" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" [[package]] name = "safe-transmute" @@ -4353,6 +4352,12 @@ version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +[[package]] +name = "spin" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5fe4ccb98d9c292d56fec89a5e07da7fc4cf0dc11e156b41793132775d3e591" + [[package]] name = "spki" version = "0.6.0" @@ -4582,9 +4587,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.48.0" +version = "1.49.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" +checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" dependencies = [ "bytes", "libc", @@ -4651,9 +4656,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.16" +version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" dependencies = [ "bytes", "futures-core", @@ -4778,9 +4783,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.41" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ "log", "pin-project-lite", @@ -4790,9 +4795,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", @@ -4801,9 +4806,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.34" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ "once_cell", "valuable", @@ -4906,7 +4911,7 @@ dependencies = [ "log", "native-tls", "percent-encoding", - "rustls-pemfile 2.2.0", + "rustls-pemfile", "rustls-pki-types", "ureq-proto", "utf-8", diff --git a/Cargo.toml b/Cargo.toml index 412fc7d..4d565f6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -53,9 +53,9 @@ multer = "3.1.0" pin-project = "1.1.10" image = { version = "0.25.8", features = ["png", "jpeg", "gif"] } # S3 backend -aws-config = { version = "1.8.8", features = ["behavior-version-latest"], optional = true } -aws-sdk-s3 = { version = "1.108.0", optional = true } -aws-credential-types = { version = "1.2.8", optional = true } +aws-config = { version = "1.8.14", features = ["behavior-version-latest"], optional = true } +aws-sdk-s3 = { version = "1.124.0", optional = true } +aws-credential-types = { version = "1.2.13", optional = true } [lints.rust] unsafe_code = "forbid"