/* * 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: /// /// /// /// 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(); } }