diff --git a/generator/.DevConfigs/7f23582e-3225-487b-83e7-167cf17cb231.json b/generator/.DevConfigs/7f23582e-3225-487b-83e7-167cf17cb231.json
new file mode 100644
index 000000000000..564bb1cd65d5
--- /dev/null
+++ b/generator/.DevConfigs/7f23582e-3225-487b-83e7-167cf17cb231.json
@@ -0,0 +1,11 @@
+{
+ "services": [
+ {
+ "serviceName": "S3",
+ "type": "patch",
+ "changeLogMessages": [
+ "Add GetObjectResponse to TransferUtilityDownloadResponse mapping."
+ ]
+ }
+ ]
+}
diff --git a/sdk/src/Services/S3/Custom/Transfer/Internal/ResponseMapper.cs b/sdk/src/Services/S3/Custom/Transfer/Internal/ResponseMapper.cs
index 7e8505ecbf69..bce420599b2d 100644
--- a/sdk/src/Services/S3/Custom/Transfer/Internal/ResponseMapper.cs
+++ b/sdk/src/Services/S3/Custom/Transfer/Internal/ResponseMapper.cs
@@ -20,6 +20,7 @@
*
*/
+using System.Collections.Generic;
using Amazon.S3.Model;
namespace Amazon.S3.Transfer.Internal
@@ -160,6 +161,125 @@ internal static TransferUtilityUploadResponse MapCompleteMultipartUploadResponse
return response;
}
+
+ ///
+ /// Maps a GetObjectResponse to TransferUtilityDownloadResponse.
+ /// Uses the field mappings defined in mapping.json "Conversion" -> "GetObjectResponse" -> "DownloadResponse".
+ ///
+ /// The GetObjectResponse to map from
+ /// A new TransferUtilityDownloadResponse with mapped fields
+ internal static TransferUtilityDownloadResponse MapGetObjectResponse(GetObjectResponse source)
+ {
+ if (source == null)
+ return null;
+
+ var response = new TransferUtilityDownloadResponse();
+
+ // Map all fields as defined in mapping.json "Conversion" -> "GetObjectResponse" -> "DownloadResponse"
+ if (source.IsSetAcceptRanges())
+ response.AcceptRanges = source.AcceptRanges;
+
+ if (source.IsSetBucketKeyEnabled())
+ response.BucketKeyEnabled = source.BucketKeyEnabled.GetValueOrDefault();
+
+ if (source.IsSetChecksumCRC32())
+ response.ChecksumCRC32 = source.ChecksumCRC32;
+
+ if (source.IsSetChecksumCRC32C())
+ response.ChecksumCRC32C = source.ChecksumCRC32C;
+
+ if (source.IsSetChecksumCRC64NVME())
+ response.ChecksumCRC64NVME = source.ChecksumCRC64NVME;
+
+ if (source.IsSetChecksumSHA1())
+ response.ChecksumSHA1 = source.ChecksumSHA1;
+
+ if (source.IsSetChecksumSHA256())
+ response.ChecksumSHA256 = source.ChecksumSHA256;
+
+ if (source.IsSetChecksumType())
+ response.ChecksumType = source.ChecksumType;
+
+ if (source.IsSetContentRange())
+ response.ContentRange = source.ContentRange;
+
+ response.Headers = source.Headers;
+
+ if (source.IsSetDeleteMarker())
+ response.DeleteMarker = source.DeleteMarker;
+
+ if (source.IsSetETag())
+ response.ETag = source.ETag;
+
+ if (source.Expiration != null)
+ response.Expiration = source.Expiration;
+
+ if (source.ExpiresString != null)
+ response.ExpiresString = source.ExpiresString;
+
+ if (source.IsSetLastModified())
+ response.LastModified = source.LastModified;
+
+ if (source.Metadata != null)
+ response.Metadata = source.Metadata;
+
+ if (source.IsSetMissingMeta())
+ response.MissingMeta = source.MissingMeta;
+
+ if (source.IsSetObjectLockLegalHoldStatus())
+ response.ObjectLockLegalHoldStatus = source.ObjectLockLegalHoldStatus;
+
+ if (source.IsSetObjectLockMode())
+ response.ObjectLockMode = source.ObjectLockMode;
+
+ if (source.IsSetObjectLockRetainUntilDate())
+ response.ObjectLockRetainUntilDate = source.ObjectLockRetainUntilDate;
+
+ if (source.IsSetPartsCount())
+ response.PartsCount = source.PartsCount;
+
+ if (source.IsSetReplicationStatus())
+ response.ReplicationStatus = source.ReplicationStatus;
+
+ if (source.IsSetRequestCharged())
+ response.RequestCharged = source.RequestCharged;
+
+ if (source.RestoreExpiration.HasValue)
+ response.RestoreExpiration = source.RestoreExpiration;
+
+ if (source.RestoreInProgress.HasValue)
+ response.RestoreInProgress = source.RestoreInProgress;
+
+ if (source.ServerSideEncryptionCustomerMethod != null)
+ response.ServerSideEncryptionCustomerMethod = source.ServerSideEncryptionCustomerMethod;
+
+ if (source.ServerSideEncryptionCustomerProvidedKeyMD5 != null)
+ response.ServerSideEncryptionCustomerProvidedKeyMD5 = source.ServerSideEncryptionCustomerProvidedKeyMD5;
+
+ if (source.IsSetServerSideEncryptionKeyManagementServiceKeyId())
+ response.ServerSideEncryptionKeyManagementServiceKeyId = source.ServerSideEncryptionKeyManagementServiceKeyId;
+
+ if (source.IsSetServerSideEncryptionMethod())
+ response.ServerSideEncryptionMethod = source.ServerSideEncryptionMethod;
+
+ if (source.IsSetStorageClass())
+ response.StorageClass = source.StorageClass;
+
+ response.TagCount = source.TagCount;
+
+ if (source.IsSetVersionId())
+ response.VersionId = source.VersionId;
+
+ if (source.IsSetWebsiteRedirectLocation())
+ response.WebsiteRedirectLocation = source.WebsiteRedirectLocation;
+
+ // Copy response metadata
+ response.ResponseMetadata = source.ResponseMetadata;
+ response.ContentLength = source.ContentLength;
+ response.HttpStatusCode = source.HttpStatusCode;
+
+ return response;
+ }
}
}
diff --git a/sdk/src/Services/S3/Custom/Transfer/TransferUtilityDownloadResponse.cs b/sdk/src/Services/S3/Custom/Transfer/TransferUtilityDownloadResponse.cs
new file mode 100644
index 000000000000..d10c72f47c0f
--- /dev/null
+++ b/sdk/src/Services/S3/Custom/Transfer/TransferUtilityDownloadResponse.cs
@@ -0,0 +1,300 @@
+/*******************************************************************************
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ * Licensed under the Apache License, Version 2.0 (the "License"). You may not use
+ * this file except in compliance with the License. A copy of the License is located at
+ *
+ * http://aws.amazon.com/apache2.0
+ *
+ * or in the "license" file accompanying this file.
+ * This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+ * CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
+ * *****************************************************************************
+ * __ _ _ ___
+ * ( )( \/\/ )/ __)
+ * /__\ \ / \__ \
+ * (_)(_) \/\/ (___/
+ *
+ * AWS SDK for .NET
+ * API Version: 2006-03-01
+ *
+ */
+
+using System;
+using System.Collections.Generic;
+using Amazon.Runtime;
+using Amazon.S3.Model;
+
+namespace Amazon.S3.Transfer
+{
+ ///
+ /// Response object for Transfer Utility download operations.
+ /// Contains response metadata from download operations.
+ ///
+ public class TransferUtilityDownloadResponse : AmazonWebServiceResponse
+ {
+ ///
+ /// Gets and sets the AcceptRanges property.
+ ///
+ public string AcceptRanges { get; set; }
+
+ ///
+ /// Gets and sets the property BucketKeyEnabled.
+ ///
+ /// Indicates whether the object uses an S3 Bucket Key for server-side encryption with
+ /// Amazon Web Services KMS (SSE-KMS).
+ ///
+ ///
+ public bool? BucketKeyEnabled { get; set; }
+
+ ///
+ /// The collection of headers for the response.
+ ///
+ public HeadersCollection Headers { get; set; }
+
+ ///
+ /// Gets and sets the property ChecksumCRC32.
+ ///
+ /// The Base64 encoded, 32-bit CRC-32 checksum of the object.
+ ///
+ ///
+ public string ChecksumCRC32 { get; set; }
+
+ ///
+ /// Gets and sets the property ChecksumCRC32C.
+ ///
+ /// The Base64 encoded, 32-bit CRC-32C checksum of the object.
+ ///
+ ///
+ public string ChecksumCRC32C { get; set; }
+
+ ///
+ /// Gets and sets the property ChecksumCRC64NVME.
+ ///
+ /// The Base64 encoded, 64-bit CRC-64NVME checksum of the object.
+ ///
+ ///
+ public string ChecksumCRC64NVME { get; set; }
+
+ ///
+ /// Gets and sets the property ChecksumSHA1.
+ ///
+ /// The Base64 encoded, 160-bit SHA-1 digest of the object.
+ ///
+ ///
+ public string ChecksumSHA1 { get; set; }
+
+ ///
+ /// Gets and sets the property ChecksumSHA256.
+ ///
+ /// The Base64 encoded, 256-bit SHA-256 checksum of the object.
+ ///
+ ///
+ public string ChecksumSHA256 { get; set; }
+
+ ///
+ /// Gets and sets the property ChecksumType.
+ ///
+ /// The checksum type used to calculate the object-level checksum.
+ ///
+ ///
+ public ChecksumType ChecksumType { get; set; }
+
+ ///
+ /// Gets and sets the ContentRange property.
+ ///
+ public string ContentRange { get; set; }
+
+ ///
+ /// Gets and sets the DeleteMarker property.
+ ///
+ /// Specifies whether the object retrieved was (true) or was not (false) a Delete Marker.
+ ///
+ ///
+ public string DeleteMarker { get; set; }
+
+ ///
+ /// Gets and sets the ETag property.
+ ///
+ /// An ETag is an opaque identifier assigned by a web server to a specific version of a resource found at a URL.
+ ///
+ ///
+ public string ETag { get; set; }
+
+ ///
+ /// Gets and sets the property Expiration.
+ ///
+ /// If the object expiration is configured, this will contain the expiration date and rule ID.
+ ///
+ ///
+ public Expiration Expiration { get; set; }
+
+ ///
+ /// Gets and sets the ExpiresString property.
+ ///
+ /// The date and time at which the object is no longer cacheable (string format).
+ ///
+ ///
+ public string ExpiresString { get; set; }
+
+ ///
+ /// Gets and sets the property LastModified.
+ ///
+ /// Date and time when the object was last modified.
+ ///
+ ///
+ public DateTime? LastModified { get; set; }
+
+ ///
+ /// Gets and sets the Metadata property.
+ ///
+ /// The collection of metadata for the object.
+ ///
+ ///
+ public MetadataCollection Metadata { get; set; }
+
+ ///
+ /// Gets and sets the property MissingMeta.
+ ///
+ /// This is set to the number of metadata entries not returned in the headers that are
+ /// prefixed with x-amz-meta-.
+ ///
+ ///
+ public int? MissingMeta { get; set; }
+
+ ///
+ /// Gets and sets the property ObjectLockLegalHoldStatus.
+ ///
+ /// Indicates whether this object has an active legal hold.
+ ///
+ ///
+ public ObjectLockLegalHoldStatus ObjectLockLegalHoldStatus { get; set; }
+
+ ///
+ /// Gets and sets the property ObjectLockMode.
+ ///
+ /// The Object Lock mode that's currently in place for this object.
+ ///
+ ///
+ public ObjectLockMode ObjectLockMode { get; set; }
+
+ ///
+ /// Gets and sets the property ObjectLockRetainUntilDate.
+ ///
+ /// The date and time when this object's Object Lock will expire.
+ ///
+ ///
+ public DateTime? ObjectLockRetainUntilDate { get; set; }
+
+ ///
+ /// Gets and sets the PartsCount property.
+ ///
+ /// The number of parts this object has.
+ ///
+ ///
+ public int? PartsCount { get; set; }
+
+ ///
+ /// Gets and sets the property ReplicationStatus.
+ ///
+ /// Amazon S3 can return this if your request involves a bucket that is either a source
+ /// or destination in a replication rule.
+ ///
+ ///
+ public ReplicationStatus ReplicationStatus { get; set; }
+
+ ///
+ /// Gets and sets the RequestCharged property.
+ ///
+ /// If present, indicates that the requester was successfully charged for the request.
+ ///
+ ///
+ public RequestCharged RequestCharged { get; set; }
+
+ ///
+ /// Gets and sets the RestoreExpiration property.
+ ///
+ /// RestoreExpiration will be set for objects that have been restored from Amazon Glacier.
+ /// It indicates for those objects how long the restored object will exist.
+ ///
+ ///
+ public DateTime? RestoreExpiration { get; set; }
+
+ ///
+ /// Gets and sets the RestoreInProgress
+ ///
+ /// Will be true when the object is in the process of being restored from Amazon Glacier.
+ ///
+ ///
+ /// This functionality is not supported for directory buckets.
+ /// Only the S3 Express One Zone storage class is supported by directory buckets to store objects.
+ ///
+ ///
+ public bool? RestoreInProgress { get; set; }
+
+ ///
+ /// Gets and sets the ServerSideEncryptionCustomerMethod property.
+ ///
+ /// The server-side encryption algorithm to be used with the customer provided key.
+ ///
+ ///
+ public ServerSideEncryptionCustomerMethod ServerSideEncryptionCustomerMethod { get; set; }
+
+ ///
+ /// Gets and sets the ServerSideEncryptionCustomerProvidedKeyMD5 property.
+ ///
+ /// The MD5 server-side encryption of the customer-provided encryption key.
+ ///
+ ///
+ public string ServerSideEncryptionCustomerProvidedKeyMD5 { get; set; }
+
+ ///
+ /// Gets and sets the ServerSideEncryptionKeyManagementServiceKeyId property.
+ ///
+ /// If present, indicates the ID of the KMS key that was used for object encryption.
+ ///
+ ///
+ public string ServerSideEncryptionKeyManagementServiceKeyId { get; set; }
+
+ ///
+ /// Gets and sets the ServerSideEncryptionMethod property.
+ ///
+ /// The server-side encryption algorithm used when you store this object in Amazon S3.
+ ///
+ ///
+ public ServerSideEncryptionMethod ServerSideEncryptionMethod { get; set; }
+
+ ///
+ /// Gets and sets the property StorageClass.
+ ///
+ /// Provides storage class information of the object.
+ ///
+ ///
+ public S3StorageClass StorageClass { get; set; }
+
+ ///
+ /// Gets and sets the property TagCount.
+ ///
+ /// The number of tags, if any, on the object.
+ ///
+ ///
+ public int TagCount { get; set; }
+
+ ///
+ /// Gets and sets the property VersionId.
+ ///
+ /// Version ID of the object.
+ ///
+ ///
+ public string VersionId { get; set; }
+
+ ///
+ /// Gets and sets the property WebsiteRedirectLocation.
+ ///
+ /// If the bucket is configured as a website, redirects requests for this object to another
+ /// object in the same bucket or to an external URL.
+ ///
+ ///
+ public string WebsiteRedirectLocation { get; set; }
+ }
+}
diff --git a/sdk/test/Services/S3/UnitTests/Custom/EmbeddedResource/property-aliases.json b/sdk/test/Services/S3/UnitTests/Custom/EmbeddedResource/property-aliases.json
index 97a29b7695c3..dd4e8c3ce2d7 100644
--- a/sdk/test/Services/S3/UnitTests/Custom/EmbeddedResource/property-aliases.json
+++ b/sdk/test/Services/S3/UnitTests/Custom/EmbeddedResource/property-aliases.json
@@ -116,6 +116,20 @@
"CompleteMultipartUploadResponse": {
"ServerSideEncryption": "ServerSideEncryptionMethod",
"SSEKMSKeyId": "ServerSideEncryptionKeyManagementServiceKeyId"
+ },
+ "GetObjectResponse": {
+ "SSECustomerAlgorithm": "ServerSideEncryptionCustomerMethod",
+ "SSECustomerKeyMD5": "ServerSideEncryptionCustomerProvidedKeyMD5",
+ "SSEKMSKeyId": "ServerSideEncryptionKeyManagementServiceKeyId",
+ "ServerSideEncryption": "ServerSideEncryptionMethod",
+ "Restore": "RestoreExpiration"
+ },
+ "TransferUtilityDownloadResponse": {
+ "SSECustomerAlgorithm": "ServerSideEncryptionCustomerMethod",
+ "SSECustomerKeyMD5": "ServerSideEncryptionCustomerProvidedKeyMD5",
+ "SSEKMSKeyId": "ServerSideEncryptionKeyManagementServiceKeyId",
+ "ServerSideEncryption": "ServerSideEncryptionMethod",
+ "Restore": "RestoreExpiration"
}
}
}
\ No newline at end of file
diff --git a/sdk/test/Services/S3/UnitTests/Custom/ResponseMapperTests.cs b/sdk/test/Services/S3/UnitTests/Custom/ResponseMapperTests.cs
index 18b47e422d4d..ab14986d917f 100644
--- a/sdk/test/Services/S3/UnitTests/Custom/ResponseMapperTests.cs
+++ b/sdk/test/Services/S3/UnitTests/Custom/ResponseMapperTests.cs
@@ -319,36 +319,59 @@ private void ValidateMappingTransferUtilityAndSdkRequests(
+ new[] { "Conversion", "GetObjectResponse", "DownloadResponse" },
+ (sourceResponse) =>
+ {
+ return ResponseMapper.MapGetObjectResponse(sourceResponse);
+ },
+ usesHeadersCollection: true,
+ (sourceResponse) =>
+ {
+ sourceResponse.HttpStatusCode = HttpStatusCode.OK;
+ sourceResponse.ContentLength = 2048;
+ },
+ (sourceResponse, targetResponse) =>
+ {
+ Assert.AreEqual(sourceResponse.HttpStatusCode, targetResponse.HttpStatusCode, "HttpStatusCode should match");
+ Assert.AreEqual(sourceResponse.ContentLength, targetResponse.ContentLength, "ContentLength should match");
+ });
+ }
+
+ [TestMethod]
+ [TestCategory("S3")]
+ public void MapGetObjectResponse_NullValues_HandledCorrectly()
+ {
+ // Test null handling scenarios
+ var testCases = new[]
+ {
+ // Test null Expiration
+ new GetObjectResponse { Expiration = null },
+
+ // Test null enum conversions
+ new GetObjectResponse { ChecksumType = null, RequestCharged = null, ServerSideEncryptionMethod = null }
+ };
+
+ foreach (var testCase in testCases)
+ {
+ var mapped = ResponseMapper.MapGetObjectResponse(testCase);
+ Assert.IsNotNull(mapped, "Response should always be mappable");
+
+ // Test null handling
+ if (testCase.Expiration == null)
+ {
+ Assert.IsNull(mapped.Expiration, "Null Expiration should map to null");
+ }
+ }
+ }
+
[TestMethod]
[TestCategory("S3")]
public void ValidateGetObjectRequestDefinitionCompleteness()