From 2328ac97757cad0039a4242c3a5b340cfbd2448d Mon Sep 17 00:00:00 2001 From: Anthony Lukach Date: Thu, 29 May 2025 09:53:27 -0700 Subject: [PATCH 1/5] chore: only log errors --- src/utils/errors.rs | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/src/utils/errors.rs b/src/utils/errors.rs index bd174b2..b9ecd8a 100644 --- a/src/utils/errors.rs +++ b/src/utils/errors.rs @@ -83,27 +83,16 @@ pub enum BackendError { S3Error(String), } -impl From for BackendError { - fn from(error: AzureError) -> BackendError { - match error.kind() { - AzureErrorKind::HttpResponse { status, error_code } - if *status == AzureStatusCode::NotFound => - { - BackendError::ObjectNotFound(error_code.clone()) - } - _ => BackendError::AzureError(error), - } - } -} - impl error::ResponseError for BackendError { fn error_response(&self) -> HttpResponse { - error!("Error: {}", self); let status_code = self.status_code(); let body = match status_code { e if e.is_client_error() => self.to_string(), _ => format!("Internal Server Error: {}", self.to_string()), }; + if status_code.is_server_error() { + error!("Error: {}", self); + } HttpResponse::build(status_code).body(body) } @@ -135,6 +124,20 @@ impl error::ResponseError for BackendError { } } +// Azure API Errors +impl From for BackendError { + fn from(error: AzureError) -> BackendError { + match error.kind() { + AzureErrorKind::HttpResponse { status, error_code } + if *status == AzureStatusCode::NotFound => + { + BackendError::ObjectNotFound(error_code.clone()) + } + _ => BackendError::AzureError(error), + } + } +} + // S3 API Errors fn get_rusoto_error_message( operation: &str, From aa56674c6f6435bf3d1ad02e056f480b56d6f6b1 Mon Sep 17 00:00:00 2001 From: Anthony Lukach Date: Thu, 29 May 2025 09:58:51 -0700 Subject: [PATCH 2/5] Make ObjectNotFound string required --- src/utils/errors.rs | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/utils/errors.rs b/src/utils/errors.rs index b9ecd8a..38a97f1 100644 --- a/src/utils/errors.rs +++ b/src/utils/errors.rs @@ -27,7 +27,7 @@ pub enum BackendError { SourceRepositoryMissingPrimaryMirror, #[error("object not found: {0:?}")] - ObjectNotFound(Option), + ObjectNotFound(String), #[error("api key not found")] ApiKeyNotFound, @@ -131,7 +131,7 @@ impl From for BackendError { AzureErrorKind::HttpResponse { status, error_code } if *status == AzureStatusCode::NotFound => { - BackendError::ObjectNotFound(error_code.clone()) + BackendError::ObjectNotFound(error_code.clone().unwrap_or("".to_string())) } _ => BackendError::AzureError(error), } @@ -180,11 +180,9 @@ impl_s3_errors!( impl From> for BackendError { fn from(error: RusotoError) -> BackendError { match error { - RusotoError::Service(HeadObjectError::NoSuchKey(e)) => { - BackendError::ObjectNotFound(Some(e)) - } + RusotoError::Service(HeadObjectError::NoSuchKey(e)) => BackendError::ObjectNotFound(e), RusotoError::Unknown(e) if e.status == StatusCode::NOT_FOUND => { - BackendError::ObjectNotFound(Some(e.body_as_str().to_string())) + BackendError::ObjectNotFound(e.body_as_str().to_string()) } _ => BackendError::S3Error(get_rusoto_error_message("HeadObject", error)), } @@ -246,7 +244,7 @@ mod tests { assert_eq!(response.status(), StatusCode::NOT_FOUND); assert_eq!( to_bytes(response.into_body()).await.unwrap(), - Bytes::from("object not found: Some(\"test-key\")") + Bytes::from("object not found: \"test-key\"") ); } @@ -329,7 +327,7 @@ mod tests { assert_eq!(response.status(), StatusCode::NOT_FOUND); assert_eq!( to_bytes(response.into_body()).await.unwrap(), - Bytes::from("object not found: Some(\"ResourceNotFound\")") + Bytes::from("object not found: \"ResourceNotFound\"") ); } From 4334a6f851f1c5b76620316dd8fabf1a11605213 Mon Sep 17 00:00:00 2001 From: Anthony Lukach Date: Thu, 29 May 2025 09:59:52 -0700 Subject: [PATCH 3/5] Don't log error body --- src/utils/errors.rs | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/utils/errors.rs b/src/utils/errors.rs index 38a97f1..ec21116 100644 --- a/src/utils/errors.rs +++ b/src/utils/errors.rs @@ -149,12 +149,7 @@ fn get_rusoto_error_message( RusotoError::Credentials(e) => format!("{} Credentials Error: {}", operation, e), RusotoError::Validation(e) => format!("{} Validation Error: {}", operation, e), RusotoError::ParseError(e) => format!("{} Parse Error: {}", operation, e), - RusotoError::Unknown(e) => format!( - "{} Unknown Error: status {}, body {}", - operation, - e.status, - e.body_as_str() - ), + RusotoError::Unknown(e) => format!("{} Unknown Error: status {}", operation, e.status), RusotoError::Blocking => format!("{} Blocking Error", operation), } } @@ -294,7 +289,7 @@ mod tests { assert_eq!(response.status(), StatusCode::BAD_GATEWAY); assert_eq!( to_bytes(response.into_body()).await.unwrap(), - Bytes::from("Internal Server Error: s3 error: PutObject Unknown Error: status 500 Internal Server Error, body ") + Bytes::from("Internal Server Error: s3 error: PutObject Unknown Error: status 500 Internal Server Error") ); } } From 26cea5adf2054c0a84f46de5d2e47bbc9daeefeb Mon Sep 17 00:00:00 2001 From: Anthony Lukach Date: Thu, 29 May 2025 10:07:56 -0700 Subject: [PATCH 4/5] Retain option string for object not found, just don't log it as such --- src/utils/errors.rs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/utils/errors.rs b/src/utils/errors.rs index ec21116..9a2f609 100644 --- a/src/utils/errors.rs +++ b/src/utils/errors.rs @@ -26,8 +26,8 @@ pub enum BackendError { #[error("source repository missing primary mirror")] SourceRepositoryMissingPrimaryMirror, - #[error("object not found: {0:?}")] - ObjectNotFound(String), + #[error("object not found: {message}", message = .0.as_ref().unwrap_or(&"".to_string()))] + ObjectNotFound(Option), #[error("api key not found")] ApiKeyNotFound, @@ -131,7 +131,7 @@ impl From for BackendError { AzureErrorKind::HttpResponse { status, error_code } if *status == AzureStatusCode::NotFound => { - BackendError::ObjectNotFound(error_code.clone().unwrap_or("".to_string())) + BackendError::ObjectNotFound(error_code.clone()) } _ => BackendError::AzureError(error), } @@ -175,9 +175,11 @@ impl_s3_errors!( impl From> for BackendError { fn from(error: RusotoError) -> BackendError { match error { - RusotoError::Service(HeadObjectError::NoSuchKey(e)) => BackendError::ObjectNotFound(e), + RusotoError::Service(HeadObjectError::NoSuchKey(e)) => { + BackendError::ObjectNotFound(Some(e)) + } RusotoError::Unknown(e) if e.status == StatusCode::NOT_FOUND => { - BackendError::ObjectNotFound(e.body_as_str().to_string()) + BackendError::ObjectNotFound(Some(e.body_as_str().to_string())) } _ => BackendError::S3Error(get_rusoto_error_message("HeadObject", error)), } @@ -239,7 +241,7 @@ mod tests { assert_eq!(response.status(), StatusCode::NOT_FOUND); assert_eq!( to_bytes(response.into_body()).await.unwrap(), - Bytes::from("object not found: \"test-key\"") + Bytes::from("object not found: test-key") ); } @@ -322,7 +324,7 @@ mod tests { assert_eq!(response.status(), StatusCode::NOT_FOUND); assert_eq!( to_bytes(response.into_body()).await.unwrap(), - Bytes::from("object not found: \"ResourceNotFound\"") + Bytes::from("object not found: ResourceNotFound") ); } From 0666d5082a87c6814ac05e2e65649fd4dbe55446 Mon Sep 17 00:00:00 2001 From: Anthony Lukach Date: Thu, 29 May 2025 11:14:51 -0700 Subject: [PATCH 5/5] simplify --- src/utils/errors.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/errors.rs b/src/utils/errors.rs index 9a2f609..6c72ac4 100644 --- a/src/utils/errors.rs +++ b/src/utils/errors.rs @@ -26,7 +26,7 @@ pub enum BackendError { #[error("source repository missing primary mirror")] SourceRepositoryMissingPrimaryMirror, - #[error("object not found: {message}", message = .0.as_ref().unwrap_or(&"".to_string()))] + #[error("object not found: {}", .0.clone().unwrap_or_default())] ObjectNotFound(Option), #[error("api key not found")]