aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQuentin Dufour <quentin@deuxfleurs.fr>2021-05-14 22:33:26 +0200
committerQuentin Dufour <quentin@deuxfleurs.fr>2021-05-14 22:33:26 +0200
commit5fdabf3e75ba16b5ceed99edb1912cb001765d03 (patch)
treed9288733c910cfac9217668b0d9b8360d72ab4e8
parent6ccffc316228bb056fa135cc5fceb2ed75f545f5 (diff)
downloadgarage-5fdabf3e75ba16b5ceed99edb1912cb001765d03.tar.gz
garage-5fdabf3e75ba16b5ceed99edb1912cb001765d03.zip
Add basic support for the "Versioning" command
-rw-r--r--src/api/api_server.rs3
-rw-r--r--src/api/s3_bucket.rs13
-rw-r--r--src/api/s3_xml.rs32
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, &params)?;
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: (),