diff options
Diffstat (limited to 'src/api')
-rw-r--r-- | src/api/error.rs | 37 | ||||
-rw-r--r-- | src/api/s3_website.rs | 24 |
2 files changed, 43 insertions, 18 deletions
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<M: AsRef<str>>(self, reason: M) -> Result<Self::S, Error>; } impl<T, E> OkOrBadRequest for Result<T, E> where E: std::fmt::Display, { - type S2 = Result<T, Error>; - fn ok_or_bad_request(self, reason: &'static str) -> Result<T, Error> { + type S = T; + fn ok_or_bad_request<M: AsRef<str>>(self, reason: M) -> Result<T, Error> { 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<T> OkOrBadRequest for Option<T> { - type S2 = Result<T, Error>; - fn ok_or_bad_request(self, reason: &'static str) -> Result<T, Error> { + type S = T; + fn ok_or_bad_request<M: AsRef<str>>(self, reason: M) -> Result<T, Error> { 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<M: AsRef<str>>(self, reason: M) -> Result<Self::S, Error>; } impl<T, E> OkOrInternalError for Result<T, E> where E: std::fmt::Display, { - type S2 = Result<T, Error>; - fn ok_or_internal_error(self, reason: &'static str) -> Result<T, Error> { + type S = T; + fn ok_or_internal_error<M: AsRef<str>>(self, reason: M) -> Result<T, Error> { match self { Ok(x) => Ok(x), Err(e) => Err(Error::InternalError(GarageError::Message(format!( "{}: {}", - reason, e + reason.as_ref(), + e )))), } } } impl<T> OkOrInternalError for Option<T> { - type S2 = Result<T, Error>; - fn ok_or_internal_error(self, reason: &'static str) -> Result<T, Error> { + type S = T; + fn ok_or_internal_error<M: AsRef<str>>(self, reason: M) -> Result<T, Error> { 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<WebsiteConfig, Error> { + 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 { |