aws-sdk-s3 1.13.0 → 1.146.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (128) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +1131 -0
  3. data/LICENSE.txt +202 -0
  4. data/VERSION +1 -0
  5. data/lib/aws-sdk-s3/bucket.rb +805 -91
  6. data/lib/aws-sdk-s3/bucket_acl.rb +66 -17
  7. data/lib/aws-sdk-s3/bucket_cors.rb +79 -17
  8. data/lib/aws-sdk-s3/bucket_lifecycle.rb +66 -19
  9. data/lib/aws-sdk-s3/bucket_lifecycle_configuration.rb +68 -19
  10. data/lib/aws-sdk-s3/bucket_logging.rb +68 -18
  11. data/lib/aws-sdk-s3/bucket_notification.rb +56 -20
  12. data/lib/aws-sdk-s3/bucket_policy.rb +107 -17
  13. data/lib/aws-sdk-s3/bucket_region_cache.rb +2 -0
  14. data/lib/aws-sdk-s3/bucket_request_payment.rb +60 -15
  15. data/lib/aws-sdk-s3/bucket_tagging.rb +71 -17
  16. data/lib/aws-sdk-s3/bucket_versioning.rb +133 -17
  17. data/lib/aws-sdk-s3/bucket_website.rb +78 -17
  18. data/lib/aws-sdk-s3/client.rb +16336 -3915
  19. data/lib/aws-sdk-s3/client_api.rb +1364 -173
  20. data/lib/aws-sdk-s3/customizations/bucket.rb +57 -38
  21. data/lib/aws-sdk-s3/customizations/errors.rb +27 -0
  22. data/lib/aws-sdk-s3/customizations/multipart_upload.rb +2 -0
  23. data/lib/aws-sdk-s3/customizations/object.rb +327 -53
  24. data/lib/aws-sdk-s3/customizations/object_summary.rb +12 -0
  25. data/lib/aws-sdk-s3/customizations/types/list_object_versions_output.rb +2 -0
  26. data/lib/aws-sdk-s3/customizations/types/permanent_redirect.rb +26 -0
  27. data/lib/aws-sdk-s3/customizations.rb +12 -1
  28. data/lib/aws-sdk-s3/encryption/client.rb +29 -8
  29. data/lib/aws-sdk-s3/encryption/decrypt_handler.rb +71 -29
  30. data/lib/aws-sdk-s3/encryption/default_cipher_provider.rb +43 -5
  31. data/lib/aws-sdk-s3/encryption/default_key_provider.rb +2 -0
  32. data/lib/aws-sdk-s3/encryption/encrypt_handler.rb +13 -2
  33. data/lib/aws-sdk-s3/encryption/errors.rb +2 -0
  34. data/lib/aws-sdk-s3/encryption/io_auth_decrypter.rb +11 -3
  35. data/lib/aws-sdk-s3/encryption/io_decrypter.rb +11 -3
  36. data/lib/aws-sdk-s3/encryption/io_encrypter.rb +2 -0
  37. data/lib/aws-sdk-s3/encryption/key_provider.rb +2 -0
  38. data/lib/aws-sdk-s3/encryption/kms_cipher_provider.rb +46 -11
  39. data/lib/aws-sdk-s3/encryption/materials.rb +8 -6
  40. data/lib/aws-sdk-s3/encryption/utils.rb +25 -0
  41. data/lib/aws-sdk-s3/encryption.rb +4 -0
  42. data/lib/aws-sdk-s3/encryptionV2/client.rb +570 -0
  43. data/lib/aws-sdk-s3/encryptionV2/decrypt_handler.rb +223 -0
  44. data/lib/aws-sdk-s3/encryptionV2/default_cipher_provider.rb +170 -0
  45. data/lib/aws-sdk-s3/encryptionV2/default_key_provider.rb +40 -0
  46. data/lib/aws-sdk-s3/encryptionV2/encrypt_handler.rb +65 -0
  47. data/lib/aws-sdk-s3/encryptionV2/errors.rb +37 -0
  48. data/lib/aws-sdk-s3/encryptionV2/io_auth_decrypter.rb +58 -0
  49. data/lib/aws-sdk-s3/encryptionV2/io_decrypter.rb +37 -0
  50. data/lib/aws-sdk-s3/encryptionV2/io_encrypter.rb +73 -0
  51. data/lib/aws-sdk-s3/encryptionV2/key_provider.rb +31 -0
  52. data/lib/aws-sdk-s3/encryptionV2/kms_cipher_provider.rb +173 -0
  53. data/lib/aws-sdk-s3/encryptionV2/materials.rb +60 -0
  54. data/lib/aws-sdk-s3/encryptionV2/utils.rb +103 -0
  55. data/lib/aws-sdk-s3/encryption_v2.rb +23 -0
  56. data/lib/aws-sdk-s3/endpoint_parameters.rb +178 -0
  57. data/lib/aws-sdk-s3/endpoint_provider.rb +591 -0
  58. data/lib/aws-sdk-s3/endpoints.rb +2590 -0
  59. data/lib/aws-sdk-s3/errors.rb +123 -1
  60. data/lib/aws-sdk-s3/event_streams.rb +20 -7
  61. data/lib/aws-sdk-s3/express_credentials.rb +55 -0
  62. data/lib/aws-sdk-s3/express_credentials_cache.rb +30 -0
  63. data/lib/aws-sdk-s3/express_credentials_provider.rb +36 -0
  64. data/lib/aws-sdk-s3/file_downloader.rb +184 -51
  65. data/lib/aws-sdk-s3/file_part.rb +16 -13
  66. data/lib/aws-sdk-s3/file_uploader.rb +39 -20
  67. data/lib/aws-sdk-s3/legacy_signer.rb +17 -25
  68. data/lib/aws-sdk-s3/multipart_file_uploader.rb +82 -23
  69. data/lib/aws-sdk-s3/multipart_stream_uploader.rb +202 -0
  70. data/lib/aws-sdk-s3/multipart_upload.rb +242 -31
  71. data/lib/aws-sdk-s3/multipart_upload_error.rb +2 -0
  72. data/lib/aws-sdk-s3/multipart_upload_part.rb +371 -47
  73. data/lib/aws-sdk-s3/object.rb +2260 -217
  74. data/lib/aws-sdk-s3/object_acl.rb +105 -24
  75. data/lib/aws-sdk-s3/object_copier.rb +9 -5
  76. data/lib/aws-sdk-s3/object_multipart_copier.rb +43 -19
  77. data/lib/aws-sdk-s3/object_summary.rb +1851 -186
  78. data/lib/aws-sdk-s3/object_version.rb +457 -74
  79. data/lib/aws-sdk-s3/plugins/accelerate.rb +17 -64
  80. data/lib/aws-sdk-s3/plugins/arn.rb +70 -0
  81. data/lib/aws-sdk-s3/plugins/bucket_dns.rb +7 -43
  82. data/lib/aws-sdk-s3/plugins/bucket_name_restrictions.rb +20 -3
  83. data/lib/aws-sdk-s3/plugins/dualstack.rb +7 -50
  84. data/lib/aws-sdk-s3/plugins/endpoints.rb +274 -0
  85. data/lib/aws-sdk-s3/plugins/expect_100_continue.rb +5 -4
  86. data/lib/aws-sdk-s3/plugins/express_session_auth.rb +91 -0
  87. data/lib/aws-sdk-s3/plugins/get_bucket_location_fix.rb +3 -1
  88. data/lib/aws-sdk-s3/plugins/http_200_errors.rb +11 -3
  89. data/lib/aws-sdk-s3/plugins/iad_regional_endpoint.rb +44 -0
  90. data/lib/aws-sdk-s3/plugins/location_constraint.rb +5 -1
  91. data/lib/aws-sdk-s3/plugins/md5s.rb +35 -27
  92. data/lib/aws-sdk-s3/plugins/redirects.rb +5 -1
  93. data/lib/aws-sdk-s3/plugins/s3_host_id.rb +2 -0
  94. data/lib/aws-sdk-s3/plugins/s3_signer.rb +60 -91
  95. data/lib/aws-sdk-s3/plugins/skip_whole_multipart_get_checksums.rb +31 -0
  96. data/lib/aws-sdk-s3/plugins/sse_cpk.rb +3 -1
  97. data/lib/aws-sdk-s3/plugins/streaming_retry.rb +139 -0
  98. data/lib/aws-sdk-s3/plugins/url_encoded_keys.rb +2 -0
  99. data/lib/aws-sdk-s3/presigned_post.rb +160 -99
  100. data/lib/aws-sdk-s3/presigner.rb +172 -77
  101. data/lib/aws-sdk-s3/resource.rb +122 -6
  102. data/lib/aws-sdk-s3/types.rb +13937 -5517
  103. data/lib/aws-sdk-s3/waiters.rb +67 -1
  104. data/lib/aws-sdk-s3.rb +16 -6
  105. data/sig/bucket.rbs +212 -0
  106. data/sig/bucket_acl.rbs +78 -0
  107. data/sig/bucket_cors.rbs +69 -0
  108. data/sig/bucket_lifecycle.rbs +88 -0
  109. data/sig/bucket_lifecycle_configuration.rbs +111 -0
  110. data/sig/bucket_logging.rbs +76 -0
  111. data/sig/bucket_notification.rbs +114 -0
  112. data/sig/bucket_policy.rbs +59 -0
  113. data/sig/bucket_request_payment.rbs +54 -0
  114. data/sig/bucket_tagging.rbs +65 -0
  115. data/sig/bucket_versioning.rbs +77 -0
  116. data/sig/bucket_website.rbs +93 -0
  117. data/sig/client.rbs +2360 -0
  118. data/sig/errors.rbs +34 -0
  119. data/sig/multipart_upload.rbs +110 -0
  120. data/sig/multipart_upload_part.rbs +105 -0
  121. data/sig/object.rbs +436 -0
  122. data/sig/object_acl.rbs +86 -0
  123. data/sig/object_summary.rbs +334 -0
  124. data/sig/object_version.rbs +131 -0
  125. data/sig/resource.rbs +124 -0
  126. data/sig/types.rbs +2562 -0
  127. data/sig/waiters.rbs +83 -0
  128. metadata +70 -16
@@ -1,14 +1,19 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Aws
2
4
  module S3
3
5
  class Object
4
-
5
6
  alias size content_length
6
7
 
8
+ # Make the method redefinable
9
+ alias_method :copy_from, :copy_from
10
+
7
11
  # Copies another object to this object. Use `multipart_copy: true`
8
12
  # for large objects. This is required for objects that exceed 5GB.
9
13
  #
10
- # @param [S3::Object, S3::ObjectVersion, S3::ObjectSummary, String, Hash] source
11
- # Where to copy object data from. `source` must be one of the following:
14
+ # @param [S3::Object, S3::ObjectVersion, S3::ObjectSummary, String, Hash]
15
+ # source Where to copy object data from. `source` must be one of the
16
+ # following:
12
17
  #
13
18
  # * {Aws::S3::Object}
14
19
  # * {Aws::S3::ObjectSummary}
@@ -22,10 +27,14 @@ module Aws
22
27
  # necessary for objects larger than 5GB and can provide
23
28
  # performance improvements on large objects. Amazon S3 does
24
29
  # not accept multipart copies for objects smaller than 5MB.
30
+ # Object metadata such as Content-Type will be copied, however,
31
+ # Checksums are not copied.
25
32
  #
26
33
  # @option options [Integer] :content_length Only used when
27
34
  # `:multipart_copy` is `true`. Passing this options avoids a HEAD
28
- # request to query the source object size.
35
+ # request to query the source object size but prevents object metadata
36
+ # from being copied. Raises an `ArgumentError` if
37
+ # this option is provided when `:multipart_copy` is `false` or not set.
29
38
  #
30
39
  # @option options [S3::Client] :copy_source_client Only used when
31
40
  # `:multipart_copy` is `true` and the source object is in a
@@ -37,6 +46,14 @@ module Aws
37
46
  # different region. You do not need to specify this option
38
47
  # if you have provided a `:source_client` or a `:content_length`.
39
48
  #
49
+ # @option options [Boolean] :use_source_parts (false) Only used when
50
+ # `:multipart_copy` is `true`. Use part sizes defined on the source
51
+ # object if any exist. If copying or moving an object that
52
+ # is already multipart, this does not re-part the object, instead
53
+ # re-using the part definitions on the original. That means the etag
54
+ # and any checksums will not change. This is especially useful if the
55
+ # source object has parts with varied sizes.
56
+ #
40
57
  # @example Basic object copy
41
58
  #
42
59
  # bucket = Aws::S3::Bucket.new('target-bucket')
@@ -59,11 +76,13 @@ module Aws
59
76
  # @see #copy_to
60
77
  #
61
78
  def copy_from(source, options = {})
62
- if Hash === source && source[:copy_source]
63
- # for backwards compatibility
64
- @client.copy_object(source.merge(bucket: bucket_name, key: key))
65
- else
66
- ObjectCopier.new(self, options).copy_from(source, options)
79
+ Aws::Plugins::UserAgent.feature('resource') do
80
+ if Hash === source && source[:copy_source]
81
+ # for backwards compatibility
82
+ @client.copy_object(source.merge(bucket: bucket_name, key: key))
83
+ else
84
+ ObjectCopier.new(self, options).copy_from(source, options)
85
+ end
67
86
  end
68
87
  end
69
88
 
@@ -100,11 +119,14 @@ module Aws
100
119
  # object.copy_to('src-bucket/src-key', multipart_copy: true)
101
120
  #
102
121
  def copy_to(target, options = {})
103
- ObjectCopier.new(self, options).copy_to(target, options)
122
+ Aws::Plugins::UserAgent.feature('resource') do
123
+ ObjectCopier.new(self, options).copy_to(target, options)
124
+ end
104
125
  end
105
126
 
106
- # Copies and deletes the current object. The object will only be
107
- # deleted if the copy operation succeeds.
127
+ # Copies and deletes the current object. The object will only be deleted
128
+ # if the copy operation succeeds.
129
+ #
108
130
  # @param (see Object#copy_to)
109
131
  # @option (see Object#copy_to)
110
132
  # @return [void]
@@ -129,10 +151,7 @@ module Aws
129
151
  client.config.credentials,
130
152
  client.config.region,
131
153
  bucket_name,
132
- {
133
- key: key,
134
- url: bucket.url,
135
- }.merge(options)
154
+ { key: key, url: bucket.url }.merge(options)
136
155
  )
137
156
  end
138
157
 
@@ -149,21 +168,35 @@ module Aws
149
168
  # obj.presigned_url(:put, acl: 'public-read')
150
169
  # #=> "https://bucket-name.s3.amazonaws.com/object-key?..."
151
170
  #
152
- # @param [Symbol] http_method
153
- # The HTTP method to generate a presigned URL for. Valid values
154
- # are `:get`, `:put`, `:head`, and `:delete`.
171
+ # @example Pre-signed UploadPart PUT
172
+ #
173
+ # # the object uploaded using this URL will be publicly accessible
174
+ # obj.presigned_url(:upload_part, part_number: 1, upload_id: 'uploadIdToken')
175
+ # #=> "https://bucket-name.s3.amazonaws.com/object-key?..."
176
+ #
177
+ # @param [Symbol] method
178
+ # The S3 operation to generate a presigned URL for. Valid values
179
+ # are `:get`, `:put`, `:head`, `:delete`, `:create_multipart_upload`,
180
+ # `:list_multipart_uploads`, `:complete_multipart_upload`,
181
+ # `:abort_multipart_upload`, `:list_parts`, and `:upload_part`.
155
182
  #
156
183
  # @param [Hash] params
157
184
  # Additional request parameters to use when generating the pre-signed
158
185
  # URL. See the related documentation in {Client} for accepted
159
186
  # params.
160
187
  #
161
- # | HTTP Method | Client Method |
162
- # |---------------|------------------------|
163
- # | `:get` | {Client#get_object} |
164
- # | `:put` | {Client#put_object} |
165
- # | `:head` | {Client#head_object} |
166
- # | `:delete` | {Client#delete_object} |
188
+ # | Method | Client Method |
189
+ # |------------------------------|------------------------------------|
190
+ # | `:get` | {Client#get_object} |
191
+ # | `:put` | {Client#put_object} |
192
+ # | `:head` | {Client#head_object} |
193
+ # | `:delete` | {Client#delete_object} |
194
+ # | `:create_multipart_upload` | {Client#create_multipart_upload} |
195
+ # | `:list_multipart_uploads` | {Client#list_multipart_uploads} |
196
+ # | `:complete_multipart_upload` | {Client#complete_multipart_upload} |
197
+ # | `:abort_multipart_upload` | {Client#abort_multipart_upload} |
198
+ # | `:list_parts` | {Client#list_parts} |
199
+ # | `:upload_part` | {Client#upload_part} |
167
200
  #
168
201
  # @option params [Boolean] :virtual_host (false) When `true` the
169
202
  # presigned URL will use the bucket name as a virtual host.
@@ -184,12 +217,90 @@ module Aws
184
217
  #
185
218
  # @return [String]
186
219
  #
187
- def presigned_url(http_method, params = {})
220
+ def presigned_url(method, params = {})
188
221
  presigner = Presigner.new(client: client)
189
- presigner.presigned_url("#{http_method.downcase}_object", params.merge(
190
- bucket: bucket_name,
191
- key: key,
192
- ))
222
+
223
+ if %w(delete head get put).include?(method.to_s)
224
+ method = "#{method}_object".to_sym
225
+ end
226
+
227
+ presigner.presigned_url(
228
+ method.downcase,
229
+ params.merge(bucket: bucket_name, key: key)
230
+ )
231
+ end
232
+
233
+ # Allows you to create presigned URL requests for S3 operations. This
234
+ # method returns a tuple containing the URL and the signed X-amz-* headers
235
+ # to be used with the presigned url.
236
+ #
237
+ # @example Pre-signed GET URL, valid for one hour
238
+ #
239
+ # obj.presigned_request(:get, expires_in: 3600)
240
+ # #=> ["https://bucket-name.s3.amazonaws.com/object-key?...", {}]
241
+ #
242
+ # @example Pre-signed PUT with a canned ACL
243
+ #
244
+ # # the object uploaded using this URL will be publicly accessible
245
+ # obj.presigned_request(:put, acl: 'public-read')
246
+ # #=> ["https://bucket-name.s3.amazonaws.com/object-key?...",
247
+ # {"x-amz-acl"=>"public-read"}]
248
+ #
249
+ # @param [Symbol] method
250
+ # The S3 operation to generate a presigned request for. Valid values
251
+ # are `:get`, `:put`, `:head`, `:delete`, `:create_multipart_upload`,
252
+ # `:list_multipart_uploads`, `:complete_multipart_upload`,
253
+ # `:abort_multipart_upload`, `:list_parts`, and `:upload_part`.
254
+ #
255
+ # @param [Hash] params
256
+ # Additional request parameters to use when generating the pre-signed
257
+ # request. See the related documentation in {Client} for accepted
258
+ # params.
259
+ #
260
+ # | Method | Client Method |
261
+ # |------------------------------|------------------------------------|
262
+ # | `:get` | {Client#get_object} |
263
+ # | `:put` | {Client#put_object} |
264
+ # | `:head` | {Client#head_object} |
265
+ # | `:delete` | {Client#delete_object} |
266
+ # | `:create_multipart_upload` | {Client#create_multipart_upload} |
267
+ # | `:list_multipart_uploads` | {Client#list_multipart_uploads} |
268
+ # | `:complete_multipart_upload` | {Client#complete_multipart_upload} |
269
+ # | `:abort_multipart_upload` | {Client#abort_multipart_upload} |
270
+ # | `:list_parts` | {Client#list_parts} |
271
+ # | `:upload_part` | {Client#upload_part} |
272
+ #
273
+ # @option params [Boolean] :virtual_host (false) When `true` the
274
+ # presigned URL will use the bucket name as a virtual host.
275
+ #
276
+ # bucket = Aws::S3::Bucket.new('my.bucket.com')
277
+ # bucket.object('key').presigned_request(virtual_host: true)
278
+ # #=> ["http://my.bucket.com/key?...", {}]
279
+ #
280
+ # @option params [Integer] :expires_in (900) Number of seconds before
281
+ # the pre-signed URL expires. This may not exceed one week (604800
282
+ # seconds). Note that the pre-signed URL is also only valid as long as
283
+ # credentials used to sign it are. For example, when using IAM roles,
284
+ # temporary tokens generated for signing also have a default expiration
285
+ # which will affect the effective expiration of the pre-signed URL.
286
+ #
287
+ # @raise [ArgumentError] Raised if `:expires_in` exceeds one week
288
+ # (604800 seconds).
289
+ #
290
+ # @return [String, Hash] A tuple with a presigned URL and headers that
291
+ # should be included with the request.
292
+ #
293
+ def presigned_request(method, params = {})
294
+ presigner = Presigner.new(client: client)
295
+
296
+ if %w(delete head get put).include?(method.to_s)
297
+ method = "#{method}_object".to_sym
298
+ end
299
+
300
+ presigner.presigned_request(
301
+ method.downcase,
302
+ params.merge(bucket: bucket_name, key: key)
303
+ )
193
304
  end
194
305
 
195
306
  # Returns the public (un-signed) URL for this object.
@@ -197,15 +308,22 @@ module Aws
197
308
  # s3.bucket('bucket-name').object('obj-key').public_url
198
309
  # #=> "https://bucket-name.s3.amazonaws.com/obj-key"
199
310
  #
200
- # To use virtual hosted bucket url (disables https):
311
+ # To use virtual hosted bucket url.
312
+ # Uses https unless secure: false is set. If the bucket
313
+ # name contains dots (.) then you will need to set secure: false.
201
314
  #
202
- # s3.bucket('my.bucket.com').object('key').public_url(virtual_host: true)
203
- # #=> "http://my.bucket.com/key"
315
+ # s3.bucket('my-bucket.com').object('key')
316
+ # .public_url(virtual_host: true)
317
+ # #=> "https://my-bucket.com/key"
204
318
  #
205
319
  # @option options [Boolean] :virtual_host (false) When `true`, the bucket
206
320
  # name will be used as the host name. This is useful when you have
207
321
  # a CNAME configured for the bucket.
208
322
  #
323
+ # @option options [Boolean] :secure (true) When `false`, http
324
+ # will be used with virtual_host. This is required when
325
+ # the bucket name has a dot (.) in it.
326
+ #
209
327
  # @return [String]
210
328
  def public_url(options = {})
211
329
  url = URI.parse(bucket.url(options))
@@ -214,26 +332,127 @@ module Aws
214
332
  url.to_s
215
333
  end
216
334
 
335
+ # Uploads a stream in a streaming fashion to the current object in S3.
336
+ #
337
+ # Passed chunks automatically split into multipart upload parts and the
338
+ # parts are uploaded in parallel. This allows for streaming uploads that
339
+ # never touch the disk.
340
+ #
341
+ # Note that this is known to have issues in JRuby until jruby-9.1.15.0,
342
+ # so avoid using this with older versions of JRuby.
343
+ #
344
+ # @example Streaming chunks of data
345
+ # obj.upload_stream do |write_stream|
346
+ # 10.times { write_stream << 'foo' }
347
+ # end
348
+ # @example Streaming chunks of data
349
+ # obj.upload_stream do |write_stream|
350
+ # IO.copy_stream(IO.popen('ls'), write_stream)
351
+ # end
352
+ # @example Streaming chunks of data
353
+ # obj.upload_stream do |write_stream|
354
+ # IO.copy_stream(STDIN, write_stream)
355
+ # end
356
+ # @param [Hash] options
357
+ # Additional options for {Client#create_multipart_upload},
358
+ # {Client#complete_multipart_upload},
359
+ # and {Client#upload_part} can be provided.
360
+ #
361
+ # @option options [Integer] :thread_count (10) The number of parallel
362
+ # multipart uploads
363
+ #
364
+ # @option options [Boolean] :tempfile (false) Normally read data is stored
365
+ # in memory when building the parts in order to complete the underlying
366
+ # multipart upload. By passing `:tempfile => true` data read will be
367
+ # temporarily stored on disk reducing the memory footprint vastly.
368
+ #
369
+ # @option options [Integer] :part_size (5242880)
370
+ # Define how big each part size but the last should be.
371
+ # Default `:part_size` is `5 * 1024 * 1024`.
372
+ #
373
+ # @raise [MultipartUploadError] If an object is being uploaded in
374
+ # parts, and the upload can not be completed, then the upload is
375
+ # aborted and this error is raised. The raised error has a `#errors`
376
+ # method that returns the failures that caused the upload to be
377
+ # aborted.
378
+ #
379
+ # @return [Boolean] Returns `true` when the object is uploaded
380
+ # without any errors.
381
+ #
382
+ # @see Client#create_multipart_upload
383
+ # @see Client#complete_multipart_upload
384
+ # @see Client#upload_part
385
+ def upload_stream(options = {}, &block)
386
+ uploading_options = options.dup
387
+ uploader = MultipartStreamUploader.new(
388
+ client: client,
389
+ thread_count: uploading_options.delete(:thread_count),
390
+ tempfile: uploading_options.delete(:tempfile),
391
+ part_size: uploading_options.delete(:part_size)
392
+ )
393
+ Aws::Plugins::UserAgent.feature('resource') do
394
+ uploader.upload(
395
+ uploading_options.merge(bucket: bucket_name, key: key),
396
+ &block
397
+ )
398
+ end
399
+ true
400
+ end
401
+
217
402
  # Uploads a file from disk to the current object in S3.
218
403
  #
219
404
  # # small files are uploaded in a single API call
220
405
  # obj.upload_file('/path/to/file')
221
406
  #
222
- # Files larger than `:multipart_threshold` are uploaded using the
223
- # Amazon S3 multipart upload APIs.
407
+ # Files larger than or equal to `:multipart_threshold` are uploaded
408
+ # using the Amazon S3 multipart upload APIs.
224
409
  #
225
410
  # # large files are automatically split into parts
226
411
  # # and the parts are uploaded in parallel
227
412
  # obj.upload_file('/path/to/very_large_file')
228
413
  #
229
- # @param [String,Pathname,File,Tempfile] source A file or path to a file
230
- # on the local file system that should be uploaded to this object.
231
- # If you pass an open file object, then it is your responsibility
232
- # to close the file object once the upload completes.
233
- #
234
- # @option options [Integer] :multipart_threshold (15728640) Files larger
235
- # than `:multipart_threshold` are uploaded using the S3 multipart APIs.
236
- # Default threshold is 15MB.
414
+ # The response of the S3 upload API is yielded if a block given.
415
+ #
416
+ # # API response will have etag value of the file
417
+ # obj.upload_file('/path/to/file') do |response|
418
+ # etag = response.etag
419
+ # end
420
+ #
421
+ # You can provide a callback to monitor progress of the upload:
422
+ #
423
+ # # bytes and totals are each an array with 1 entry per part
424
+ # progress = Proc.new do |bytes, totals|
425
+ # puts bytes.map.with_index { |b, i| "Part #{i+1}: #{b} / #{totals[i]}"}.join(' ') + "Total: #{100.0 * bytes.sum / totals.sum }%" }
426
+ # end
427
+ # obj.upload_file('/path/to/file', progress_callback: progress)
428
+ #
429
+ # @param [String, Pathname, File, Tempfile] source A file on the local
430
+ # file system that will be uploaded as this object. This can either be
431
+ # a String or Pathname to the file, an open File object, or an open
432
+ # Tempfile object. If you pass an open File or Tempfile object, then
433
+ # you are responsible for closing it after the upload completes. When
434
+ # using an open Tempfile, rewind it before uploading or else the object
435
+ # will be empty.
436
+ #
437
+ # @param [Hash] options
438
+ # Additional options for {Client#put_object}
439
+ # when file sizes below the multipart threshold. For files larger than
440
+ # the multipart threshold, options for {Client#create_multipart_upload},
441
+ # {Client#complete_multipart_upload},
442
+ # and {Client#upload_part} can be provided.
443
+ #
444
+ # @option options [Integer] :multipart_threshold (104857600) Files larger
445
+ # than or equal to `:multipart_threshold` are uploaded using the S3
446
+ # multipart APIs.
447
+ # Default threshold is 100MB.
448
+ #
449
+ # @option options [Integer] :thread_count (10) The number of parallel
450
+ # multipart uploads. This option is not used if the file is smaller than
451
+ # `:multipart_threshold`.
452
+ #
453
+ # @option options [Proc] :progress_callback
454
+ # A Proc that will be called when each chunk of the upload is sent.
455
+ # It will be invoked with [bytes_read], [total_sizes]
237
456
  #
238
457
  # @raise [MultipartUploadError] If an object is being uploaded in
239
458
  # parts, and the upload can not be completed, then the upload is
@@ -244,12 +463,23 @@ module Aws
244
463
  # @return [Boolean] Returns `true` when the object is uploaded
245
464
  # without any errors.
246
465
  #
466
+ # @see Client#put_object
467
+ # @see Client#create_multipart_upload
468
+ # @see Client#complete_multipart_upload
469
+ # @see Client#upload_part
247
470
  def upload_file(source, options = {})
248
471
  uploading_options = options.dup
249
472
  uploader = FileUploader.new(
250
473
  multipart_threshold: uploading_options.delete(:multipart_threshold),
251
- client: client)
252
- uploader.upload(source, uploading_options.merge(bucket: bucket_name, key: key))
474
+ client: client
475
+ )
476
+ response = Aws::Plugins::UserAgent.feature('resource') do
477
+ uploader.upload(
478
+ source,
479
+ uploading_options.merge(bucket: bucket_name, key: key)
480
+ )
481
+ end
482
+ yield response if block_given?
253
483
  true
254
484
  end
255
485
 
@@ -264,7 +494,20 @@ module Aws
264
494
  # # and the parts are downloaded in parallel
265
495
  # obj.download_file('/path/to/very_large_file')
266
496
  #
267
- # @param [String] destination Where to download the file to
497
+ # You can provide a callback to monitor progress of the download:
498
+ #
499
+ # # bytes and part_sizes are each an array with 1 entry per part
500
+ # # part_sizes may not be known until the first bytes are retrieved
501
+ # progress = Proc.new do |bytes, part_sizes, file_size|
502
+ # puts bytes.map.with_index { |b, i| "Part #{i+1}: #{b} / #{part_sizes[i]}"}.join(' ') + "Total: #{100.0 * bytes.sum / file_size}%" }
503
+ # end
504
+ # obj.download_file('/path/to/file', progress_callback: progress)
505
+ #
506
+ # @param [String] destination Where to download the file to.
507
+ #
508
+ # @param [Hash] options
509
+ # Additional options for {Client#get_object} and #{Client#head_object}
510
+ # may be provided.
268
511
  #
269
512
  # @option options [String] mode `auto`, `single_request`, `get_range`
270
513
  # `single_request` mode forces only 1 GET request is made in download,
@@ -272,17 +515,48 @@ module Aws
272
515
  # customizing each range size in multipart_download,
273
516
  # By default, `auto` mode is enabled, which performs multipart_download
274
517
  #
275
- # @option options [String] chunk_size required in get_range mode
518
+ # @option options [Integer] chunk_size required in get_range mode.
276
519
  #
277
- # @option options [String] thread_count Customize threads used in multipart
278
- # download, if not provided, 10 is default value
520
+ # @option options [Integer] thread_count (10) Customize threads used in
521
+ # the multipart download.
279
522
  #
280
- # @return [Boolean] Returns `true` when the file is downloaded
281
- # without any errors.
523
+ # @option options [String] version_id The object version id used to
524
+ # retrieve the object. For more about object versioning, see:
525
+ # https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectVersioning.html
526
+ #
527
+ # @option options [String] checksum_mode (ENABLED) When `ENABLED` and
528
+ # the object has a stored checksum, it will be used to validate the
529
+ # download and will raise an `Aws::Errors::ChecksumError` if
530
+ # checksum validation fails. You may provide a `on_checksum_validated`
531
+ # callback if you need to verify that validation occurred and which
532
+ # algorithm was used. To disable checksum validation, set
533
+ # `checksum_mode` to "DISABLED".
534
+ #
535
+ # @option options [Callable] on_checksum_validated Called each time a
536
+ # request's checksum is validated with the checksum algorithm and the
537
+ # response. For multipart downloads, this will be called for each
538
+ # part that is downloaded and validated.
539
+ #
540
+ # @option options [Proc] :progress_callback
541
+ # A Proc that will be called when each chunk of the download is received.
542
+ # It will be invoked with [bytes_read], [part_sizes], file_size.
543
+ # When the object is downloaded as parts (rather than by ranges), the
544
+ # part_sizes will not be known ahead of time and will be nil in the
545
+ # callback until the first bytes in the part are received.
546
+ #
547
+ # @return [Boolean] Returns `true` when the file is downloaded without
548
+ # any errors.
549
+ #
550
+ # @see Client#get_object
551
+ # @see Client#head_object
282
552
  def download_file(destination, options = {})
283
553
  downloader = FileDownloader.new(client: client)
284
- downloader.download(
285
- destination, options.merge(bucket: bucket_name, key: key))
554
+ Aws::Plugins::UserAgent.feature('resource') do
555
+ downloader.download(
556
+ destination,
557
+ options.merge(bucket: bucket_name, key: key)
558
+ )
559
+ end
286
560
  true
287
561
  end
288
562
  end
@@ -1,9 +1,14 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Aws
2
4
  module S3
3
5
  class ObjectSummary
4
6
 
5
7
  alias content_length size
6
8
 
9
+ # Make the method redefinable
10
+ alias_method :copy_from, :copy_from
11
+
7
12
  # @param (see Object#copy_from)
8
13
  # @options (see Object#copy_from)
9
14
  # @return (see Object#copy_from)
@@ -60,6 +65,13 @@ module Aws
60
65
  object.upload_file(source, options)
61
66
  end
62
67
 
68
+ # @options (see Object#upload_stream)
69
+ # @return (see Object#upload_stream)
70
+ # @see Object#upload_stream
71
+ def upload_stream(options = {}, &block)
72
+ object.upload_stream(options, &block)
73
+ end
74
+
63
75
  # @param (see Object#download_file)
64
76
  # @options (see Object#download_file)
65
77
  # @return (see Object#download_file)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Aws::S3::Types::ListObjectVersionsOutput
2
4
 
3
5
  # TODO : Remove this customization once the resource code
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Aws
4
+ module S3
5
+ module Types
6
+ # This error is not modeled.
7
+ #
8
+ # The bucket you are attempting to access must be addressed using the
9
+ # specified endpoint. Please send all future requests to this endpoint.
10
+ #
11
+ # @!attribute [rw] endpoint
12
+ # @return [String]
13
+ #
14
+ # @!attribute [rw] bucket
15
+ # @return [String]
16
+ #
17
+ # @!attribute [rw] message
18
+ # @return [String]
19
+ #
20
+ class PermanentRedirect < Struct.new(:endpoint, :bucket, :region, :message)
21
+ SENSITIVE = []
22
+ include Aws::Structure
23
+ end
24
+ end
25
+ end
26
+ end
@@ -1,23 +1,34 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # utility classes
2
4
  require 'aws-sdk-s3/bucket_region_cache'
3
5
  require 'aws-sdk-s3/encryption'
6
+ require 'aws-sdk-s3/encryption_v2'
4
7
  require 'aws-sdk-s3/file_part'
5
8
  require 'aws-sdk-s3/file_uploader'
6
9
  require 'aws-sdk-s3/file_downloader'
7
10
  require 'aws-sdk-s3/legacy_signer'
8
11
  require 'aws-sdk-s3/multipart_file_uploader'
12
+ require 'aws-sdk-s3/multipart_stream_uploader'
9
13
  require 'aws-sdk-s3/multipart_upload_error'
10
14
  require 'aws-sdk-s3/object_copier'
11
15
  require 'aws-sdk-s3/object_multipart_copier'
12
16
  require 'aws-sdk-s3/presigned_post'
13
17
  require 'aws-sdk-s3/presigner'
14
18
 
19
+ # s3 express session auth
20
+ require 'aws-sdk-s3/express_credentials'
21
+ require 'aws-sdk-s3/express_credentials_cache'
22
+ require 'aws-sdk-s3/express_credentials_provider'
23
+
15
24
  # customizations to generated classes
16
25
  require 'aws-sdk-s3/customizations/bucket'
26
+ require 'aws-sdk-s3/customizations/errors'
17
27
  require 'aws-sdk-s3/customizations/object'
18
28
  require 'aws-sdk-s3/customizations/object_summary'
19
29
  require 'aws-sdk-s3/customizations/multipart_upload'
20
30
  require 'aws-sdk-s3/customizations/types/list_object_versions_output'
31
+ require 'aws-sdk-s3/customizations/types/permanent_redirect'
21
32
 
22
33
  [
23
34
  Aws::S3::Object::Collection,
@@ -25,6 +36,6 @@ require 'aws-sdk-s3/customizations/types/list_object_versions_output'
25
36
  Aws::S3::ObjectVersion::Collection,
26
37
  ].each do |klass|
27
38
  klass.send(:alias_method, :delete, :batch_delete!)
28
- klass.send(:extend, Aws::Deprecations)
39
+ klass.extend Aws::Deprecations
29
40
  klass.send(:deprecated, :delete, use: :batch_delete!)
30
41
  end