Skip to content

new feature: support conditional copy for S3 #7599

@dentiny

Description

@dentiny

Feature Description

Hi team, I think S3 has already supported conditional copy via if-none-match / if-match header (same as conditional write request headers). But I don't think it's currently supported

pub async fn s3_copy_object(&self, from: &str, to: &str) -> Result<Response<Buffer>> {
let from = build_abs_path(&self.root, from);
let to = build_abs_path(&self.root, to);
let source = format!("{}/{}", self.bucket, percent_encode_path(&from));
let target = format!("{}/{}", self.endpoint, percent_encode_path(&to));
let mut req = Request::put(&target);
// Set SSE headers.
req = self.insert_sse_headers(req, true);
if let Some(v) = &self.server_side_encryption_customer_algorithm {
let mut v = v.clone();
v.set_sensitive(true);
req = req.header(
HeaderName::from_static(
constants::X_AMZ_COPY_SOURCE_SERVER_SIDE_ENCRYPTION_CUSTOMER_ALGORITHM,
),
v,
)
}
if let Some(v) = &self.server_side_encryption_customer_key {
let mut v = v.clone();
v.set_sensitive(true);
req = req.header(
HeaderName::from_static(
constants::X_AMZ_COPY_SOURCE_SERVER_SIDE_ENCRYPTION_CUSTOMER_KEY,
),
v,
)
}
if let Some(v) = &self.server_side_encryption_customer_key_md5 {
let mut v = v.clone();
v.set_sensitive(true);
req = req.header(
HeaderName::from_static(
constants::X_AMZ_COPY_SOURCE_SERVER_SIDE_ENCRYPTION_CUSTOMER_KEY_MD5,
),
v,
)
}
// Set request payer header if enabled.
req = self.insert_request_payer_header(req);
let req = req
// Inject operation to the request.
.extension(Operation::Copy)
.extension(ServiceOperation("CopyObject"))
.header(constants::X_AMZ_COPY_SOURCE, &source)
.body(Buffer::new())
.map_err(new_request_build_error)?;
self.send(req).await
}

Problem and Solution

Add support for conditional copy

Additional Context

No response

Are you willing to contribute to the development of this feature?

  • Yes, I am willing to contribute to the development of this feature.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestreleases-note/featThe PR implements a new feature or has a title that begins with "feat"services/s3

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions