aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Auvolat <alex@adnab.me>2022-01-24 12:03:57 +0100
committerAlex Auvolat <alex@adnab.me>2022-01-24 12:32:28 +0100
commit513a6b15f99983c2054b95c6a17cebf672dbd360 (patch)
tree6b6e8efdc96a2aeaeb2f9f91109c58e883a0ec39
parentea7fb901ebc316bba53d248a2f8bd7a3455f5791 (diff)
downloadgarage-bucket-cors.tar.gz
garage-bucket-cors.zip
Handle OPTIONS on website endpointbucket-cors
-rw-r--r--src/api/api_server.rs6
-rw-r--r--src/api/s3_cors.rs22
-rw-r--r--src/api/s3_website.rs11
-rw-r--r--src/web/web_server.rs10
4 files changed, 13 insertions, 36 deletions
diff --git a/src/api/api_server.rs b/src/api/api_server.rs
index c28e8832..e02b9204 100644
--- a/src/api/api_server.rs
+++ b/src/api/api_server.rs
@@ -156,7 +156,7 @@ async fn handler_inner(garage: Arc<Garage>, req: Request<Body>) -> Result<Respon
};
let resp = match endpoint {
- Endpoint::Options => handle_options(garage, &req, bucket_id).await,
+ Endpoint::Options => handle_options(&req, &bucket).await,
Endpoint::HeadObject { key, .. } => handle_head(garage, &req, bucket_id, &key).await,
Endpoint::GetObject { key, .. } => handle_get(garage, &req, bucket_id, &key).await,
Endpoint::UploadPart {
@@ -334,12 +334,12 @@ async fn handler_inner(garage: Arc<Garage>, req: Request<Body>) -> Result<Respon
Endpoint::DeleteObjects {} => {
handle_delete_objects(garage, bucket_id, req, content_sha256).await
}
- Endpoint::GetBucketWebsite {} => handle_get_website(garage, bucket_id).await,
+ Endpoint::GetBucketWebsite {} => handle_get_website(&bucket).await,
Endpoint::PutBucketWebsite {} => {
handle_put_website(garage, bucket_id, req, content_sha256).await
}
Endpoint::DeleteBucketWebsite {} => handle_delete_website(garage, bucket_id).await,
- Endpoint::GetBucketCors {} => handle_get_cors(garage, bucket_id).await,
+ Endpoint::GetBucketCors {} => handle_get_cors(&bucket).await,
Endpoint::PutBucketCors {} => handle_put_cors(garage, bucket_id, req, content_sha256).await,
Endpoint::DeleteBucketCors {} => handle_delete_cors(garage, bucket_id).await,
endpoint => Err(Error::NotImplemented(endpoint.name().to_owned())),
diff --git a/src/api/s3_cors.rs b/src/api/s3_cors.rs
index d23bf48d..cde66079 100644
--- a/src/api/s3_cors.rs
+++ b/src/api/s3_cors.rs
@@ -18,16 +18,7 @@ use garage_model::garage::Garage;
use garage_table::*;
use garage_util::data::*;
-pub async fn handle_get_cors(
- garage: Arc<Garage>,
- bucket_id: Uuid,
-) -> Result<Response<Body>, Error> {
- let bucket = garage
- .bucket_table
- .get(&EmptyKey, &bucket_id)
- .await?
- .ok_or(Error::NoSuchBucket)?;
-
+pub async fn handle_get_cors(bucket: &Bucket) -> Result<Response<Body>, Error> {
let param = bucket
.params()
.ok_or_internal_error("Bucket should not be deleted at this point")?;
@@ -109,16 +100,7 @@ pub async fn handle_put_cors(
.body(Body::empty())?)
}
-pub async fn handle_options(
- garage: Arc<Garage>,
- req: &Request<Body>,
- bucket_id: Uuid,
-) -> Result<Response<Body>, Error> {
- let bucket = garage
- .bucket_table
- .get(&EmptyKey, &bucket_id)
- .await?
- .ok_or(Error::NoSuchBucket)?;
+pub async fn handle_options(req: &Request<Body>, bucket: &Bucket) -> Result<Response<Body>, Error> {
let origin = req
.headers()
.get("Origin")
diff --git a/src/api/s3_website.rs b/src/api/s3_website.rs
index d5864fc8..9d1da905 100644
--- a/src/api/s3_website.rs
+++ b/src/api/s3_website.rs
@@ -13,16 +13,7 @@ use garage_model::garage::Garage;
use garage_table::*;
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)?;
-
+pub async fn handle_get_website(bucket: &Bucket) -> Result<Response<Body>, Error> {
let param = bucket
.params()
.ok_or_internal_error("Bucket should not be deleted at this point")?;
diff --git a/src/web/web_server.rs b/src/web/web_server.rs
index 491ffdd3..64112feb 100644
--- a/src/web/web_server.rs
+++ b/src/web/web_server.rs
@@ -13,7 +13,7 @@ use crate::error::*;
use garage_api::error::{Error as ApiError, OkOrBadRequest, OkOrInternalError};
use garage_api::helpers::{authority_to_host, host_to_bucket};
-use garage_api::s3_cors::{add_cors_headers, find_matching_cors_rule};
+use garage_api::s3_cors::{add_cors_headers, find_matching_cors_rule, handle_options};
use garage_api::s3_get::{handle_get, handle_head};
use garage_model::garage::Garage;
@@ -133,6 +133,7 @@ async fn serve_file(garage: Arc<Garage>, req: &Request<Body>) -> Result<Response
);
let ret_doc = match *req.method() {
+ Method::OPTIONS => handle_options(req, &bucket).await,
Method::HEAD => handle_head(garage.clone(), req, bucket_id, &key).await,
Method::GET => handle_get(garage.clone(), req, bucket_id, &key).await,
_ => Err(ApiError::BadRequest("HTTP method not supported".into())),
@@ -141,11 +142,14 @@ async fn serve_file(garage: Arc<Garage>, req: &Request<Body>) -> Result<Response
match ret_doc {
Err(error) => {
- // For a HEAD method, and for non-4xx errors,
+ // For a HEAD or OPTIONS method, and for non-4xx errors,
// we don't return the error document as content,
// we return above and just return the error message
// by relying on err_to_res that is called when we return an Err.
- if *req.method() == Method::HEAD || !error.http_status_code().is_client_error() {
+ if *req.method() == Method::HEAD
+ || *req.method() == Method::OPTIONS
+ || !error.http_status_code().is_client_error()
+ {
return Err(error);
}