bucketwarden-server 0.1.0

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