forked from Deuxfleurs/garage
add routing for Post Object
This commit is contained in:
parent
e312ba977e
commit
c5447a9c6f
2 changed files with 19 additions and 5 deletions
|
@ -92,11 +92,6 @@ async fn handler(
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn handler_inner(garage: Arc<Garage>, req: Request<Body>) -> Result<Response<Body>, Error> {
|
async fn handler_inner(garage: Arc<Garage>, req: Request<Body>) -> Result<Response<Body>, Error> {
|
||||||
let (api_key, content_sha256) = check_payload_signature(&garage, &req).await?;
|
|
||||||
let api_key = api_key.ok_or_else(|| {
|
|
||||||
Error::Forbidden("Garage does not support anonymous access yet".to_string())
|
|
||||||
})?;
|
|
||||||
|
|
||||||
let authority = req
|
let authority = req
|
||||||
.headers()
|
.headers()
|
||||||
.get(header::HOST)
|
.get(header::HOST)
|
||||||
|
@ -115,6 +110,17 @@ async fn handler_inner(garage: Arc<Garage>, req: Request<Body>) -> Result<Respon
|
||||||
let (endpoint, bucket_name) = Endpoint::from_request(&req, bucket_name.map(ToOwned::to_owned))?;
|
let (endpoint, bucket_name) = Endpoint::from_request(&req, bucket_name.map(ToOwned::to_owned))?;
|
||||||
debug!("Endpoint: {:?}", endpoint);
|
debug!("Endpoint: {:?}", endpoint);
|
||||||
|
|
||||||
|
if let Endpoint::PostObject {} = endpoint {
|
||||||
|
return Err(Error::NotImplemented(
|
||||||
|
"POST object is not supported yet".to_owned(),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
let (api_key, content_sha256) = check_payload_signature(&garage, &req).await?;
|
||||||
|
let api_key = api_key.ok_or_else(|| {
|
||||||
|
Error::Forbidden("Garage does not support anonymous access yet".to_string())
|
||||||
|
})?;
|
||||||
|
|
||||||
let bucket_name = match bucket_name {
|
let bucket_name = match bucket_name {
|
||||||
None => return handle_request_without_bucket(garage, req, api_key, endpoint).await,
|
None => return handle_request_without_bucket(garage, req, api_key, endpoint).await,
|
||||||
Some(bucket) => bucket.to_string(),
|
Some(bucket) => bucket.to_string(),
|
||||||
|
|
|
@ -410,6 +410,12 @@ pub enum Endpoint {
|
||||||
part_number: u64,
|
part_number: u64,
|
||||||
upload_id: String,
|
upload_id: String,
|
||||||
},
|
},
|
||||||
|
// This endpoint is not documented with others because it has special use case :
|
||||||
|
// It's intended to be used with HTML forms, using a multipart/form-data body.
|
||||||
|
// It works a lot like presigned requests, but everything is in the form instead
|
||||||
|
// of being query parameters of the URL, so authenticating it is a bit different.
|
||||||
|
PostObject {
|
||||||
|
},
|
||||||
}}
|
}}
|
||||||
|
|
||||||
impl Endpoint {
|
impl Endpoint {
|
||||||
|
@ -543,6 +549,7 @@ impl Endpoint {
|
||||||
UPLOADS => CreateMultipartUpload,
|
UPLOADS => CreateMultipartUpload,
|
||||||
],
|
],
|
||||||
no_key: [
|
no_key: [
|
||||||
|
EMPTY => PostObject,
|
||||||
DELETE => DeleteObjects,
|
DELETE => DeleteObjects,
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -1165,6 +1172,7 @@ mod tests {
|
||||||
POST "/{Key+}?restore&versionId=VersionId" => RestoreObject
|
POST "/{Key+}?restore&versionId=VersionId" => RestoreObject
|
||||||
PUT "/my-movie.m2ts?partNumber=1&uploadId=VCVsb2FkIElEIGZvciBlbZZpbmcncyBteS1tb3ZpZS5tMnRzIHVwbG9hZR" => UploadPart
|
PUT "/my-movie.m2ts?partNumber=1&uploadId=VCVsb2FkIElEIGZvciBlbZZpbmcncyBteS1tb3ZpZS5tMnRzIHVwbG9hZR" => UploadPart
|
||||||
PUT "/Key+?partNumber=2&uploadId=UploadId" => UploadPart
|
PUT "/Key+?partNumber=2&uploadId=UploadId" => UploadPart
|
||||||
|
POST "/" => PostObject
|
||||||
);
|
);
|
||||||
// no bucket, won't work with the rest of the test suite
|
// no bucket, won't work with the rest of the test suite
|
||||||
assert!(matches!(
|
assert!(matches!(
|
||||||
|
|
Loading…
Reference in a new issue