Skip to content

Commit 599f941

Browse files
authored
fix: disable low-level Multipart Upload in Async client (#461)
1 parent 1cdbebf commit 599f941

File tree

2 files changed

+56
-2
lines changed

2 files changed

+56
-2
lines changed

src/main/java/software/amazon/encryption/s3/S3AsyncEncryptionClient.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@
2020
import software.amazon.awssdk.services.s3.S3AsyncClientBuilder;
2121
import software.amazon.awssdk.services.s3.S3Configuration;
2222
import software.amazon.awssdk.services.s3.internal.crt.S3CrtAsyncClient;
23+
import software.amazon.awssdk.services.s3.model.CompleteMultipartUploadRequest;
24+
import software.amazon.awssdk.services.s3.model.CompleteMultipartUploadResponse;
25+
import software.amazon.awssdk.services.s3.model.CreateMultipartUploadRequest;
26+
import software.amazon.awssdk.services.s3.model.CreateMultipartUploadResponse;
2327
import software.amazon.awssdk.services.s3.model.DeleteObjectRequest;
2428
import software.amazon.awssdk.services.s3.model.DeleteObjectResponse;
2529
import software.amazon.awssdk.services.s3.model.DeleteObjectsRequest;
@@ -30,6 +34,8 @@
3034
import software.amazon.awssdk.services.s3.model.PutObjectRequest;
3135
import software.amazon.awssdk.services.s3.model.PutObjectResponse;
3236
import software.amazon.awssdk.services.s3.model.S3Request;
37+
import software.amazon.awssdk.services.s3.model.UploadPartRequest;
38+
import software.amazon.awssdk.services.s3.model.UploadPartResponse;
3339
import software.amazon.awssdk.services.s3.multipart.MultipartConfiguration;
3440
import software.amazon.encryption.s3.internal.GetEncryptedObjectPipeline;
3541
import software.amazon.encryption.s3.internal.InstructionFileConfig;
@@ -256,6 +262,24 @@ public CompletableFuture<DeleteObjectsResponse> deleteObjects(DeleteObjectsReque
256262
.build());
257263
}
258264

265+
@Override
266+
public CompletableFuture<CreateMultipartUploadResponse> createMultipartUpload(CreateMultipartUploadRequest createMultipartUploadRequest) {
267+
throw new UnsupportedOperationException("The S3 Async Encryption Client does not support low-level multipart uploads. " +
268+
"Please use Multipart PutObject or the default (synchronous) client to use this API.");
269+
}
270+
271+
@Override
272+
public CompletableFuture<UploadPartResponse> uploadPart(UploadPartRequest uploadPartRequest, AsyncRequestBody asyncRequestBody) {
273+
throw new UnsupportedOperationException("The S3 Async Encryption Client does not support low-level multipart uploads. " +
274+
"Please use Multipart PutObject or the default (synchronous) client to use this API.");
275+
}
276+
277+
@Override
278+
public CompletableFuture<CompleteMultipartUploadResponse> completeMultipartUpload(CompleteMultipartUploadRequest completeMultipartUploadRequest) {
279+
throw new UnsupportedOperationException("The S3 Async Encryption Client does not support low-level multipart uploads. " +
280+
"Please use Multipart PutObject or the default (synchronous) client to use this API.");
281+
}
282+
259283
/**
260284
* Closes the wrapped {@link S3AsyncClient} instance.
261285
*/

src/test/java/software/amazon/encryption/s3/S3AsyncEncryptionClientTest.java

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -910,16 +910,46 @@ public void wrappedClientMultipartUploadThrowsException() throws IOException {
910910
}
911911

912912
@Test
913-
public void S3AsyncClientBuilderForbidsMultipartEnabled() throws IOException {
913+
public void s3AsyncClientBuilderForbidsMultipartEnabled() {
914914
assertThrows(
915915
UnsupportedOperationException.class,
916916
() -> S3AsyncEncryptionClient.builder().multipartEnabled(Boolean.TRUE));
917917
}
918918

919919
@Test
920-
public void S3AsyncClientBuilderForbidsMultipartConfiguration() throws IOException {
920+
public void s3AsyncClientBuilderForbidsMultipartConfiguration() {
921921
assertThrows(
922922
UnsupportedOperationException.class,
923923
() -> S3AsyncEncryptionClient.builder().multipartConfiguration(MultipartConfiguration.builder().build()));
924924
}
925+
926+
@Test
927+
public void s3AsyncClientForbidsCreateMultipartUpload() {
928+
S3AsyncClient s3AsyncClient = S3AsyncEncryptionClient.builder()
929+
.kmsKeyId("fails")
930+
.build();
931+
932+
assertThrows(UnsupportedOperationException.class, () -> s3AsyncClient.createMultipartUpload(builder -> builder.bucket(BUCKET).key("expected-fail").build()).join());
933+
s3AsyncClient.close();
934+
}
935+
936+
@Test
937+
public void s3AsyncClientForbidsUploadPart() {
938+
S3AsyncClient s3AsyncClient = S3AsyncEncryptionClient.builder()
939+
.kmsKeyId("fails")
940+
.build();
941+
942+
assertThrows(UnsupportedOperationException.class, () -> s3AsyncClient.uploadPart(builder -> builder.uploadId("fail").build(), AsyncRequestBody.fromString("fail")).join());
943+
s3AsyncClient.close();
944+
}
945+
946+
@Test
947+
public void s3AsyncClientForbidsCompleteMultipartUpload() {
948+
S3AsyncClient s3AsyncClient = S3AsyncEncryptionClient.builder()
949+
.kmsKeyId("fails")
950+
.build();
951+
952+
assertThrows(UnsupportedOperationException.class, () -> s3AsyncClient.completeMultipartUpload(builder -> builder.uploadId("fail").build()).join());
953+
s3AsyncClient.close();
954+
}
925955
}

0 commit comments

Comments
 (0)