Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions docs/design/core/presignedURL-Get/DecisionLog.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
39 changes: 39 additions & 0 deletions docs/design/core/presignedURL-Get/Design.md
Original file line number Diff line number Diff line change
Expand Up @@ -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<ResponseBytes<GetObjectResponse>> 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?
Expand Down