aws-sdk-s3 1.103.0 → 1.202.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +664 -0
  3. data/VERSION +1 -1
  4. data/lib/aws-sdk-s3/access_grants_credentials.rb +57 -0
  5. data/lib/aws-sdk-s3/access_grants_credentials_provider.rb +250 -0
  6. data/lib/aws-sdk-s3/bucket.rb +858 -116
  7. data/lib/aws-sdk-s3/bucket_acl.rb +32 -9
  8. data/lib/aws-sdk-s3/bucket_cors.rb +38 -13
  9. data/lib/aws-sdk-s3/bucket_lifecycle.rb +43 -12
  10. data/lib/aws-sdk-s3/bucket_lifecycle_configuration.rb +100 -13
  11. data/lib/aws-sdk-s3/bucket_logging.rb +35 -6
  12. data/lib/aws-sdk-s3/bucket_notification.rb +27 -9
  13. data/lib/aws-sdk-s3/bucket_policy.rb +79 -10
  14. data/lib/aws-sdk-s3/bucket_region_cache.rb +9 -5
  15. data/lib/aws-sdk-s3/bucket_request_payment.rb +29 -7
  16. data/lib/aws-sdk-s3/bucket_tagging.rb +35 -11
  17. data/lib/aws-sdk-s3/bucket_versioning.rb +108 -17
  18. data/lib/aws-sdk-s3/bucket_website.rb +35 -11
  19. data/lib/aws-sdk-s3/client.rb +11799 -3636
  20. data/lib/aws-sdk-s3/client_api.rb +1201 -276
  21. data/lib/aws-sdk-s3/customizations/bucket.rb +23 -47
  22. data/lib/aws-sdk-s3/customizations/errors.rb +40 -0
  23. data/lib/aws-sdk-s3/customizations/object.rb +216 -70
  24. data/lib/aws-sdk-s3/customizations/object_summary.rb +5 -0
  25. data/lib/aws-sdk-s3/customizations/object_version.rb +13 -0
  26. data/lib/aws-sdk-s3/customizations/types/permanent_redirect.rb +26 -0
  27. data/lib/aws-sdk-s3/customizations.rb +27 -29
  28. data/lib/aws-sdk-s3/default_executor.rb +103 -0
  29. data/lib/aws-sdk-s3/encryption/client.rb +6 -2
  30. data/lib/aws-sdk-s3/encryption/kms_cipher_provider.rb +13 -9
  31. data/lib/aws-sdk-s3/encryptionV2/client.rb +6 -2
  32. data/lib/aws-sdk-s3/encryptionV2/decrypt_handler.rb +1 -0
  33. data/lib/aws-sdk-s3/encryptionV2/kms_cipher_provider.rb +10 -6
  34. data/lib/aws-sdk-s3/endpoint_parameters.rb +181 -0
  35. data/lib/aws-sdk-s3/endpoint_provider.rb +716 -0
  36. data/lib/aws-sdk-s3/endpoints.rb +1518 -0
  37. data/lib/aws-sdk-s3/errors.rb +58 -0
  38. data/lib/aws-sdk-s3/express_credentials.rb +55 -0
  39. data/lib/aws-sdk-s3/express_credentials_provider.rb +59 -0
  40. data/lib/aws-sdk-s3/file_downloader.rb +241 -87
  41. data/lib/aws-sdk-s3/file_uploader.rb +16 -13
  42. data/lib/aws-sdk-s3/legacy_signer.rb +2 -1
  43. data/lib/aws-sdk-s3/multipart_download_error.rb +8 -0
  44. data/lib/aws-sdk-s3/multipart_file_uploader.rb +108 -86
  45. data/lib/aws-sdk-s3/multipart_stream_uploader.rb +110 -92
  46. data/lib/aws-sdk-s3/multipart_upload.rb +294 -19
  47. data/lib/aws-sdk-s3/multipart_upload_error.rb +3 -4
  48. data/lib/aws-sdk-s3/multipart_upload_part.rb +297 -31
  49. data/lib/aws-sdk-s3/object.rb +2224 -269
  50. data/lib/aws-sdk-s3/object_acl.rb +59 -17
  51. data/lib/aws-sdk-s3/object_copier.rb +7 -5
  52. data/lib/aws-sdk-s3/object_multipart_copier.rb +48 -23
  53. data/lib/aws-sdk-s3/object_summary.rb +1915 -220
  54. data/lib/aws-sdk-s3/object_version.rb +450 -58
  55. data/lib/aws-sdk-s3/plugins/accelerate.rb +3 -44
  56. data/lib/aws-sdk-s3/plugins/access_grants.rb +178 -0
  57. data/lib/aws-sdk-s3/plugins/arn.rb +0 -197
  58. data/lib/aws-sdk-s3/plugins/bucket_dns.rb +3 -39
  59. data/lib/aws-sdk-s3/plugins/bucket_name_restrictions.rb +1 -6
  60. data/lib/aws-sdk-s3/plugins/checksum_algorithm.rb +31 -0
  61. data/lib/aws-sdk-s3/plugins/dualstack.rb +1 -55
  62. data/lib/aws-sdk-s3/plugins/endpoints.rb +86 -0
  63. data/lib/aws-sdk-s3/plugins/expect_100_continue.rb +2 -1
  64. data/lib/aws-sdk-s3/plugins/express_session_auth.rb +88 -0
  65. data/lib/aws-sdk-s3/plugins/http_200_errors.rb +55 -18
  66. data/lib/aws-sdk-s3/plugins/iad_regional_endpoint.rb +6 -29
  67. data/lib/aws-sdk-s3/plugins/location_constraint.rb +3 -1
  68. data/lib/aws-sdk-s3/plugins/md5s.rb +10 -68
  69. data/lib/aws-sdk-s3/plugins/s3_signer.rb +42 -111
  70. data/lib/aws-sdk-s3/plugins/streaming_retry.rb +28 -9
  71. data/lib/aws-sdk-s3/plugins/url_encoded_keys.rb +2 -1
  72. data/lib/aws-sdk-s3/presigned_post.rb +99 -78
  73. data/lib/aws-sdk-s3/presigner.rb +32 -41
  74. data/lib/aws-sdk-s3/resource.rb +139 -12
  75. data/lib/aws-sdk-s3/transfer_manager.rb +304 -0
  76. data/lib/aws-sdk-s3/types.rb +10204 -5378
  77. data/lib/aws-sdk-s3.rb +35 -27
  78. data/sig/bucket.rbs +231 -0
  79. data/sig/bucket_acl.rbs +78 -0
  80. data/sig/bucket_cors.rbs +69 -0
  81. data/sig/bucket_lifecycle.rbs +88 -0
  82. data/sig/bucket_lifecycle_configuration.rbs +115 -0
  83. data/sig/bucket_logging.rbs +76 -0
  84. data/sig/bucket_notification.rbs +114 -0
  85. data/sig/bucket_policy.rbs +59 -0
  86. data/sig/bucket_request_payment.rbs +54 -0
  87. data/sig/bucket_tagging.rbs +65 -0
  88. data/sig/bucket_versioning.rbs +77 -0
  89. data/sig/bucket_website.rbs +93 -0
  90. data/sig/client.rbs +2586 -0
  91. data/sig/customizations/bucket.rbs +19 -0
  92. data/sig/customizations/object.rbs +38 -0
  93. data/sig/customizations/object_summary.rbs +35 -0
  94. data/sig/errors.rbs +44 -0
  95. data/sig/multipart_upload.rbs +120 -0
  96. data/sig/multipart_upload_part.rbs +109 -0
  97. data/sig/object.rbs +464 -0
  98. data/sig/object_acl.rbs +86 -0
  99. data/sig/object_summary.rbs +347 -0
  100. data/sig/object_version.rbs +143 -0
  101. data/sig/resource.rbs +141 -0
  102. data/sig/types.rbs +2868 -0
  103. data/sig/waiters.rbs +95 -0
  104. metadata +51 -16
  105. data/lib/aws-sdk-s3/arn/access_point_arn.rb +0 -69
  106. data/lib/aws-sdk-s3/arn/multi_region_access_point_arn.rb +0 -69
  107. data/lib/aws-sdk-s3/arn/object_lambda_arn.rb +0 -69
  108. data/lib/aws-sdk-s3/arn/outpost_access_point_arn.rb +0 -73
  109. data/lib/aws-sdk-s3/plugins/object_lambda_endpoint.rb +0 -25
@@ -55,7 +55,17 @@ module Aws::S3
55
55
  end
56
56
 
57
57
  # If present, indicates that the requester was successfully charged for
58
- # the request.
58
+ # the request. For more information, see [Using Requester Pays buckets
59
+ # for storage transfers and usage][1] in the *Amazon Simple Storage
60
+ # Service user guide*.
61
+ #
62
+ # <note markdown="1"> This functionality is not supported for directory buckets.
63
+ #
64
+ # </note>
65
+ #
66
+ #
67
+ #
68
+ # [1]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/RequesterPaysBuckets.html
59
69
  # @return [String]
60
70
  def request_charged
61
71
  data[:request_charged]
@@ -75,10 +85,12 @@ module Aws::S3
75
85
  #
76
86
  # @return [self]
77
87
  def load
78
- resp = @client.get_object_acl(
88
+ resp = Aws::Plugins::UserAgent.metric('RESOURCE_MODEL') do
89
+ @client.get_object_acl(
79
90
  bucket: @bucket_name,
80
91
  key: @object_key
81
92
  )
93
+ end
82
94
  @data = resp.data
83
95
  self
84
96
  end
@@ -193,7 +205,9 @@ module Aws::S3
193
205
  :retry
194
206
  end
195
207
  end
196
- Aws::Waiters::Waiter.new(options).wait({})
208
+ Aws::Plugins::UserAgent.metric('RESOURCE_MODEL') do
209
+ Aws::Waiters::Waiter.new(options).wait({})
210
+ end
197
211
  end
198
212
 
199
213
  # @!group Actions
@@ -221,6 +235,7 @@ module Aws::S3
221
235
  # },
222
236
  # },
223
237
  # content_md5: "ContentMD5",
238
+ # checksum_algorithm: "CRC32", # accepts CRC32, CRC32C, SHA1, SHA256, CRC64NVME
224
239
  # grant_full_control: "GrantFullControl",
225
240
  # grant_read: "GrantRead",
226
241
  # grant_read_acp: "GrantReadACP",
@@ -242,9 +257,9 @@ module Aws::S3
242
257
  # Contains the elements that set the ACL permissions for an object per
243
258
  # grantee.
244
259
  # @option options [String] :content_md5
245
- # The base64-encoded 128-bit MD5 digest of the data. This header must be
246
- # used as a message integrity check to verify that the request body was
247
- # not corrupted in transit. For more information, go to [RFC
260
+ # The Base64 encoded 128-bit `MD5` digest of the data. This header must
261
+ # be used as a message integrity check to verify that the request body
262
+ # was not corrupted in transit. For more information, go to [RFC
248
263
  # 1864.&gt;][1]
249
264
  #
250
265
  # For requests made using the Amazon Web Services Command Line Interface
@@ -254,19 +269,34 @@ module Aws::S3
254
269
  #
255
270
  #
256
271
  # [1]: http://www.ietf.org/rfc/rfc1864.txt
272
+ # @option options [String] :checksum_algorithm
273
+ # Indicates the algorithm used to create the checksum for the object
274
+ # when you use the SDK. This header will not provide any additional
275
+ # functionality if you don't use the SDK. When you send this header,
276
+ # there must be a corresponding `x-amz-checksum` or `x-amz-trailer`
277
+ # header sent. Otherwise, Amazon S3 fails the request with the HTTP
278
+ # status code `400 Bad Request`. For more information, see [Checking
279
+ # object integrity][1] in the *Amazon S3 User Guide*.
280
+ #
281
+ # If you provide an individual checksum, Amazon S3 ignores any provided
282
+ # `ChecksumAlgorithm` parameter.
283
+ #
284
+ #
285
+ #
286
+ # [1]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html
257
287
  # @option options [String] :grant_full_control
258
288
  # Allows grantee the read, write, read ACP, and write ACP permissions on
259
289
  # the bucket.
260
290
  #
261
- # This action is not supported by Amazon S3 on Outposts.
291
+ # This functionality is not supported for Amazon S3 on Outposts.
262
292
  # @option options [String] :grant_read
263
293
  # Allows grantee to list the objects in the bucket.
264
294
  #
265
- # This action is not supported by Amazon S3 on Outposts.
295
+ # This functionality is not supported for Amazon S3 on Outposts.
266
296
  # @option options [String] :grant_read_acp
267
297
  # Allows grantee to read the bucket ACL.
268
298
  #
269
- # This action is not supported by Amazon S3 on Outposts.
299
+ # This functionality is not supported for Amazon S3 on Outposts.
270
300
  # @option options [String] :grant_write
271
301
  # Allows grantee to create new objects in the bucket.
272
302
  #
@@ -275,30 +305,42 @@ module Aws::S3
275
305
  # @option options [String] :grant_write_acp
276
306
  # Allows grantee to write the ACL for the applicable bucket.
277
307
  #
278
- # This action is not supported by Amazon S3 on Outposts.
308
+ # This functionality is not supported for Amazon S3 on Outposts.
279
309
  # @option options [String] :request_payer
280
310
  # Confirms that the requester knows that they will be charged for the
281
311
  # request. Bucket owners need not specify this parameter in their
282
- # requests. For information about downloading objects from requester
283
- # pays buckets, see [Downloading Objects in Requestor Pays Buckets][1]
312
+ # requests. If either the source or destination S3 bucket has Requester
313
+ # Pays enabled, the requester will pay for corresponding charges to copy
314
+ # the object. For information about downloading objects from Requester
315
+ # Pays buckets, see [Downloading Objects in Requester Pays Buckets][1]
284
316
  # in the *Amazon S3 User Guide*.
285
317
  #
318
+ # <note markdown="1"> This functionality is not supported for directory buckets.
319
+ #
320
+ # </note>
321
+ #
286
322
  #
287
323
  #
288
324
  # [1]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html
289
325
  # @option options [String] :version_id
290
- # VersionId used to reference a specific version of the object.
326
+ # Version ID used to reference a specific version of the object.
327
+ #
328
+ # <note markdown="1"> This functionality is not supported for directory buckets.
329
+ #
330
+ # </note>
291
331
  # @option options [String] :expected_bucket_owner
292
- # The account ID of the expected bucket owner. If the bucket is owned by
293
- # a different account, the request will fail with an HTTP `403 (Access
294
- # Denied)` error.
332
+ # The account ID of the expected bucket owner. If the account ID that
333
+ # you provide does not match the actual owner of the bucket, the request
334
+ # fails with the HTTP status code `403 Forbidden` (access denied).
295
335
  # @return [Types::PutObjectAclOutput]
296
336
  def put(options = {})
297
337
  options = options.merge(
298
338
  bucket: @bucket_name,
299
339
  key: @object_key
300
340
  )
301
- resp = @client.put_object_acl(options)
341
+ resp = Aws::Plugins::UserAgent.metric('RESOURCE_MODEL') do
342
+ @client.put_object_acl(options)
343
+ end
302
344
  resp.data
303
345
  end
304
346
 
@@ -28,11 +28,13 @@ module Aws
28
28
  options[:bucket] = target_bucket
29
29
  options[:key] = target_key
30
30
  options[:copy_source] = copy_source(source)
31
- if options.delete(:multipart_copy)
32
- apply_source_client(source, options)
33
- ObjectMultipartCopier.new(@options).copy(options)
34
- else
35
- @object.client.copy_object(options)
31
+ Aws::Plugins::UserAgent.metric('S3_TRANSFER') do
32
+ if options.delete(:multipart_copy)
33
+ apply_source_client(source, options)
34
+ ObjectMultipartCopier.new(@options).copy(options)
35
+ else
36
+ @object.client.copy_object(options)
37
+ end
36
38
  end
37
39
  end
38
40
 
@@ -1,7 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'thread'
4
- require 'cgi'
4
+ require "cgi/escape"
5
+ require "cgi/util" if RUBY_VERSION < "3.5"
5
6
 
6
7
  module Aws
7
8
  module S3
@@ -15,12 +16,18 @@ module Aws
15
16
  MAX_PARTS = 10_000
16
17
 
17
18
  # @option options [Client] :client
18
- # @option [Integer] :min_part_size (52428800) Size of copied parts.
19
- # Defaults to 50MB.
20
- # will be constructed from the given `options' hash.
21
- # @option [Integer] :thread_count (10) Number of concurrent threads to
22
- # use for copying parts.
19
+ # @option options [Integer] :min_part_size (52428800)
20
+ # Size of copied parts. Defaults to 50MB.
21
+ # @option options [Integer] :thread_count (10) Number of concurrent
22
+ # threads to use for copying parts.
23
+ # @option options [Boolean] :use_source_parts (false) Use part sizes
24
+ # defined on the source object if any exist. If copying or moving an
25
+ # object that is already multipart, this does not re-part the object,
26
+ # instead re-using the part definitions on the original. That means
27
+ # the etag and any checksums will not change. This is especially
28
+ # useful if the source object has parts with varied sizes.
23
29
  def initialize(options = {})
30
+ @use_source_parts = options.delete(:use_source_parts) || false
24
31
  @thread_count = options.delete(:thread_count) || 10
25
32
  @min_part_size = options.delete(:min_part_size) || (FIVE_MB * 10)
26
33
  @client = options[:client] || Client.new
@@ -31,8 +38,9 @@ module Aws
31
38
 
32
39
  # @option (see S3::Client#copy_object)
33
40
  def copy(options = {})
34
- size = source_size(options)
35
- options[:upload_id] = initiate_upload(options)
41
+ metadata = source_metadata(options)
42
+ size = metadata[:content_length]
43
+ options[:upload_id] = initiate_upload(metadata.merge(options))
36
44
  begin
37
45
  parts = copy_parts(size, default_part_size(size), options)
38
46
  complete_upload(parts, options)
@@ -74,10 +82,9 @@ module Aws
74
82
  end
75
83
 
76
84
  def copy_part(part)
77
- {
78
- etag: @client.upload_part_copy(part).copy_part_result.etag,
79
- part_number: part[:part_number],
80
- }
85
+ @client.upload_part_copy(part).copy_part_result.to_h.merge({
86
+ part_number: part[:part_number]
87
+ }).tap { |result| result.delete(:last_modified) }
81
88
  end
82
89
 
83
90
  def complete_upload(parts, options)
@@ -100,26 +107,39 @@ module Aws
100
107
  parts = []
101
108
  options = options_for(:upload_part_copy, options)
102
109
  while offset < size
110
+ part_size = calculate_part_size(part_number, default_part_size, options)
103
111
  parts << options.merge({
104
112
  part_number: part_number,
105
- copy_source_range: byte_range(offset, default_part_size, size),
113
+ copy_source_range: byte_range(offset, part_size, size),
106
114
  })
107
115
  part_number += 1
108
- offset += default_part_size
116
+ offset += part_size
109
117
  end
110
118
  parts
111
119
  end
112
120
 
113
- def byte_range(offset, default_part_size, size)
114
- if offset + default_part_size < size
115
- "bytes=#{offset}-#{offset + default_part_size - 1}"
121
+ def byte_range(offset, part_size, size)
122
+ if offset + part_size < size
123
+ "bytes=#{offset}-#{offset + part_size - 1}"
116
124
  else
117
125
  "bytes=#{offset}-#{size - 1}"
118
126
  end
119
127
  end
120
128
 
121
- def source_size(options)
122
- return options.delete(:content_length) if options[:content_length]
129
+ def calculate_part_size(part_number, default_part_size, options)
130
+ if @use_source_parts && source_has_parts(options)
131
+ source_metadata(options.merge({ part_number: part_number }))[:content_length]
132
+ else
133
+ default_part_size
134
+ end
135
+ end
136
+
137
+ def source_has_parts(options)
138
+ @source_has_parts ||= source_metadata(options.merge({ part_number: 1 }))[:parts_count]
139
+ end
140
+
141
+ def source_metadata(options)
142
+ return options.slice(:content_length) if options[:content_length]
123
143
 
124
144
  client = options[:copy_source_client] || @client
125
145
 
@@ -129,10 +149,15 @@ module Aws
129
149
  bucket, key = options[:copy_source].match(/([^\/]+?)\/(.+)/)[1,2]
130
150
  end
131
151
 
132
- key = CGI.unescape(key)
133
- opts = { bucket: bucket, key: key }
134
- opts[:version_id] = version_id if version_id
135
- client.head_object(opts).content_length
152
+ head_opts = { bucket: bucket, key: CGI.unescape(key) }.tap { |opts|
153
+ opts[:version_id] = version_id if version_id
154
+ opts[:part_number] = options[:part_number] if options[:part_number]
155
+ }
156
+
157
+ client.head_object(head_opts).to_h.tap { |head|
158
+ head.delete(:server_side_encryption)
159
+ head.delete(:ssekms_key_id)
160
+ }
136
161
  end
137
162
 
138
163
  def default_part_size(source_size)