Make use of bucket website configuration #182
2 changed files with 55 additions and 19 deletions
|
@ -305,6 +305,7 @@ async fn handler_inner(garage: Arc<Garage>, req: Request<Body>) -> Result<Respon
|
||||||
Endpoint::DeleteObjects { .. } => {
|
Endpoint::DeleteObjects { .. } => {
|
||||||
handle_delete_objects(garage, bucket_id, req, content_sha256).await
|
handle_delete_objects(garage, bucket_id, req, content_sha256).await
|
||||||
}
|
}
|
||||||
|
Endpoint::GetBucketWebsite { .. } => handle_get_website(garage, bucket_id).await,
|
||||||
Endpoint::PutBucketWebsite { .. } => {
|
Endpoint::PutBucketWebsite { .. } => {
|
||||||
handle_put_website(garage, bucket_id, req, content_sha256).await
|
handle_put_website(garage, bucket_id, req, content_sha256).await
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,9 +11,46 @@ use crate::signature::verify_signed_content;
|
||||||
use garage_model::bucket_table::*;
|
use garage_model::bucket_table::*;
|
||||||
use garage_model::garage::Garage;
|
use garage_model::garage::Garage;
|
||||||
use garage_table::*;
|
use garage_table::*;
|
||||||
use garage_util::crdt;
|
|
||||||
use garage_util::data::*;
|
use garage_util::data::*;
|
||||||
|
|
||||||
|
pub async fn handle_get_website(
|
||||||
|
garage: Arc<Garage>,
|
||||||
|
bucket_id: Uuid,
|
||||||
|
) -> Result<Response<Body>, Error> {
|
||||||
|
let bucket = garage
|
||||||
|
.bucket_table
|
||||||
|
.get(&EmptyKey, &bucket_id)
|
||||||
|
.await?
|
||||||
|
.ok_or(Error::NoSuchBucket)?;
|
||||||
|
|
||||||
|
let param = bucket
|
||||||
|
.params()
|
||||||
|
.ok_or_internal_error("Bucket should not be deleted at this point")?;
|
||||||
|
|
||||||
|
if let Some(website) = param.website_config.get() {
|
||||||
|
let wc = WebsiteConfiguration {
|
||||||
|
xmlns: (),
|
||||||
|
error_document: website.error_document.as_ref().map(|v| Key {
|
||||||
|
key: Value(v.to_string()),
|
||||||
|
}),
|
||||||
|
index_document: Some(Suffix {
|
||||||
|
suffix: Value(website.index_document.to_string()),
|
||||||
|
}),
|
||||||
|
redirect_all_requests_to: None,
|
||||||
|
routing_rules: None,
|
||||||
|
};
|
||||||
|
let xml = quick_xml::se::to_string(&wc)?;
|
||||||
|
Ok(Response::builder()
|
||||||
|
.status(StatusCode::OK)
|
||||||
|
.header(http::header::CONTENT_TYPE, "application/xml")
|
||||||
|
.body(Body::from(xml))?)
|
||||||
|
} else {
|
||||||
|
Ok(Response::builder()
|
||||||
|
.status(StatusCode::NO_CONTENT)
|
||||||
|
.body(Body::empty())?)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub async fn handle_delete_website(
|
pub async fn handle_delete_website(
|
||||||
garage: Arc<Garage>,
|
garage: Arc<Garage>,
|
||||||
bucket_id: Uuid,
|
bucket_id: Uuid,
|
||||||
|
@ -24,17 +61,16 @@ pub async fn handle_delete_website(
|
||||||
.await?
|
.await?
|
||||||
.ok_or(Error::NoSuchBucket)?;
|
.ok_or(Error::NoSuchBucket)?;
|
||||||
|
|
||||||
if let crdt::Deletable::Present(param) = &mut bucket.state {
|
let param = bucket
|
||||||
param.website_config.update(None);
|
.params_mut()
|
||||||
garage.bucket_table.insert(&bucket).await?;
|
.ok_or_internal_error("Bucket should not be deleted at this point")?;
|
||||||
} else {
|
|
||||||
unreachable!();
|
param.website_config.update(None);
|
||||||
}
|
garage.bucket_table.insert(&bucket).await?;
|
||||||
|
|
||||||
Ok(Response::builder()
|
Ok(Response::builder()
|
||||||
.status(StatusCode::NO_CONTENT)
|
.status(StatusCode::NO_CONTENT)
|
||||||
.body(Body::from(vec![]))
|
.body(Body::empty())?)
|
||||||
.unwrap())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn handle_put_website(
|
pub async fn handle_put_website(
|
||||||
|
@ -52,22 +88,21 @@ pub async fn handle_put_website(
|
||||||
.await?
|
.await?
|
||||||
.ok_or(Error::NoSuchBucket)?;
|
.ok_or(Error::NoSuchBucket)?;
|
||||||
|
|
||||||
|
let param = bucket
|
||||||
|
.params_mut()
|
||||||
|
.ok_or_internal_error("Bucket should not be deleted at this point")?;
|
||||||
|
|
||||||
let conf: WebsiteConfiguration = from_reader(&body as &[u8])?;
|
let conf: WebsiteConfiguration = from_reader(&body as &[u8])?;
|
||||||
conf.validate()?;
|
conf.validate()?;
|
||||||
|
|
||||||
if let crdt::Deletable::Present(param) = &mut bucket.state {
|
param
|
||||||
param
|
.website_config
|
||||||
.website_config
|
.update(Some(conf.into_garage_website_config()?));
|
||||||
.update(Some(conf.into_garage_website_config()?));
|
garage.bucket_table.insert(&bucket).await?;
|
||||||
garage.bucket_table.insert(&bucket).await?;
|
|
||||||
} else {
|
|
||||||
unreachable!();
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(Response::builder()
|
Ok(Response::builder()
|
||||||
.status(StatusCode::OK)
|
.status(StatusCode::OK)
|
||||||
.body(Body::from(vec![]))
|
.body(Body::empty())?)
|
||||||
.unwrap())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
|
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
|
||||||
|
|
Loading…
Reference in a new issue