diff options
author | Quentin Dufour <quentin@deuxfleurs.fr> | 2021-05-14 22:33:26 +0200 |
---|---|---|
committer | Quentin Dufour <quentin@deuxfleurs.fr> | 2021-05-14 22:33:26 +0200 |
commit | 5fdabf3e75ba16b5ceed99edb1912cb001765d03 (patch) | |
tree | d9288733c910cfac9217668b0d9b8360d72ab4e8 | |
parent | 6ccffc316228bb056fa135cc5fceb2ed75f545f5 (diff) | |
download | garage-5fdabf3e75ba16b5ceed99edb1912cb001765d03.tar.gz garage-5fdabf3e75ba16b5ceed99edb1912cb001765d03.zip |
Add basic support for the "Versioning" command
-rw-r--r-- | src/api/api_server.rs | 3 | ||||
-rw-r--r-- | src/api/s3_bucket.rs | 13 | ||||
-rw-r--r-- | src/api/s3_xml.rs | 32 |
3 files changed, 48 insertions, 0 deletions
diff --git a/src/api/api_server.rs b/src/api/api_server.rs index 40862eb7..52031ae0 100644 --- a/src/api/api_server.rs +++ b/src/api/api_server.rs @@ -221,6 +221,9 @@ async fn handler_inner(garage: Arc<Garage>, req: Request<Body>) -> Result<Respon if params.contains_key("location") { // GetBucketLocation call Ok(handle_get_bucket_location(garage)?) + } else if params.contains_key("versioning") { + // GetBucketVersioning + Ok(handle_get_bucket_versioning()?) } else { // ListObjects or ListObjectsV2 query let q = parse_list_objects_query(bucket, ¶ms)?; diff --git a/src/api/s3_bucket.rs b/src/api/s3_bucket.rs index 88d13cac..c8bbc51b 100644 --- a/src/api/s3_bucket.rs +++ b/src/api/s3_bucket.rs @@ -21,6 +21,19 @@ pub fn handle_get_bucket_location(garage: Arc<Garage>) -> Result<Response<Body>, .body(Body::from(xml.into_bytes()))?) } +pub fn handle_get_bucket_versioning() -> Result<Response<Body>, Error> { + let versioning = s3_xml::VersioningConfiguration { + xmlns: (), + status: None, + }; + + let xml = s3_xml::to_xml_with_header(&versioning)?; + + Ok(Response::builder() + .header("Content-Type", "application/xml") + .body(Body::from(xml.into_bytes()))?) +} + pub fn handle_list_buckets(api_key: &Key) -> Result<Response<Body>, Error> { let list_buckets = s3_xml::ListAllMyBucketsResult { owner: s3_xml::Owner { diff --git a/src/api/s3_xml.rs b/src/api/s3_xml.rs index ba9b9083..f0547961 100644 --- a/src/api/s3_xml.rs +++ b/src/api/s3_xml.rs @@ -195,6 +195,14 @@ pub struct ListBucketResult { pub common_prefixes: Vec<CommonPrefix>, } +#[derive(Debug, Serialize, PartialEq)] +pub struct VersioningConfiguration { + #[serde(serialize_with = "xmlns_tag")] + pub xmlns: (), + #[serde(rename = "Status")] + pub status: Option<Value>, +} + #[cfg(test)] mod tests { use super::*; @@ -280,6 +288,30 @@ mod tests { } #[test] + fn get_bucket_versioning_result() -> Result<(), ApiError> { + let get_bucket_versioning = VersioningConfiguration { + xmlns: (), + status: None, + }; + assert_eq!( + to_xml_with_header(&get_bucket_versioning)?, + "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\ +<VersioningConfiguration xmlns=\"http://s3.amazonaws.com/doc/2006-03-01/\"/>" + ); + let get_bucket_versioning2 = VersioningConfiguration { + xmlns: (), + status: Some(Value("Suspended".to_string())), + }; + assert_eq!( + to_xml_with_header(&get_bucket_versioning2)?, + "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\ +<VersioningConfiguration xmlns=\"http://s3.amazonaws.com/doc/2006-03-01/\"><Status>Suspended</Status></VersioningConfiguration>" + ); + + Ok(()) + } + + #[test] fn delete_result() -> Result<(), ApiError> { let delete_result = DeleteResult { xmlns: (), |