bucketwarden-server 0.1.0

BucketWarden storage server runtime.
Documentation
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.",
            )),
        }
    }
}