use super::*;
impl BucketWarden {
pub(crate) fn dispatch_service_s3_http(
&mut self,
request: &S3HttpRequest,
method: &str,
) -> Result<S3HttpResponse, RuntimeError> {
if let Some(response) = self.dispatch_query_compat_http(request, method) {
return response;
}
if let Some(feature_id) = crate::s3_http::resolve_s3err_query_feature_id(&request.query) {
self.require_s3err_operator_access(&request.principal)?;
if feature_id.trim().is_empty() {
return Ok(general_error_response(
"InvalidRequest",
400,
"Missing x-bucketwarden-s3err-feature value.",
));
}
return Ok(self
.s3_service_specific_error_response(&feature_id)
.unwrap_or_else(|| {
general_error_response(
"InvalidRequest",
400,
"Unknown service-specific error feature.",
)
}));
}
let directory_control_host = header(&request.headers, "host")
.is_some_and(crate::s3_targets::is_directory_bucket_control_host);
match (method, None::<&str>, None::<&str>) {
("GET", None, None) if directory_control_host => {
let continuation_token =
request.query.get("continuation-token").map(String::as_str);
let max_directory_buckets = request
.query
.get("max-directory-buckets")
.map(|value| {
value
.parse::<usize>()
.map_err(|_| RuntimeError::InvalidListParameter {
name: "max-directory-buckets".to_string(),
value: value.clone(),
})
})
.transpose()?;
let result = self.list_directory_buckets(
&request.principal,
continuation_token,
max_directory_buckets,
)?;
Ok(xml_response(200, list_directory_buckets_xml(&result)))
}
("GET", None, None) => {
let buckets = self.list_buckets(&request.principal)?;
Ok(xml_response(200, list_buckets_xml(&buckets)))
}
_ => Ok(general_error_response(
"MethodNotAllowed",
405,
"The specified method is not allowed for this resource.",
)),
}
}
}