aboutsummaryrefslogtreecommitdiff
path: root/src/api/s3
diff options
context:
space:
mode:
authorAlex Auvolat <lx@deuxfleurs.fr>2025-01-31 18:34:57 +0100
committerAlex Auvolat <lx@deuxfleurs.fr>2025-01-31 18:34:57 +0100
commit84f1db91c4e53a8d0c037fd01adb695fd9400ed5 (patch)
tree9f80c50a55bcde668f487957b88cf00e682e4190 /src/api/s3
parent9fa20d45bebab2a3f66b9721c3643dbd607d944d (diff)
downloadgarage-84f1db91c4e53a8d0c037fd01adb695fd9400ed5.tar.gz
garage-84f1db91c4e53a8d0c037fd01adb695fd9400ed5.zip
fix things up
Diffstat (limited to 'src/api/s3')
-rw-r--r--src/api/s3/api_server.rs7
-rw-r--r--src/api/s3/bucket.rs7
-rw-r--r--src/api/s3/copy.rs3
-rw-r--r--src/api/s3/cors.rs13
-rw-r--r--src/api/s3/delete.rs5
-rw-r--r--src/api/s3/encryption.rs3
-rw-r--r--src/api/s3/error.rs20
-rw-r--r--src/api/s3/get.rs3
-rw-r--r--src/api/s3/lifecycle.rs5
-rw-r--r--src/api/s3/list.rs5
-rw-r--r--src/api/s3/multipart.rs5
-rw-r--r--src/api/s3/post_object.rs5
-rw-r--r--src/api/s3/put.rs3
-rw-r--r--src/api/s3/router.rs3
-rw-r--r--src/api/s3/website.rs11
15 files changed, 52 insertions, 46 deletions
diff --git a/src/api/s3/api_server.rs b/src/api/s3/api_server.rs
index d24f6a0c..a0dbf52c 100644
--- a/src/api/s3/api_server.rs
+++ b/src/api/s3/api_server.rs
@@ -14,15 +14,15 @@ use garage_util::socket_address::UnixOrTCPSocketAddress;
use garage_model::garage::Garage;
use garage_model::key_table::Key;
-use crate::error::*;
use garage_api_common::generic_server::*;
-
+use garage_api_common::helpers::*;
use garage_api_common::signature::verify_request;
use crate::bucket::*;
use crate::copy::*;
use crate::cors::*;
use crate::delete::*;
+use crate::error::*;
use crate::get::*;
use crate::lifecycle::*;
use crate::list::*;
@@ -31,7 +31,6 @@ use crate::post_object::handle_post_object;
use crate::put::*;
use crate::router::Endpoint;
use crate::website::*;
-use garage_api_common::helpers::*;
pub use garage_api_common::signature::streaming::ReqBody;
pub type ResBody = BoxBody<Error>;
@@ -40,7 +39,7 @@ pub struct S3ApiServer {
garage: Arc<Garage>,
}
-pub(crate) struct S3ApiEndpoint {
+pub struct S3ApiEndpoint {
bucket_name: Option<String>,
endpoint: Endpoint,
}
diff --git a/src/api/s3/bucket.rs b/src/api/s3/bucket.rs
index 09c5742b..0a192ba6 100644
--- a/src/api/s3/bucket.rs
+++ b/src/api/s3/bucket.rs
@@ -13,13 +13,14 @@ use garage_util::crdt::*;
use garage_util::data::*;
use garage_util::time::*;
-use crate::api_server::{ReqBody, ResBody};
-use crate::error::*;
-use crate::xml as s3_xml;
use garage_api_common::common_error::CommonError;
use garage_api_common::helpers::*;
use garage_api_common::signature::verify_signed_content;
+use crate::api_server::{ReqBody, ResBody};
+use crate::error::*;
+use crate::xml as s3_xml;
+
pub fn handle_get_bucket_location(ctx: ReqCtx) -> Result<Response<ResBody>, Error> {
let ReqCtx { garage, .. } = ctx;
let loc = s3_xml::LocationConstraint {
diff --git a/src/api/s3/copy.rs b/src/api/s3/copy.rs
index 1a474fd0..e4992a18 100644
--- a/src/api/s3/copy.rs
+++ b/src/api/s3/copy.rs
@@ -20,6 +20,8 @@ use garage_model::s3::mpu_table::*;
use garage_model::s3::object_table::*;
use garage_model::s3::version_table::*;
+use garage_api_common::helpers::*;
+
use crate::api_server::{ReqBody, ResBody};
use crate::checksum::*;
use crate::encryption::EncryptionParams;
@@ -28,7 +30,6 @@ use crate::get::full_object_byte_stream;
use crate::multipart;
use crate::put::{get_headers, save_stream, ChecksumMode, SaveStreamResult};
use crate::xml::{self as s3_xml, xmlns_tag};
-use garage_api_common::helpers::*;
// -------- CopyObject ---------
diff --git a/src/api/s3/cors.rs b/src/api/s3/cors.rs
index ae8352c3..4bd81e32 100644
--- a/src/api/s3/cors.rs
+++ b/src/api/s3/cors.rs
@@ -15,16 +15,17 @@ use http_body_util::BodyExt;
use serde::{Deserialize, Serialize};
-use crate::api_server::{ReqBody, ResBody};
-use crate::error::*;
-use crate::xml::{to_xml_with_header, xmlns_tag, IntValue, Value};
+use garage_model::bucket_table::{Bucket, BucketParams, CorsRule as GarageCorsRule};
+use garage_model::garage::Garage;
+use garage_util::data::*;
+
use garage_api_common::common_error::{helper_error_as_internal, CommonError};
use garage_api_common::helpers::*;
use garage_api_common::signature::verify_signed_content;
-use garage_model::bucket_table::{Bucket, BucketParams, CorsRule as GarageCorsRule};
-use garage_model::garage::Garage;
-use garage_util::data::*;
+use crate::api_server::{ReqBody, ResBody};
+use crate::error::*;
+use crate::xml::{to_xml_with_header, xmlns_tag, IntValue, Value};
pub async fn handle_get_cors(ctx: ReqCtx) -> Result<Response<ResBody>, Error> {
let ReqCtx { bucket_params, .. } = ctx;
diff --git a/src/api/s3/delete.rs b/src/api/s3/delete.rs
index 1711a9b4..b799e67a 100644
--- a/src/api/s3/delete.rs
+++ b/src/api/s3/delete.rs
@@ -5,12 +5,13 @@ use garage_util::data::*;
use garage_model::s3::object_table::*;
+use garage_api_common::helpers::*;
+use garage_api_common::signature::verify_signed_content;
+
use crate::api_server::{ReqBody, ResBody};
use crate::error::*;
use crate::put::next_timestamp;
use crate::xml as s3_xml;
-use garage_api_common::helpers::*;
-use garage_api_common::signature::verify_signed_content;
async fn handle_delete_internal(ctx: &ReqCtx, key: &str) -> Result<(Uuid, Uuid), Error> {
let ReqCtx {
diff --git a/src/api/s3/encryption.rs b/src/api/s3/encryption.rs
index c54d487b..b38d7792 100644
--- a/src/api/s3/encryption.rs
+++ b/src/api/s3/encryption.rs
@@ -28,9 +28,10 @@ use garage_util::migrate::Migrate;
use garage_model::garage::Garage;
use garage_model::s3::object_table::{ObjectVersionEncryption, ObjectVersionMetaInner};
+use garage_api_common::common_error::*;
+
use crate::checksum::Md5Checksum;
use crate::error::Error;
-use garage_api_common::common_error::*;
const X_AMZ_SERVER_SIDE_ENCRYPTION_CUSTOMER_ALGORITHM: HeaderName =
HeaderName::from_static("x-amz-server-side-encryption-customer-algorithm");
diff --git a/src/api/s3/error.rs b/src/api/s3/error.rs
index 77dc07c8..1bb8909c 100644
--- a/src/api/s3/error.rs
+++ b/src/api/s3/error.rs
@@ -8,23 +8,26 @@ use garage_model::helper::error::Error as HelperError;
pub(crate) use garage_api_common::common_error::pass_helper_error;
-use garage_api_common::common_error::{helper_error_as_internal, CommonError};
+use garage_api_common::common_error::{
+ commonErrorDerivative, helper_error_as_internal, CommonError,
+};
pub use garage_api_common::common_error::{
CommonErrorDerivative, OkOrBadRequest, OkOrInternalError,
};
-use crate::xml as s3_xml;
use garage_api_common::generic_server::ApiError;
use garage_api_common::helpers::*;
use garage_api_common::signature::error::Error as SignatureError;
+use crate::xml as s3_xml;
+
/// Errors of this crate
#[derive(Debug, Error)]
pub enum Error {
#[error(display = "{}", _0)]
/// Error from common error
- Common(CommonError),
+ Common(#[error(source)] CommonError),
// Category: cannot process
/// Authorization Header Malformed
@@ -86,14 +89,7 @@ pub enum Error {
NotImplemented(String),
}
-impl<T> From<T> for Error
-where
- CommonError: From<T>,
-{
- fn from(err: T) -> Self {
- Error::Common(CommonError::from(err))
- }
-}
+commonErrorDerivative!(Error);
// Helper errors are always passed as internal errors by default.
// To pass the specific error code back to the client, use `pass_helper_error`.
@@ -103,8 +99,6 @@ impl From<HelperError> for Error {
}
}
-impl CommonErrorDerivative for Error {}
-
impl From<roxmltree::Error> for Error {
fn from(err: roxmltree::Error) -> Self {
Self::InvalidXml(format!("{}", err))
diff --git a/src/api/s3/get.rs b/src/api/s3/get.rs
index c4cd9d48..c2393a51 100644
--- a/src/api/s3/get.rs
+++ b/src/api/s3/get.rs
@@ -25,11 +25,12 @@ use garage_model::garage::Garage;
use garage_model::s3::object_table::*;
use garage_model::s3::version_table::*;
+use garage_api_common::helpers::*;
+
use crate::api_server::ResBody;
use crate::checksum::{add_checksum_response_headers, X_AMZ_CHECKSUM_MODE};
use crate::encryption::EncryptionParams;
use crate::error::*;
-use garage_api_common::helpers::*;
const X_AMZ_MP_PARTS_COUNT: &str = "x-amz-mp-parts-count";
diff --git a/src/api/s3/lifecycle.rs b/src/api/s3/lifecycle.rs
index da211585..c35047ed 100644
--- a/src/api/s3/lifecycle.rs
+++ b/src/api/s3/lifecycle.rs
@@ -5,11 +5,12 @@ use hyper::{Request, Response, StatusCode};
use serde::{Deserialize, Serialize};
+use garage_api_common::helpers::*;
+use garage_api_common::signature::verify_signed_content;
+
use crate::api_server::{ReqBody, ResBody};
use crate::error::*;
use crate::xml::{to_xml_with_header, xmlns_tag, IntValue, Value};
-use garage_api_common::helpers::*;
-use garage_api_common::signature::verify_signed_content;
use garage_model::bucket_table::{
parse_lifecycle_date, Bucket, LifecycleExpiration as GarageLifecycleExpiration,
diff --git a/src/api/s3/list.rs b/src/api/s3/list.rs
index de808c32..a5cc03b0 100644
--- a/src/api/s3/list.rs
+++ b/src/api/s3/list.rs
@@ -13,13 +13,14 @@ use garage_model::s3::object_table::*;
use garage_table::EnumerationOrder;
+use garage_api_common::encoding::*;
+use garage_api_common::helpers::*;
+
use crate::api_server::{ReqBody, ResBody};
use crate::encryption::EncryptionParams;
use crate::error::*;
use crate::multipart as s3_multipart;
use crate::xml as s3_xml;
-use garage_api_common::encoding::*;
-use garage_api_common::helpers::*;
const DUMMY_NAME: &str = "Dummy Key";
const DUMMY_KEY: &str = "GKDummyKey";
diff --git a/src/api/s3/multipart.rs b/src/api/s3/multipart.rs
index 047ed06a..fe39fc93 100644
--- a/src/api/s3/multipart.rs
+++ b/src/api/s3/multipart.rs
@@ -15,14 +15,15 @@ use garage_model::s3::mpu_table::*;
use garage_model::s3::object_table::*;
use garage_model::s3::version_table::*;
+use garage_api_common::helpers::*;
+use garage_api_common::signature::verify_signed_content;
+
use crate::api_server::{ReqBody, ResBody};
use crate::checksum::*;
use crate::encryption::EncryptionParams;
use crate::error::*;
use crate::put::*;
use crate::xml as s3_xml;
-use garage_api_common::helpers::*;
-use garage_api_common::signature::verify_signed_content;
// ----
diff --git a/src/api/s3/post_object.rs b/src/api/s3/post_object.rs
index 6416c523..2bcabf1d 100644
--- a/src/api/s3/post_object.rs
+++ b/src/api/s3/post_object.rs
@@ -16,6 +16,9 @@ use serde::Deserialize;
use garage_model::garage::Garage;
use garage_model::s3::object_table::*;
+use garage_api_common::helpers::*;
+use garage_api_common::signature::payload::{verify_v4, Authorization};
+
use crate::api_server::ResBody;
use crate::checksum::*;
use crate::cors::*;
@@ -23,8 +26,6 @@ use crate::encryption::EncryptionParams;
use crate::error::*;
use crate::put::{get_headers, save_stream, ChecksumMode};
use crate::xml as s3_xml;
-use garage_api_common::helpers::*;
-use garage_api_common::signature::payload::{verify_v4, Authorization};
pub async fn handle_post_object(
garage: Arc<Garage>,
diff --git a/src/api/s3/put.rs b/src/api/s3/put.rs
index 47dcb8f7..530b4e7b 100644
--- a/src/api/s3/put.rs
+++ b/src/api/s3/put.rs
@@ -30,11 +30,12 @@ use garage_model::s3::block_ref_table::*;
use garage_model::s3::object_table::*;
use garage_model::s3::version_table::*;
+use garage_api_common::helpers::*;
+
use crate::api_server::{ReqBody, ResBody};
use crate::checksum::*;
use crate::encryption::EncryptionParams;
use crate::error::*;
-use garage_api_common::helpers::*;
const PUT_BLOCKS_MAX_PARALLEL: usize = 3;
diff --git a/src/api/s3/router.rs b/src/api/s3/router.rs
index 94951e80..9de84b2b 100644
--- a/src/api/s3/router.rs
+++ b/src/api/s3/router.rs
@@ -3,10 +3,11 @@ use std::borrow::Cow;
use hyper::header::HeaderValue;
use hyper::{HeaderMap, Method, Request};
-use crate::error::*;
use garage_api_common::helpers::Authorization;
use garage_api_common::router_macros::{generateQueryParameters, router_match};
+use crate::error::*;
+
router_match! {@func
/// List of all S3 API endpoints.
diff --git a/src/api/s3/website.rs b/src/api/s3/website.rs
index 46decccf..b55bb345 100644
--- a/src/api/s3/website.rs
+++ b/src/api/s3/website.rs
@@ -4,14 +4,15 @@ use http_body_util::BodyExt;
use hyper::{Request, Response, StatusCode};
use serde::{Deserialize, Serialize};
-use crate::api_server::{ReqBody, ResBody};
-use crate::error::*;
-use crate::xml::{to_xml_with_header, xmlns_tag, IntValue, Value};
+use garage_model::bucket_table::*;
+use garage_util::data::*;
+
use garage_api_common::helpers::*;
use garage_api_common::signature::verify_signed_content;
-use garage_model::bucket_table::*;
-use garage_util::data::*;
+use crate::api_server::{ReqBody, ResBody};
+use crate::error::*;
+use crate::xml::{to_xml_with_header, xmlns_tag, IntValue, Value};
pub async fn handle_get_website(ctx: ReqCtx) -> Result<Response<ResBody>, Error> {
let ReqCtx { bucket_params, .. } = ctx;