diff options
author | Alex Auvolat <alex@adnab.me> | 2022-01-24 12:03:57 +0100 |
---|---|---|
committer | Alex Auvolat <alex@adnab.me> | 2022-01-24 12:32:28 +0100 |
commit | 513a6b15f99983c2054b95c6a17cebf672dbd360 (patch) | |
tree | 6b6e8efdc96a2aeaeb2f9f91109c58e883a0ec39 | |
parent | ea7fb901ebc316bba53d248a2f8bd7a3455f5791 (diff) | |
download | garage-bucket-cors.tar.gz garage-bucket-cors.zip |
Handle OPTIONS on website endpointbucket-cors
-rw-r--r-- | src/api/api_server.rs | 6 | ||||
-rw-r--r-- | src/api/s3_cors.rs | 22 | ||||
-rw-r--r-- | src/api/s3_website.rs | 11 | ||||
-rw-r--r-- | src/web/web_server.rs | 10 |
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); } |