11package software .amazon .encryption .s3 .internal ;
22
3+ import java .time .Instant ;
4+ import java .util .Map ;
5+
6+ import org .apache .commons .logging .LogFactory ;
37import software .amazon .awssdk .services .s3 .model .ChecksumType ;
8+ import software .amazon .awssdk .services .s3 .model .CompleteMultipartUploadResponse ;
49import software .amazon .awssdk .services .s3 .model .CreateMultipartUploadRequest ;
510import software .amazon .awssdk .services .s3 .model .PutObjectRequest ;
6- import java .time .Instant ;
7- import java .util .Map ;
11+ import software .amazon .awssdk .services .s3 .model .PutObjectResponse ;
812
913public class ConvertSDKRequests {
1014
11- public static CreateMultipartUploadRequest convert (PutObjectRequest request ) {
15+ public static CreateMultipartUploadRequest convertRequest (PutObjectRequest request ) {
1216
1317 final CreateMultipartUploadRequest .Builder output = CreateMultipartUploadRequest .builder ();
1418 request
@@ -121,7 +125,16 @@ public static CreateMultipartUploadRequest convert(PutObjectRequest request) {
121125 default :
122126 // Rather than silently dropping the value,
123127 // we loudly signal that we don't know how to handle this field.
124- throw new IllegalArgumentException ("Unknown PutObjectRequest field " + f .locationName () + "." );
128+ throw new IllegalArgumentException (
129+ f .locationName () + " is an unknown field. " +
130+ "The S3 Encryption Client does not recognize this option and cannot set it on the CreateMultipartUploadRequest." +
131+ "This may be a new S3 feature." +
132+ "Please report this to the Amazon S3 Encryption Client for Java: " +
133+ "https://github.com/aws/amazon-s3-encryption-client-java/issues." +
134+ "To work around this issue you can disable multi part upload," +
135+ "use the Async client, or not set this value on PutObject." +
136+ "You may be able to update this value after the PutObject request completes."
137+ );
125138 }
126139 }
127140 });
@@ -131,6 +144,77 @@ public static CreateMultipartUploadRequest convert(PutObjectRequest request) {
131144 .build ();
132145 }
133146
147+ public static PutObjectResponse convertResponse (CompleteMultipartUploadResponse response ) {
148+ final PutObjectResponse .Builder output = PutObjectResponse .builder ();
149+ response
150+ .toBuilder ()
151+ .sdkFields ()
152+ .forEach (f -> {
153+ final Object value = f .getValueOrDefault (response );
154+ if (value != null ) {
155+ switch (f .memberName ()) {
156+ case "ETag" :
157+ output .eTag ((String ) value );
158+ break ;
159+ case "Expiration" :
160+ output .expiration ((String ) value );
161+ break ;
162+ case "ChecksumCRC32" :
163+ output .checksumCRC32 ((String ) value );
164+ break ;
165+ case "ChecksumCRC32C" :
166+ output .checksumCRC32C ((String ) value );
167+ break ;
168+ case "ChecksumCRC64NVME" :
169+ output .checksumCRC64NVME ((String ) value );
170+ break ;
171+ case "ChecksumSHA1" :
172+ output .checksumSHA1 ((String ) value );
173+ break ;
174+ case "ChecksumSHA256" :
175+ output .checksumSHA256 ((String ) value );
176+ break ;
177+ case "ChecksumType" :
178+ output .checksumType ((String ) value );
179+ break ;
180+ case "ServerSideEncryption" :
181+ output .serverSideEncryption ((String ) value );
182+ break ;
183+ case "VersionId" :
184+ output .versionId ((String ) value );
185+ break ;
186+ case "SSEKMSKeyId" :
187+ output .ssekmsKeyId ((String ) value );
188+ break ;
189+ case "BucketKeyEnabled" :
190+ output .bucketKeyEnabled ((Boolean ) value );
191+ break ;
192+ case "RequestCharged" :
193+ output .requestCharged ((String ) value );
194+ break ;
195+ // Ignored fields: Location, Bucket, Key
196+ case "Location" :
197+ case "Bucket" :
198+ case "Key" :
199+ // These fields exist only in CompleteMultipartUploadResponse, not in PutObjectResponse
200+ break ;
201+ default :
202+ // We should NOT throw an exception for unknown fields because
203+ // once the object is stored, we expect to return a successful response.
204+ // Emit a log at info level for awareness.
205+ LogFactory .getLog (ConvertSDKRequests .class ).info (f .memberName () + " returned in CompleteMultipartUploadResponse for "
206+ + response .key () + " is an unknown field." +
207+ "The S3 Encryption Client does not recognize this option and cannot set it on the CompleteMultipartUploadResponse." +
208+ "This may be a new S3 feature." +
209+ "Please report this to the Amazon S3 Encryption Client for Java: " +
210+ "https://github.com/aws/amazon-s3-encryption-client-java/issues."
211+ );
212+ }
213+ }
214+ });
215+ return output .build ();
216+ }
217+
134218 private static boolean isStringStringMap (Object value ) {
135219 if (!(value instanceof Map )) {
136220 return false ;
0 commit comments