/*
* 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.
*/
using System;
using System.Collections.Generic;
using System.Xml.Serialization;
using System.Text;
using System.IO;
using Amazon.Runtime;
using Amazon.Runtime.Internal;
using System.Collections.ObjectModel;
namespace Amazon.S3.Model
{
///
/// Container for the parameters to the GetObject operation.
/// Retrieves objects from Amazon S3. To use GET
, you must have READ
/// access to the object. If you grant READ
access to the anonymous user,
/// you can return the object without using an authorization header.
///
///
///
/// An Amazon S3 bucket has no directory hierarchy such as you would find in a typical
/// computer file system. You can, however, create a logical hierarchy by using object
/// key names that imply a folder structure. For example, instead of naming an object
/// sample.jpg
, you can name it photos/2006/February/sample.jpg
.
///
///
///
/// To get an object from such a logical hierarchy, specify the full key name for the
/// object in the GET
operation. For a virtual hosted-style request example,
/// if you have the object photos/2006/February/sample.jpg
, specify the resource
/// as /photos/2006/February/sample.jpg
. For a path-style request example,
/// if you have the object photos/2006/February/sample.jpg
in the bucket
/// named examplebucket
, specify the resource as /examplebucket/photos/2006/February/sample.jpg
.
/// For more information about request types, see HTTP
/// Host Header Bucket Specification.
///
///
///
/// To distribute large files to many people, you can save bandwidth costs by using BitTorrent.
/// For more information, see Amazon
/// S3 Torrent. For more information about returning the ACL of an object, see GetObjectAcl.
///
///
///
/// If the object you are retrieving is stored in the S3 Glacier or S3 Glacier Deep Archive
/// storage class, or S3 Intelligent-Tiering Archive or S3 Intelligent-Tiering Deep Archive
/// tiers, before you can retrieve the object you must first restore a copy using RestoreObject.
/// Otherwise, this action returns an InvalidObjectStateError
error. For
/// information about restoring archived objects, see Restoring
/// Archived Objects.
///
///
///
/// Encryption request headers, like x-amz-server-side-encryption
, should
/// not be sent for GET requests if your object uses server-side encryption with KMS keys
/// (SSE-KMS) or server-side encryption with Amazon S3 managed encryption keys (SSE-S3).
/// If your object does use these types of keys, you'll get an HTTP 400 BadRequest error.
///
///
///
/// If you encrypt an object by using server-side encryption with customer-provided encryption
/// keys (SSE-C) when you store the object in Amazon S3, then when you GET the object,
/// you must use the following headers:
///
/// -
///
/// x-amz-server-side-encryption-customer-algorithm
///
///
-
///
/// x-amz-server-side-encryption-customer-key
///
///
-
///
/// x-amz-server-side-encryption-customer-key-MD5
///
///
///
/// For more information about SSE-C, see Server-Side
/// Encryption (Using Customer-Provided Encryption Keys).
///
///
///
/// Assuming you have the relevant permission to read object tags, the response also returns
/// the x-amz-tagging-count
header that provides the count of number of tags
/// associated with the object. You can use GetObjectTagging
/// to retrieve the tag set associated with an object.
///
/// - Permissions
-
///
/// You need the relevant read object (or version) permission for this operation. For
/// more information, see Specifying
/// Permissions in a Policy. If the object you request does not exist, the error Amazon
/// S3 returns depends on whether you also have the
s3:ListBucket
permission.
///
/// -
///
/// If you have the
s3:ListBucket
permission on the bucket, Amazon S3 will
/// return an HTTP status code 404 ("no such key") error.
///
/// -
///
/// If you don’t have the
s3:ListBucket
permission, Amazon S3 will return
/// an HTTP status code 403 ("access denied") error.
///
///
- Versioning
-
///
/// By default, the GET action returns the current version of an object. To return a different
/// version, use the
versionId
subresource.
///
/// -
///
/// You need the
s3:GetObjectVersion
permission to access a specific version
/// of an object.
///
/// -
///
/// If the current version of the object is a delete marker, Amazon S3 behaves as if the
/// object was deleted and includes
x-amz-delete-marker: true
in the response.
///
///
///
/// For more information about versioning, see PutBucketVersioning.
///
///
/// - Overriding Response Header Values
-
///
/// There are times when you want to override certain response header values in a GET
/// response. For example, you might override the Content-Disposition response header
/// value in your GET request.
///
///
///
/// You can override values for a set of response headers using the following query parameters.
/// These response header values are sent only on a successful request, that is, when
/// status code 200 OK is returned. The set of headers you can override using these parameters
/// is a subset of the headers that Amazon S3 accepts when you create an object. The response
/// headers that you can override for the GET response are
Content-Type
,
/// Content-Language
, Expires
, Cache-Control
, Content-Disposition
,
/// and Content-Encoding
. To override these header values in the GET response,
/// you use the following request parameters.
///
///
///
/// You must sign the request, either using an Authorization header or a presigned URL,
/// when using these parameters. They cannot be used with an unsigned (anonymous) request.
///
/// -
///
///
response-content-type
///
/// -
///
///
response-content-language
///
/// -
///
///
response-expires
///
/// -
///
///
response-cache-control
///
/// -
///
///
response-content-disposition
///
/// -
///
///
response-content-encoding
///
///
- Overriding Response Header Values
-
///
/// If both of the
If-Match
and If-Unmodified-Since
headers
/// are present in the request as follows: If-Match
condition evaluates to
/// true
, and; If-Unmodified-Since
condition evaluates to false
;
/// then, S3 returns 200 OK and the data requested.
///
///
///
/// If both of the If-None-Match
and If-Modified-Since
headers
/// are present in the request as follows: If-None-Match
condition evaluates
/// to false
, and; If-Modified-Since
condition evaluates to
/// true
; then, S3 returns 304 Not Modified response code.
///
///
///
/// For more information about conditional requests, see RFC
/// 7232.
///
///
///
/// The following operations are related to GetObject
:
///
///
///
public partial class GetObjectRequest : AmazonWebServiceRequest
{
private string bucketName;
private string expectedBucketOwner;
DateTime? modifiedSinceDate;
DateTime? unmodifiedSinceDate;
DateTime? modifiedSinceDateUtc;
DateTime? unmodifiedSinceDateUtc;
string etagToMatch;
string etagToNotMatch;
private string key;
private int? partNumber;
private ByteRange byteRange;
private RequestPayer requestPayer;
private DateTime? responseExpires;
private DateTime? responseExpiresUtc;
private ResponseHeaderOverrides responseHeaders;
private ServerSideEncryptionCustomerMethod serverSideCustomerEncryption;
private string serverSideEncryptionCustomerProvidedKey;
private string serverSideEncryptionCustomerProvidedKeyMD5;
private string versionId;
private ChecksumMode _checksumMode;
///
/// Gets and sets the property BucketName.
///
/// The bucket name containing the object.
///
///
///
/// When using this action with an access point, you must direct requests to the access
/// point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com.
/// When using this action with an access point through the Amazon Web Services SDKs,
/// you provide the access point ARN in place of the bucket name. For more information
/// about access point ARNs, see Using
/// access points in the Amazon S3 User Guide.
///
///
///
/// When using an Object Lambda access point the hostname takes the form AccessPointName-AccountId.s3-object-lambda.Region.amazonaws.com.
///
///
///
/// When you use this action with Amazon S3 on Outposts, you must direct requests to the
/// S3 on Outposts hostname. The S3 on Outposts hostname takes the form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com
.
/// When you use this action with S3 on Outposts through the Amazon Web Services SDKs,
/// you provide the Outposts access point ARN in place of the bucket name. For more information
/// about S3 on Outposts ARNs, see What
/// is S3 on Outposts? in the Amazon S3 User Guide.
///
///
public string BucketName
{
get { return this.bucketName; }
set { this.bucketName = value; }
}
// Check to see if BucketName property is set
internal bool IsSetBucketName()
{
return this.bucketName != null;
}
///
/// Gets and sets the property ExpectedBucketOwner.
///
/// The account ID of the expected bucket owner. If the bucket is owned by a different
/// account, the request will fail with an HTTP 403 (Access Denied)
error.
///
///
public string ExpectedBucketOwner
{
get { return this.expectedBucketOwner; }
set { this.expectedBucketOwner = value; }
}
///
/// Checks to see if ExpectedBucketOwner is set.
///
/// true, if ExpectedBucketOwner property is set.
internal bool IsSetExpectedBucketOwner()
{
return !String.IsNullOrEmpty(this.expectedBucketOwner);
}
///
///
/// This property is deprecated. Setting this property results in non-UTC DateTimes not
/// being marshalled correctly. Use ModifiedSinceDateUtc instead. Setting either ModifiedSinceDate or
/// ModifiedSinceDateUtc results in both ModifiedSinceDate and ModifiedSinceDateUtc being assigned,
/// the latest assignment to either one of the two property is reflected in the value of both.
/// ModifiedSinceDate is provided for backwards compatibility only and assigning a non-Utc DateTime
/// to it results in the wrong timestamp being passed to the service.
///
/// Returns the object only if it has been modified since the specified time,
/// otherwise returns a PreconditionFailed.
///
[Obsolete("Setting this property results in non-UTC DateTimes not being marshalled correctly. " +
"Use ModifiedSinceDateUtc instead. Setting either ModifiedSinceDate or ModifiedSinceDateUtc results in both ModifiedSinceDate and " +
"ModifiedSinceDateUtc being assigned, the latest assignment to either one of the two property is " +
"reflected in the value of both. ModifiedSinceDate is provided for backwards compatibility only and " +
"assigning a non-Utc DateTime to it results in the wrong timestamp being passed to the service.", false)]
public DateTime ModifiedSinceDate
{
get { return this.modifiedSinceDate ?? default(DateTime); }
set
{
this.modifiedSinceDate = value;
this.modifiedSinceDateUtc = new DateTime(value.Ticks, DateTimeKind.Utc);
}
}
///
/// Returns the object only if it has been modified since the specified time,
/// otherwise returns a PreconditionFailed.
///
public DateTime ModifiedSinceDateUtc
{
get { return this.modifiedSinceDateUtc.GetValueOrDefault(); }
set
{
this.modifiedSinceDateUtc = value;
this.modifiedSinceDate = value;
}
}
// Check to see if ModifiedSinceDateUtc property is set
internal bool IsSetModifiedSinceDateUtc()
{
return this.modifiedSinceDateUtc.HasValue;
}
///
///
/// This property is deprecated. Setting this property results in non-UTC DateTimes not
/// being marshalled correctly. Use UnmodifiedSinceDateUtc instead. Setting either UnmodifiedSinceDate or
/// UnmodifiedSinceDateUtc results in both UnmodifiedSinceDate and UnmodifiedSinceDateUtc being assigned,
/// the latest assignment to either one of the two property is reflected in the value of both.
/// UnmodifiedSinceDate is provided for backwards compatibility only and assigning a non-Utc DateTime
/// to it results in the wrong timestamp being passed to the service.
///
/// Returns the object only if it has not been modified since the specified time,
/// otherwise returns a PreconditionFailed.
///
[Obsolete("Setting this property results in non-UTC DateTimes not being marshalled correctly. " +
"Use UnmodifiedSinceDateUtc instead. Setting either UnmodifiedSinceDate or UnmodifiedSinceDateUtc results in both UnmodifiedSinceDate and " +
"UnmodifiedSinceDateUtc being assigned, the latest assignment to either one of the two property is " +
"reflected in the value of both. UnmodifiedSinceDate is provided for backwards compatibility only and " +
"assigning a non-Utc DateTime to it results in the wrong timestamp being passed to the service.", false)]
public DateTime UnmodifiedSinceDate
{
get { return this.unmodifiedSinceDate.GetValueOrDefault(); }
set
{
this.unmodifiedSinceDate = value;
this.unmodifiedSinceDateUtc = new DateTime(value.Ticks, DateTimeKind.Utc);
}
}
///
/// Returns the object only if it has not been modified since the specified time,
/// otherwise returns a PreconditionFailed.
///
public DateTime UnmodifiedSinceDateUtc
{
get { return this.unmodifiedSinceDateUtc ?? default(DateTime); }
set
{
this.unmodifiedSinceDateUtc = value;
this.unmodifiedSinceDate = value;
}
}
// Check to see if UnmodifiedSinceDateUtc property is set
internal bool IsSetUnmodifiedSinceDateUtc()
{
return this.unmodifiedSinceDateUtc.HasValue;
}
///
/// Gets and sets the Key property. This is the user defined key that identifies the object in the bucket.
///
///
/// This property will be used as part of the resource path of the HTTP request. In .NET the System.Uri class
/// is used to construct the uri for the request. The System.Uri class will canonicalize the uri string by compacting characters like "..". /// For example an object key of "foo/../bar/file.txt" will be transformed into "bar/file.txt" because the ".."
/// is interpreted as use parent directory. For further information view the documentation for
/// the Uri class: https://docs.microsoft.com/en-us/dotnet/api/system.uri
///
public string Key
{
get { return this.key; }
set { this.key = value; }
}
// Check to see if Key property is set
internal bool IsSetKey()
{
return this.key != null;
}
///
/// Part number of the object being read. This is a positive integer between 1 and 10,000.
/// Effectively performs a 'ranged' GET request for the part specified. Useful for downloading just a part of an object.
///
public int? PartNumber
{
get { return this.partNumber; }
set
{
if (value.HasValue)
{
if (value < 1 || 10000 < value)
{
throw new ArgumentException("PartNumber must be a positve integer between 1 and 10,000.");
}
}
this.partNumber = value;
}
}
///
/// Checks if PartNumber property is set.
///
/// true if PartNumber property is set.
internal bool IsSetPartNumber()
{
return this.partNumber.HasValue;
}
///
/// Confirms that the requester knows that she or he will be charged for the request.
/// Bucket owners need not specify this parameter in their requests.
///
public RequestPayer RequestPayer
{
get { return this.requestPayer; }
set { this.requestPayer = value; }
}
///
/// Checks to see if RequetsPayer is set.
///
/// true, if RequestPayer property is set.
internal bool IsSetRequestPayer()
{
return requestPayer != null;
}
///
///
/// This property is deprecated. Setting this property results in non-UTC DateTimes not
/// being marshalled correctly. Use ResponseExpiresUtc instead. Setting either ResponseExpires or
/// ResponseExpiresUtc results in both ResponseExpires and ResponseExpiresUtc being assigned,
/// the latest assignment to either one of the two property is reflected in the value of both.
/// ResponseExpires is provided for backwards compatibility only and assigning a non-Utc DateTime
/// to it results in the wrong timestamp being passed to the service.
///
/// Sets the Expires header of the response.
///
[Obsolete("Setting this property results in non-UTC DateTimes not being marshalled correctly. " +
"Use ResponseExpiresUtc instead. Setting either ResponseExpires or ResponseExpiresUtc results in both ResponseExpires and " +
"ResponseExpiresUtc being assigned, the latest assignment to either one of the two property is " +
"reflected in the value of both. ResponseExpires is provided for backwards compatibility only and " +
"assigning a non-Utc DateTime to it results in the wrong timestamp being passed to the service.", false)]
public DateTime ResponseExpires
{
get { return this.responseExpires.GetValueOrDefault(); }
set
{
this.responseExpires = value;
this.responseExpiresUtc = new DateTime(value.Ticks, DateTimeKind.Utc);
}
}
///
/// Sets the Expires header of the response.
///
public DateTime ResponseExpiresUtc
{
get { return this.responseExpiresUtc ?? default(DateTime); }
set
{
this.responseExpiresUtc = value;
this.responseExpires = value;
}
}
// Check to see if ResponseExpiresUtc property is set
internal bool IsSetResponseExpiresUtc()
{
return this.responseExpiresUtc.HasValue;
}
///
/// The Server-side encryption algorithm to be used with the customer provided key.
///
///
public ServerSideEncryptionCustomerMethod ServerSideEncryptionCustomerMethod
{
get { return this.serverSideCustomerEncryption; }
set { this.serverSideCustomerEncryption = value; }
}
// Check to see if ServerSideEncryptionCustomerMethod property is set
internal bool IsSetServerSideEncryptionCustomerMethod()
{
return this.serverSideCustomerEncryption != null && this.serverSideCustomerEncryption != ServerSideEncryptionCustomerMethod.None;
}
///
/// The base64-encoded encryption key for Amazon S3 to use to decrypt the object
///
/// Using the encryption key you provide as part of your request Amazon S3 manages both the encryption, as it writes
/// to disks, and decryption, when you access your objects. Therefore, you don't need to maintain any data encryption code. The only
/// thing you do is manage the encryption keys you provide.
///
///
/// When you retrieve an object, you must provide the same encryption key as part of your request. Amazon S3 first verifies
/// the encryption key you provided matches, and then decrypts the object before returning the object data to you.
///
///
/// Important: Amazon S3 does not store the encryption key you provide.
///
///
[AWSProperty(Sensitive=true)]
public string ServerSideEncryptionCustomerProvidedKey
{
get { return this.serverSideEncryptionCustomerProvidedKey; }
set { this.serverSideEncryptionCustomerProvidedKey = value; }
}
///
/// Checks if ServerSideEncryptionCustomerProvidedKey property is set.
///
/// true if ServerSideEncryptionCustomerProvidedKey property is set.
internal bool IsSetServerSideEncryptionCustomerProvidedKey()
{
return !System.String.IsNullOrEmpty(this.serverSideEncryptionCustomerProvidedKey);
}
///
/// The MD5 of the customer encryption key specified in the ServerSideEncryptionCustomerProvidedKey property. The MD5 is
/// base 64 encoded. This field is optional, the SDK will calculate the MD5 if this is not set.
///
public string ServerSideEncryptionCustomerProvidedKeyMD5
{
get { return this.serverSideEncryptionCustomerProvidedKeyMD5; }
set { this.serverSideEncryptionCustomerProvidedKeyMD5 = value; }
}
///
/// Checks if ServerSideEncryptionCustomerProvidedKeyMD5 property is set.
///
/// true if ServerSideEncryptionCustomerProvidedKey property is set.
internal bool IsSetServerSideEncryptionCustomerProvidedKeyMD5()
{
return !System.String.IsNullOrEmpty(this.serverSideEncryptionCustomerProvidedKeyMD5);
}
///
/// VersionId used to reference a specific version of the object.
///
public string VersionId
{
get { return this.versionId; }
set { this.versionId = value; }
}
// Check to see if VersionId property is set
internal bool IsSetVersionId()
{
return this.versionId != null;
}
///
/// ETag to be matched as a pre-condition for returning the object,
/// otherwise a PreconditionFailed signal is returned.
///
public string EtagToMatch
{
get { return this.etagToMatch; }
set { this.etagToMatch = value; }
}
// Check to see if EtagToMatch property is set
internal bool IsSetEtagToMatch()
{
return this.etagToMatch != null;
}
///
/// ETag that should not be matched as a pre-condition for returning the object,
/// otherwise a PreconditionFailed signal is returned.
///
public string EtagToNotMatch
{
get { return this.etagToNotMatch; }
set { this.etagToNotMatch = value; }
}
// Check to see if EtagToNotMatch property is set
internal bool IsSetEtagToNotMatch()
{
return this.etagToNotMatch != null;
}
///
///
/// Downloads the specified range bytes of an object. For more information about the HTTP
/// Range header, see https://www.rfc-editor.org/rfc/rfc9110.html#name-range.
///
///
///
/// Amazon S3 doesn't support retrieving multiple ranges of data per GET
/// request.
///
///
///
public ByteRange ByteRange
{
get { return this.byteRange; }
set { this.byteRange = value; }
}
// Check to see if ByteRange property is set
internal bool IsSetByteRange()
{
return this.byteRange != null && this.byteRange.FormattedByteRange != null;
}
///
/// A set of response headers that should be returned with the object.
///
public ResponseHeaderOverrides ResponseHeaderOverrides
{
get
{
if (this.responseHeaders == null)
{
this.responseHeaders = new ResponseHeaderOverrides();
}
return this.responseHeaders;
}
set
{
this.responseHeaders = value;
}
}
///
/// Gets and sets the property ChecksumMode.
///
/// This must be enabled to retrieve the checksum.
///
///
public ChecksumMode ChecksumMode
{
get { return this._checksumMode; }
set { this._checksumMode = value; }
}
// Check to see if ChecksumMode property is set
internal bool IsSetChecksumMode()
{
return this._checksumMode != null;
}
///
/// This must be enabled to retrieve the checksum
///
protected override CoreChecksumResponseBehavior CoreChecksumMode
{
get
{
if (IsSetChecksumMode())
{
return (CoreChecksumResponseBehavior)Enum.Parse(typeof(CoreChecksumResponseBehavior), this.ChecksumMode);
}
return CoreChecksumResponseBehavior.DISABLED;
}
}
private static List _supportedChecksumAlgorithms = new List
{
CoreChecksumAlgorithm.CRC32C,
CoreChecksumAlgorithm.CRC32,
CoreChecksumAlgorithm.SHA256,
CoreChecksumAlgorithm.SHA1
};
///
/// Checksum algorithms supported by this operation for response validation
///
protected override ReadOnlyCollection ChecksumResponseAlgorithms => _supportedChecksumAlgorithms.AsReadOnly();
}
}