From 27eaa9410a5668a7c05d675870658780501eced0 Mon Sep 17 00:00:00 2001 From: Moritz Becker Date: Wed, 2 Oct 2024 19:00:31 +0200 Subject: [PATCH] Do not apply `ObjectMetadata#contentLength` for `UploadPartRequest` (#1249) Fixes #1248 --- .../io/awspring/cloud/s3/ObjectMetadata.java | 3 --- .../cloud/s3/ObjectMetadataTests.java | 14 ++++++++++++ .../cloud/s3/S3ResourceIntegrationTests.java | 22 +++++++++++++++++++ 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/spring-cloud-aws-s3/src/main/java/io/awspring/cloud/s3/ObjectMetadata.java b/spring-cloud-aws-s3/src/main/java/io/awspring/cloud/s3/ObjectMetadata.java index 8913910ac..95a3a51ea 100644 --- a/spring-cloud-aws-s3/src/main/java/io/awspring/cloud/s3/ObjectMetadata.java +++ b/spring-cloud-aws-s3/src/main/java/io/awspring/cloud/s3/ObjectMetadata.java @@ -340,9 +340,6 @@ void apply(CreateMultipartUploadRequest.Builder builder) { } void apply(UploadPartRequest.Builder builder) { - if (contentLength != null) { - builder.contentLength(contentLength); - } if (sseCustomerAlgorithm != null) { builder.sseCustomerAlgorithm(sseCustomerAlgorithm); } diff --git a/spring-cloud-aws-s3/src/test/java/io/awspring/cloud/s3/ObjectMetadataTests.java b/spring-cloud-aws-s3/src/test/java/io/awspring/cloud/s3/ObjectMetadataTests.java index 351fb9a4f..f6213dc3d 100644 --- a/spring-cloud-aws-s3/src/test/java/io/awspring/cloud/s3/ObjectMetadataTests.java +++ b/spring-cloud-aws-s3/src/test/java/io/awspring/cloud/s3/ObjectMetadataTests.java @@ -26,6 +26,7 @@ import software.amazon.awssdk.services.s3.model.RequestPayer; import software.amazon.awssdk.services.s3.model.ServerSideEncryption; import software.amazon.awssdk.services.s3.model.StorageClass; +import software.amazon.awssdk.services.s3.model.UploadPartRequest; /** * Unit tests for {@link ObjectMetadata}. @@ -78,4 +79,17 @@ void mapsEnumsToString() { assertThat(result.checksumAlgorithm()).isEqualTo(ChecksumAlgorithm.CRC32); } + @Test + void doesNotApplyContentLengthForPartUpload() { + long objectContentLength = 16L; + long partContentLength = 8L; + ObjectMetadata metadata = ObjectMetadata.builder().contentLength(objectContentLength).build(); + + UploadPartRequest.Builder builder = UploadPartRequest.builder().contentLength(partContentLength); + metadata.apply(builder); + UploadPartRequest result = builder.build(); + + assertThat(result.contentLength()).isEqualTo(partContentLength); + } + } diff --git a/spring-cloud-aws-s3/src/test/java/io/awspring/cloud/s3/S3ResourceIntegrationTests.java b/spring-cloud-aws-s3/src/test/java/io/awspring/cloud/s3/S3ResourceIntegrationTests.java index 765d30c93..599509340 100644 --- a/spring-cloud-aws-s3/src/test/java/io/awspring/cloud/s3/S3ResourceIntegrationTests.java +++ b/spring-cloud-aws-s3/src/test/java/io/awspring/cloud/s3/S3ResourceIntegrationTests.java @@ -218,6 +218,28 @@ void contentTypeCanBeResolvedForLargeFiles(S3OutputStreamProvider s3OutputStream assertThat(result.contentType()).isEqualTo("text/plain"); } + @TestAvailableOutputStreamProviders + void contentLengthCanBeSetForLargeFiles(S3OutputStreamProvider s3OutputStreamProvider) throws IOException { + int i = new Random().nextInt(); + S3Resource resource = s3Resource("s3://first-bucket/new-file" + i + ".txt", s3OutputStreamProvider); + int fileSize = DEFAULT_PART_SIZE * 2; + resource.setObjectMetadata(ObjectMetadata.builder().contentLength((long) fileSize).build()); + + // create file larger than single part size in multipart upload to make sure that file can be successfully + // uploaded in parts + File file = File.createTempFile("s3resource", "test"); + byte[] b = new byte[fileSize]; + new Random().nextBytes(b); + Files.write(b, file); + + try (OutputStream outputStream = resource.getOutputStream()) { + outputStream.write(Files.toByteArray(file)); + } + GetObjectResponse result = client + .getObject(request -> request.bucket("first-bucket").key("new-file" + i + ".txt").build()).response(); + assertThat(result.contentType()).isEqualTo("text/plain"); + } + @TestAvailableOutputStreamProviders void contentTypeCanBeResolvedForSmallFiles(S3OutputStreamProvider s3OutputStreamProvider) throws IOException { S3Resource resource = s3Resource("s3://first-bucket/new-file.txt", s3OutputStreamProvider);