Skip to content

Commit edd142e

Browse files
committed
Add crt implementation of upload to support progress
1 parent 1d86fde commit edd142e

File tree

2 files changed

+51
-1
lines changed

2 files changed

+51
-1
lines changed

services-custom/s3-transfer-manager/src/main/java/software/amazon/awssdk/transfer/s3/internal/CrtS3TransferManager.java

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import static software.amazon.awssdk.services.s3.crt.S3CrtSdkHttpExecutionAttribute.CRT_PROGRESS_LISTENER;
2020
import static software.amazon.awssdk.services.s3.crt.S3CrtSdkHttpExecutionAttribute.METAREQUEST_PAUSE_OBSERVABLE;
2121
import static software.amazon.awssdk.services.s3.internal.crt.S3InternalSdkHttpExecutionAttribute.CRT_PAUSE_RESUME_TOKEN;
22+
import static software.amazon.awssdk.services.s3.multipart.S3MultipartExecutionAttribute.JAVA_PROGRESS_LISTENER;
2223

2324
import java.util.concurrent.CompletableFuture;
2425
import java.util.function.Consumer;
@@ -33,11 +34,15 @@
3334
import software.amazon.awssdk.services.s3.model.PutObjectResponse;
3435
import software.amazon.awssdk.transfer.s3.S3TransferManager;
3536
import software.amazon.awssdk.transfer.s3.internal.model.CrtFileUpload;
37+
import software.amazon.awssdk.transfer.s3.internal.model.DefaultUpload;
3638
import software.amazon.awssdk.transfer.s3.internal.progress.TransferProgressUpdater;
3739
import software.amazon.awssdk.transfer.s3.model.CompletedFileUpload;
40+
import software.amazon.awssdk.transfer.s3.model.CompletedUpload;
3841
import software.amazon.awssdk.transfer.s3.model.FileUpload;
3942
import software.amazon.awssdk.transfer.s3.model.ResumableFileUpload;
43+
import software.amazon.awssdk.transfer.s3.model.Upload;
4044
import software.amazon.awssdk.transfer.s3.model.UploadFileRequest;
45+
import software.amazon.awssdk.transfer.s3.model.UploadRequest;
4146
import software.amazon.awssdk.utils.CompletableFutureUtils;
4247
import software.amazon.awssdk.utils.Validate;
4348

@@ -54,6 +59,51 @@ class CrtS3TransferManager extends GenericS3TransferManager {
5459
this.s3AsyncClient = s3AsyncClient;
5560
}
5661

62+
@Override
63+
public final Upload upload(UploadRequest uploadRequest) {
64+
Validate.paramNotNull(uploadRequest, "uploadRequest");
65+
66+
AsyncRequestBody requestBody = uploadRequest.requestBody();
67+
68+
CompletableFuture<CompletedUpload> returnFuture = new CompletableFuture<>();
69+
70+
TransferProgressUpdater progressUpdater = new TransferProgressUpdater(uploadRequest,
71+
requestBody.contentLength().orElse(null));
72+
progressUpdater.transferInitiated();
73+
// requestBody = progressUpdater.wrapRequestBody(requestBody);
74+
progressUpdater.registerCompletion(returnFuture);
75+
76+
S3MetaRequestPauseObservable observable = new S3MetaRequestPauseObservable();
77+
78+
Consumer<SdkHttpExecutionAttributes.Builder> attachObservable =
79+
b -> b.put(METAREQUEST_PAUSE_OBSERVABLE, observable)
80+
.put(CRT_PROGRESS_LISTENER, progressUpdater.crtProgressListener());
81+
82+
PutObjectRequest putObjectRequest = attachCrtSdkAttribute(uploadRequest.putObjectRequest(), attachObservable);
83+
84+
progressUpdater.transferInitiated();
85+
progressUpdater.registerCompletion(returnFuture);
86+
87+
try {
88+
assertNotUnsupportedArn(uploadRequest.putObjectRequest().bucket(), "upload");
89+
90+
CompletableFuture<PutObjectResponse> future =
91+
s3AsyncClient.putObject(putObjectRequest, requestBody);
92+
93+
// Forward upload cancellation to future
94+
CompletableFutureUtils.forwardExceptionTo(returnFuture, future);
95+
96+
CompletableFutureUtils.forwardTransformedResultTo(future, returnFuture,
97+
r -> CompletedUpload.builder()
98+
.response(r)
99+
.build());
100+
} catch (Throwable throwable) {
101+
returnFuture.completeExceptionally(throwable);
102+
}
103+
104+
return new DefaultUpload(returnFuture, progressUpdater.progress());
105+
}
106+
57107
@Override
58108
public FileUpload uploadFile(UploadFileRequest uploadFileRequest) {
59109
Validate.paramNotNull(uploadFileRequest, "uploadFileRequest");

services-custom/s3-transfer-manager/src/main/java/software/amazon/awssdk/transfer/s3/internal/GenericS3TransferManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ class GenericS3TransferManager implements S3TransferManager {
128128
}
129129

130130
@Override
131-
public final Upload upload(UploadRequest uploadRequest) {
131+
public Upload upload(UploadRequest uploadRequest) {
132132
Validate.paramNotNull(uploadRequest, "uploadRequest");
133133

134134
AsyncRequestBody requestBody = uploadRequest.requestBody();

0 commit comments

Comments
 (0)