/*
* Copyright 2010-2013 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.
*/
using System;
using Amazon.S3.Util;
using Amazon.Runtime.Internal;
using Amazon.Runtime.Internal.Transform;
using System.Globalization;
using Amazon.Util;
#pragma warning disable 1591
namespace Amazon.S3.Model.Internal.MarshallTransformations
{
///
/// Copy Object Request Marshaller
///
public class CopyObjectRequestMarshaller : IMarshaller ,IMarshaller
{
public IRequest Marshall(Amazon.Runtime.AmazonWebServiceRequest input)
{
return this.Marshall((CopyObjectRequest)input);
}
public IRequest Marshall(CopyObjectRequest copyObjectRequest)
{
IRequest request = new DefaultRequest(copyObjectRequest, "AmazonS3");
request.HttpMethod = "PUT";
if (copyObjectRequest.IsSetCannedACL())
request.Headers.Add(HeaderKeys.XAmzAclHeader, S3Transforms.ToStringValue(copyObjectRequest.CannedACL));
var headers = copyObjectRequest.Headers;
foreach (var key in headers.Keys)
request.Headers[key] = headers[key];
HeaderACLRequestMarshaller.Marshall(request, copyObjectRequest);
if (copyObjectRequest.IsSetSourceBucket())
request.Headers.Add(HeaderKeys.XAmzCopySourceHeader, ConstructCopySourceHeaderValue(copyObjectRequest.SourceBucket, copyObjectRequest.SourceKey, copyObjectRequest.SourceVersionId));
if (copyObjectRequest.IsSetETagToMatch())
request.Headers.Add(HeaderKeys.XAmzCopySourceIfMatchHeader, S3Transforms.ToStringValue(copyObjectRequest.ETagToMatch));
if (copyObjectRequest.IsSetModifiedSinceDateUtc())
request.Headers.Add(HeaderKeys.XAmzCopySourceIfModifiedSinceHeader, S3Transforms.ToStringValue(copyObjectRequest.ModifiedSinceDateUtc));
if (copyObjectRequest.IsSetETagToNotMatch())
request.Headers.Add(HeaderKeys.XAmzCopySourceIfNoneMatchHeader, S3Transforms.ToStringValue(copyObjectRequest.ETagToNotMatch));
if (copyObjectRequest.IsSetUnmodifiedSinceDateUtc())
request.Headers.Add(HeaderKeys.XAmzCopySourceIfUnmodifiedSinceHeader, S3Transforms.ToStringValue(copyObjectRequest.UnmodifiedSinceDateUtc));
if (copyObjectRequest.IsSetTagSet())
{
request.Headers.Add(S3Constants.AmzHeaderTagging, AmazonS3Util.TagSetToQueryString(copyObjectRequest.TagSet));
request.Headers.Add(S3Constants.AmzHeaderTaggingDirective, TaggingDirective.REPLACE.Value);
}
else
{
request.Headers.Add(S3Constants.AmzHeaderTaggingDirective, TaggingDirective.COPY.Value);
}
request.Headers.Add(HeaderKeys.XAmzMetadataDirectiveHeader, S3Transforms.ToStringValue(copyObjectRequest.MetadataDirective.ToString()));
if(copyObjectRequest.IsSetObjectLockLegalHoldStatus())
request.Headers.Add("x-amz-object-lock-legal-hold", S3Transforms.ToStringValue(copyObjectRequest.ObjectLockLegalHoldStatus));
if(copyObjectRequest.IsSetObjectLockMode())
request.Headers.Add("x-amz-object-lock-mode", S3Transforms.ToStringValue(copyObjectRequest.ObjectLockMode));
if(copyObjectRequest.IsSetObjectLockRetainUntilDate())
request.Headers.Add("x-amz-object-lock-retain-until-date", S3Transforms.ToStringValue(copyObjectRequest.ObjectLockRetainUntilDate, AWSSDKUtils.ISO8601DateFormat));
if (copyObjectRequest.IsSetServerSideEncryptionMethod())
request.Headers.Add(HeaderKeys.XAmzServerSideEncryptionHeader, S3Transforms.ToStringValue(copyObjectRequest.ServerSideEncryptionMethod));
if (copyObjectRequest.IsSetServerSideEncryptionCustomerMethod())
request.Headers.Add(HeaderKeys.XAmzSSECustomerAlgorithmHeader, copyObjectRequest.ServerSideEncryptionCustomerMethod);
if (copyObjectRequest.IsSetServerSideEncryptionCustomerProvidedKey())
{
request.Headers.Add(HeaderKeys.XAmzSSECustomerKeyHeader, copyObjectRequest.ServerSideEncryptionCustomerProvidedKey);
if(copyObjectRequest.IsSetServerSideEncryptionCustomerProvidedKeyMD5())
request.Headers.Add(HeaderKeys.XAmzSSECustomerKeyMD5Header, copyObjectRequest.ServerSideEncryptionCustomerProvidedKeyMD5);
else
request.Headers.Add(HeaderKeys.XAmzSSECustomerKeyMD5Header, AmazonS3Util.ComputeEncodedMD5FromEncodedString(copyObjectRequest.ServerSideEncryptionCustomerProvidedKey));
}
if (copyObjectRequest.IsSetCopySourceServerSideEncryptionCustomerMethod())
request.Headers.Add(HeaderKeys.XAmzCopySourceSSECustomerAlgorithmHeader, copyObjectRequest.CopySourceServerSideEncryptionCustomerMethod);
if (copyObjectRequest.IsSetCopySourceServerSideEncryptionCustomerProvidedKey())
{
request.Headers.Add(HeaderKeys.XAmzCopySourceSSECustomerKeyHeader, copyObjectRequest.CopySourceServerSideEncryptionCustomerProvidedKey);
if (copyObjectRequest.IsSetCopySourceServerSideEncryptionCustomerProvidedKeyMD5())
request.Headers.Add(HeaderKeys.XAmzCopySourceSSECustomerKeyMD5Header, copyObjectRequest.CopySourceServerSideEncryptionCustomerProvidedKeyMD5);
else
request.Headers.Add(HeaderKeys.XAmzCopySourceSSECustomerKeyMD5Header, AmazonS3Util.ComputeEncodedMD5FromEncodedString(copyObjectRequest.CopySourceServerSideEncryptionCustomerProvidedKey));
}
if (copyObjectRequest.IsSetServerSideEncryptionKeyManagementServiceKeyId())
request.Headers.Add(HeaderKeys.XAmzServerSideEncryptionAwsKmsKeyIdHeader, copyObjectRequest.ServerSideEncryptionKeyManagementServiceKeyId);
if (copyObjectRequest.IsSetServerSideEncryptionKeyManagementServiceEncryptionContext())
request.Headers.Add("x-amz-server-side-encryption-context", copyObjectRequest.ServerSideEncryptionKeyManagementServiceEncryptionContext);
if (copyObjectRequest.IsSetStorageClass())
request.Headers.Add(HeaderKeys.XAmzStorageClassHeader, S3Transforms.ToStringValue(copyObjectRequest.StorageClass));
if (copyObjectRequest.IsSetWebsiteRedirectLocation())
request.Headers.Add(HeaderKeys.XAmzWebsiteRedirectLocationHeader, S3Transforms.ToStringValue(copyObjectRequest.WebsiteRedirectLocation));
if (copyObjectRequest.IsSetRequestPayer())
request.Headers.Add(S3Constants.AmzHeaderRequestPayer, S3Transforms.ToStringValue(copyObjectRequest.RequestPayer.ToString()));
AmazonS3Util.SetMetadataHeaders(request, copyObjectRequest.Metadata);
if (string.IsNullOrEmpty(copyObjectRequest.DestinationBucket))
throw new System.ArgumentException("DestinationBucket is a required property and must be set before making this call.", "CopyObjectRequest.DestinationBucket");
if (string.IsNullOrEmpty(copyObjectRequest.DestinationKey))
throw new System.ArgumentException("DestinationKey is a required property and must be set before making this call.", "CopyObjectRequest.DestinationKey");
var destinationKey = copyObjectRequest.DestinationKey.StartsWith("/", StringComparison.Ordinal)
? copyObjectRequest.DestinationKey.Substring(1)
: copyObjectRequest.DestinationKey;
request.MarshallerVersion = 2;
request.ResourcePath = string.Format(CultureInfo.InvariantCulture, "/{0}/{1}",
S3Transforms.ToStringValue(copyObjectRequest.DestinationBucket),
S3Transforms.ToStringValue(destinationKey));
request.UseQueryString = true;
return request;
}
static string ConstructCopySourceHeaderValue(string bucket, string key, string version)
{
string source;
if (!String.IsNullOrEmpty(key))
{
var sourceKey = key.StartsWith("/", StringComparison.Ordinal)
? key.Substring(1)
: key;
source = AmazonS3Util.UrlEncode(String.Concat("/", bucket, "/", sourceKey), true);
if (!String.IsNullOrEmpty(version))
{
source = string.Format(CultureInfo.InvariantCulture, "{0}?versionId={1}", source, AmazonS3Util.UrlEncode(version, true));
}
}
else
{
source = AmazonS3Util.UrlEncode(bucket, true);
}
return source;
}
private static CopyObjectRequestMarshaller _instance;
public static CopyObjectRequestMarshaller Instance
{
get
{
if (_instance == null)
{
_instance = new CopyObjectRequestMarshaller();
}
return _instance;
}
}
}
}