use super::*;
impl BucketWarden {
pub(crate) fn dispatch_write_get_object_response_http(
&mut self,
request: S3HttpRequest,
method: &str,
) -> Result<S3HttpResponse, RuntimeError> {
if method != "POST" {
return Ok(general_error_response(
"MethodNotAllowed",
405,
"The specified method is not allowed for this resource.",
));
}
let write_request = parse_write_get_object_response_request(&request)?;
self.write_get_object_response(&request.principal, write_request)?;
Ok(S3HttpResponse::new(200))
}
}
fn parse_write_get_object_response_request(
request: &S3HttpRequest,
) -> Result<WriteGetObjectResponseRequest, RuntimeError> {
let request_route = header(&request.headers, "x-amz-request-route")
.ok_or_else(|| {
RuntimeError::InvalidEncryption(
"WriteGetObjectResponse requires x-amz-request-route".to_string(),
)
})?
.to_string();
let request_token = header(&request.headers, "x-amz-request-token")
.ok_or_else(|| {
RuntimeError::InvalidEncryption(
"WriteGetObjectResponse requires x-amz-request-token".to_string(),
)
})?
.to_string();
let status_code = header(&request.headers, "x-amz-fwd-status")
.map(|value| {
value.parse::<u16>().map_err(|_| {
RuntimeError::InvalidEncryption(
"WriteGetObjectResponse requires a valid x-amz-fwd-status value".to_string(),
)
})
})
.transpose()?;
let mut user_metadata = BTreeMap::new();
for (name, value) in &request.headers {
if let Some(key) = name.strip_prefix("x-amz-meta-") {
user_metadata.insert(key.to_string(), value.clone());
}
}
Ok(WriteGetObjectResponseRequest {
request_route,
request_token,
status_code,
error_code: header(&request.headers, "x-amz-fwd-error-code").map(str::to_string),
error_message: header(&request.headers, "x-amz-fwd-error-message").map(str::to_string),
content_type: header(&request.headers, "x-amz-fwd-header-content-type").map(str::to_string),
content_encoding: header(&request.headers, "x-amz-fwd-header-content-encoding")
.map(str::to_string),
user_metadata,
body: request.body.clone(),
})
}