diff --git a/docs/design/core/presignedURL-Get/DecisionLog.md b/docs/design/core/presignedURL-Get/DecisionLog.md index 5d0e264fb3e..afd5b033a00 100644 --- a/docs/design/core/presignedURL-Get/DecisionLog.md +++ b/docs/design/core/presignedURL-Get/DecisionLog.md @@ -60,3 +60,12 @@ The team has decided to implement functionality only for S3 async client and def ### Decision Addressed Initially considered separate discovery request (bytes=0-0) followed by download, but decided to follow AWS Transfer Manager SEP specification using Range: bytes=0-{partSizeInBytes-1} to download first part AND discover total object size simultaneously from Content-Range header response. + +## Transfer Manager Integration Review: 08/19/2025 +**Attendees**: John Viegas, Zoe Wang, Dongie Agnir, Alex Woods, Bole Yi, Olivier Lepage Applin, Ran Vaknin, David Ho, Saranya Somepalli + +### Decisions Addressed + +1. **API Names**: Finalize `downloadWithPresignedUrl` and `downloadFileWithPresignedUrl` for Transfer Manager methods during Surface API Review later. + +2. **Pause/Resume Support**: Decided not to support pause/resume capability for presigned URL downloads, maintaining consistency with AWS SDK for Java v1 which also lacks this feature for presigned URLs. diff --git a/docs/design/core/presignedURL-Get/Design.md b/docs/design/core/presignedURL-Get/Design.md index e91b8112848..d2cd1f69122 100644 --- a/docs/design/core/presignedURL-Get/Design.md +++ b/docs/design/core/presignedURL-Get/Design.md @@ -118,6 +118,45 @@ public final class PresignedUrlDownloadRequest } ``` +## Transfer Manager Integration + +The S3TransferManager extends support for presigned URL downloads, providing high-level benefits like progress tracking and multipart optimization while building on the existing AsyncPresignedUrlExtension infrastructure. + +### New Transfer Manager APIs + +```java +// File-based presigned URL download +FileDownload download = transferManager.downloadFileWithPresignedUrl( + PresignedDownloadFileRequest.builder() + .presignedUrlDownloadRequest(PresignedUrlDownloadRequest.builder() + .presignedUrl(presignedUrl) + .build()) + .destination(Paths.get("downloaded-file.txt")) + .addTransferListener(LoggingTransferListener.create()) + .build()); + +// Generic download with custom response transformer +Download> download = transferManager.downloadWithPresignedUrl( + PresignedDownloadRequest.builder() + .presignedUrlDownloadRequest(PresignedUrlDownloadRequest.builder() + .presignedUrl(presignedUrl) + .build()) + .responseTransformer(AsyncResponseTransformer.toBytes()) + .build()); +``` + +### Key Features + +- **Progress Tracking**: Full TransferListener support with bytesTransferred callbacks +- **Multipart Downloads**: Automatic multipart for large objects using HTTP Range headers +- **Consistent API**: Same FileDownload/Download return types as regular transfers +- **Error Handling**: Comprehensive validation of Content-Range headers and response integrity + +### Limitations + +- **No Pause/Resume**: Presigned URL downloads do not support pause/resume functionality due to URL expiration and authentication constraints +- **S3CrtTransferManager**: Not supported due to signing conflicts with presigned URLs + ## FAQ ### Why don't we implement presigned URL download/GET feature directly on the S3AsyncClient?