From 2c47045659e1750affda4347d5906272e8965d07 Mon Sep 17 00:00:00 2001 From: AndSDev Date: Fri, 6 Jun 2025 12:59:27 +0300 Subject: [PATCH] feat(service/media): improve S3 error processing --- src/service/media/mod.rs | 22 +++++++++++++++------- src/utils/error.rs | 7 +++++++ 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/service/media/mod.rs b/src/service/media/mod.rs index fd695277..36817562 100644 --- a/src/service/media/mod.rs +++ b/src/service/media/mod.rs @@ -3,6 +3,7 @@ use std::{io::Cursor, sync::Arc}; pub use data::Data; use futures_util::{stream, StreamExt}; +use http::StatusCode; use ruma::{ api::client::{error::ErrorKind, media::is_safe_inline_content_type}, http_headers::{ContentDisposition, ContentDispositionType}, @@ -621,16 +622,23 @@ impl Service { credentials, duration, } => { + let sha256_hex = hex::encode(sha256_digest); let url = bucket - .get_object(Some(credentials), &hex::encode(sha256_digest)) + .get_object(Some(credentials), &sha256_hex) .sign(*duration); let client = services().globals.default_client(); let resp = client.get(url).send().await?; + if resp.status() == StatusCode::NOT_FOUND { + return Err(Error::BadRequest( + ErrorKind::NotFound, + "File does not exist", + )); + } if !resp.status().is_success() { - warn!("S3 request error:\n{}", resp.text().await?); - return Err(Error::bad_database("Cannot read media file")); + warn!("S3 request error ({}):\n{}", sha256_hex, resp.text().await?); + return Err(Error::bad_s3_response("Cannot read media file")); } resp.bytes().await?.to_vec() @@ -681,8 +689,8 @@ pub async fn create_file(sha256_hex: &str, file: &[u8]) -> Result<()> { let resp = client.put(url).body(file.to_vec()).send().await?; if !resp.status().is_success() { - warn!("S3 request error:\n{}", resp.text().await?); - return Err(Error::bad_database("Cannot write media file")); + warn!("S3 request error ({}):\n{}", sha256_hex, resp.text().await?); + return Err(Error::bad_s3_response("Cannot write media file")); } } } @@ -768,8 +776,8 @@ async fn delete_file(sha256_hex: &str) -> Result<()> { let resp = client.delete(url).send().await?; if !resp.status().is_success() { - warn!("S3 request error:\n{}", resp.text().await?); - return Err(Error::bad_database("Cannot delete media file")); + warn!("S3 request error ({}):\n{}", sha256_hex, resp.text().await?); + return Err(Error::bad_s3_response("Cannot delete media file")); } } } diff --git a/src/utils/error.rs b/src/utils/error.rs index 1b1a26db..1c1302e7 100644 --- a/src/utils/error.rs +++ b/src/utils/error.rs @@ -52,6 +52,8 @@ pub enum Error { source: std::io::Error, }, #[error("{0}")] + BadS3Response(&'static str), + #[error("{0}")] BadServerResponse(&'static str), #[error("{0}")] BadConfig(&'static str), @@ -91,6 +93,11 @@ impl Error { error!("BadConfig: {}", message); Self::BadConfig(message) } + + pub fn bad_s3_response(message: &'static str) -> Self { + info!("BadS3Response: {}", message); + Self::BadS3Response(message) + } } impl Error {