From d8ab5bdc3e20759e5ba8a6844393757da3539372 Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Wed, 22 Dec 2021 18:50:08 +0100 Subject: New buckets for 0.6.0: fix model and migration --- src/api/error.rs | 37 +++++++++++++++++++++---------------- src/api/s3_website.rs | 24 ++++++++++++++++++++++-- 2 files changed, 43 insertions(+), 18 deletions(-) (limited to 'src/api') diff --git a/src/api/error.rs b/src/api/error.rs index 9bb8f8e2..828a2342 100644 --- a/src/api/error.rs +++ b/src/api/error.rs @@ -156,62 +156,67 @@ impl Error { /// Trait to map error to the Bad Request error code pub trait OkOrBadRequest { - type S2; - fn ok_or_bad_request(self, reason: &'static str) -> Self::S2; + type S; + fn ok_or_bad_request>(self, reason: M) -> Result; } impl OkOrBadRequest for Result where E: std::fmt::Display, { - type S2 = Result; - fn ok_or_bad_request(self, reason: &'static str) -> Result { + type S = T; + fn ok_or_bad_request>(self, reason: M) -> Result { match self { Ok(x) => Ok(x), - Err(e) => Err(Error::BadRequest(format!("{}: {}", reason, e))), + Err(e) => Err(Error::BadRequest(format!( + "{}: {}", + reason.as_ref(), + e.to_string() + ))), } } } impl OkOrBadRequest for Option { - type S2 = Result; - fn ok_or_bad_request(self, reason: &'static str) -> Result { + type S = T; + fn ok_or_bad_request>(self, reason: M) -> Result { match self { Some(x) => Ok(x), - None => Err(Error::BadRequest(reason.to_string())), + None => Err(Error::BadRequest(reason.as_ref().to_string())), } } } /// Trait to map an error to an Internal Error code pub trait OkOrInternalError { - type S2; - fn ok_or_internal_error(self, reason: &'static str) -> Self::S2; + type S; + fn ok_or_internal_error>(self, reason: M) -> Result; } impl OkOrInternalError for Result where E: std::fmt::Display, { - type S2 = Result; - fn ok_or_internal_error(self, reason: &'static str) -> Result { + type S = T; + fn ok_or_internal_error>(self, reason: M) -> Result { match self { Ok(x) => Ok(x), Err(e) => Err(Error::InternalError(GarageError::Message(format!( "{}: {}", - reason, e + reason.as_ref(), + e )))), } } } impl OkOrInternalError for Option { - type S2 = Result; - fn ok_or_internal_error(self, reason: &'static str) -> Result { + type S = T; + fn ok_or_internal_error>(self, reason: M) -> Result { match self { Some(x) => Ok(x), None => Err(Error::InternalError(GarageError::Message( - reason.to_string(), + reason.as_ref().to_string(), ))), } } diff --git a/src/api/s3_website.rs b/src/api/s3_website.rs index e76afbf4..1ea57577 100644 --- a/src/api/s3_website.rs +++ b/src/api/s3_website.rs @@ -3,12 +3,12 @@ use std::sync::Arc; use hyper::{Body, Request, Response, StatusCode}; use serde::{Deserialize, Serialize}; -use serde_bytes::ByteBuf; use crate::error::*; use crate::s3_xml::{xmlns_tag, IntValue, Value}; use crate::signature::verify_signed_content; +use garage_model::bucket_table::*; use garage_model::garage::Garage; use garage_table::*; use garage_util::crdt; @@ -58,7 +58,7 @@ pub async fn handle_put_website( if let crdt::Deletable::Present(param) = &mut bucket.state { param .website_config - .update(Some(ByteBuf::from(body.to_vec()))); + .update(Some(conf.into_garage_website_config()?)); garage.bucket_table.insert(&bucket).await?; } else { unreachable!(); @@ -168,6 +168,26 @@ impl WebsiteConfiguration { Ok(()) } + + pub fn into_garage_website_config(self) -> Result { + if let Some(rart) = self.redirect_all_requests_to { + Ok(WebsiteConfig::RedirectAll { + hostname: rart.hostname.0, + protocol: rart + .protocol + .map(|x| x.0) + .unwrap_or_else(|| "http".to_string()), + }) + } else { + Ok(WebsiteConfig::Website { + index_document: self + .index_document + .map(|x| x.suffix.0) + .unwrap_or_else(|| "index.html".to_string()), + error_document: self.error_document.map(|x| x.key.0), + }) + } + } } impl Key { -- cgit v1.2.3