aws-sdk-s3 1.114.0 → 1.136.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +163 -0
- data/VERSION +1 -1
- data/lib/aws-sdk-s3/bucket.rb +123 -61
- data/lib/aws-sdk-s3/bucket_acl.rb +9 -3
- data/lib/aws-sdk-s3/bucket_cors.rb +12 -4
- data/lib/aws-sdk-s3/bucket_lifecycle.rb +12 -4
- data/lib/aws-sdk-s3/bucket_lifecycle_configuration.rb +12 -4
- data/lib/aws-sdk-s3/bucket_logging.rb +9 -3
- data/lib/aws-sdk-s3/bucket_notification.rb +9 -3
- data/lib/aws-sdk-s3/bucket_policy.rb +12 -4
- data/lib/aws-sdk-s3/bucket_request_payment.rb +9 -3
- data/lib/aws-sdk-s3/bucket_tagging.rb +12 -4
- data/lib/aws-sdk-s3/bucket_versioning.rb +15 -5
- data/lib/aws-sdk-s3/bucket_website.rb +12 -4
- data/lib/aws-sdk-s3/client.rb +2084 -1724
- data/lib/aws-sdk-s3/client_api.rb +213 -189
- data/lib/aws-sdk-s3/customizations/bucket.rb +23 -47
- data/lib/aws-sdk-s3/customizations/errors.rb +27 -0
- data/lib/aws-sdk-s3/customizations/object.rb +95 -19
- data/lib/aws-sdk-s3/customizations/types/permanent_redirect.rb +26 -0
- data/lib/aws-sdk-s3/customizations.rb +2 -0
- data/lib/aws-sdk-s3/encryption/client.rb +6 -2
- data/lib/aws-sdk-s3/encryption/kms_cipher_provider.rb +13 -9
- data/lib/aws-sdk-s3/encryptionV2/client.rb +6 -2
- data/lib/aws-sdk-s3/encryptionV2/decrypt_handler.rb +1 -0
- data/lib/aws-sdk-s3/encryptionV2/kms_cipher_provider.rb +10 -6
- data/lib/aws-sdk-s3/endpoint_parameters.rb +146 -0
- data/lib/aws-sdk-s3/endpoint_provider.rb +509 -0
- data/lib/aws-sdk-s3/endpoints.rb +2150 -0
- data/lib/aws-sdk-s3/file_downloader.rb +170 -44
- data/lib/aws-sdk-s3/file_uploader.rb +8 -6
- data/lib/aws-sdk-s3/multipart_stream_uploader.rb +41 -13
- data/lib/aws-sdk-s3/multipart_upload.rb +27 -13
- data/lib/aws-sdk-s3/multipart_upload_part.rb +20 -10
- data/lib/aws-sdk-s3/object.rb +156 -110
- data/lib/aws-sdk-s3/object_acl.rb +14 -6
- data/lib/aws-sdk-s3/object_copier.rb +7 -5
- data/lib/aws-sdk-s3/object_multipart_copier.rb +41 -19
- data/lib/aws-sdk-s3/object_summary.rb +149 -94
- data/lib/aws-sdk-s3/object_version.rb +55 -21
- data/lib/aws-sdk-s3/plugins/accelerate.rb +3 -50
- data/lib/aws-sdk-s3/plugins/arn.rb +0 -184
- data/lib/aws-sdk-s3/plugins/bucket_dns.rb +3 -39
- data/lib/aws-sdk-s3/plugins/bucket_name_restrictions.rb +1 -6
- data/lib/aws-sdk-s3/plugins/dualstack.rb +1 -49
- data/lib/aws-sdk-s3/plugins/endpoints.rb +262 -0
- data/lib/aws-sdk-s3/plugins/expect_100_continue.rb +2 -1
- data/lib/aws-sdk-s3/plugins/iad_regional_endpoint.rb +0 -29
- data/lib/aws-sdk-s3/plugins/s3_signer.rb +32 -126
- data/lib/aws-sdk-s3/presigned_post.rb +61 -59
- data/lib/aws-sdk-s3/presigner.rb +24 -35
- data/lib/aws-sdk-s3/resource.rb +7 -3
- data/lib/aws-sdk-s3/types.rb +858 -4125
- data/lib/aws-sdk-s3.rb +5 -1
- metadata +12 -11
- data/lib/aws-sdk-s3/arn/access_point_arn.rb +0 -69
- data/lib/aws-sdk-s3/arn/multi_region_access_point_arn.rb +0 -68
- data/lib/aws-sdk-s3/arn/object_lambda_arn.rb +0 -69
- data/lib/aws-sdk-s3/arn/outpost_access_point_arn.rb +0 -74
- data/lib/aws-sdk-s3/plugins/object_lambda_endpoint.rb +0 -25
@@ -105,6 +105,20 @@ module Aws::S3
|
|
105
105
|
data[:owner]
|
106
106
|
end
|
107
107
|
|
108
|
+
# Specifies the restoration status of an object. Objects in certain
|
109
|
+
# storage classes must be restored before they can be retrieved. For
|
110
|
+
# more information about these storage classes and how to work with
|
111
|
+
# archived objects, see [ Working with archived objects][1] in the
|
112
|
+
# *Amazon S3 User Guide*.
|
113
|
+
#
|
114
|
+
#
|
115
|
+
#
|
116
|
+
# [1]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/archived-objects.html
|
117
|
+
# @return [Types::RestoreStatus]
|
118
|
+
def restore_status
|
119
|
+
data[:restore_status]
|
120
|
+
end
|
121
|
+
|
108
122
|
# @!endgroup
|
109
123
|
|
110
124
|
# @return [Client]
|
@@ -229,7 +243,9 @@ module Aws::S3
|
|
229
243
|
:retry
|
230
244
|
end
|
231
245
|
end
|
232
|
-
Aws::
|
246
|
+
Aws::Plugins::UserAgent.feature('resource') do
|
247
|
+
Aws::Waiters::Waiter.new(options).wait({})
|
248
|
+
end
|
233
249
|
end
|
234
250
|
|
235
251
|
# @!group Actions
|
@@ -251,9 +267,11 @@ module Aws::S3
|
|
251
267
|
# @option options [String] :request_payer
|
252
268
|
# Confirms that the requester knows that they will be charged for the
|
253
269
|
# request. Bucket owners need not specify this parameter in their
|
254
|
-
# requests.
|
255
|
-
# Pays
|
256
|
-
#
|
270
|
+
# requests. If either the source or destination Amazon S3 bucket has
|
271
|
+
# Requester Pays enabled, the requester will pay for corresponding
|
272
|
+
# charges to copy the object. For information about downloading objects
|
273
|
+
# from Requester Pays buckets, see [Downloading Objects in Requester
|
274
|
+
# Pays Buckets][1] in the *Amazon S3 User Guide*.
|
257
275
|
#
|
258
276
|
#
|
259
277
|
#
|
@@ -273,7 +291,9 @@ module Aws::S3
|
|
273
291
|
key: @object_key,
|
274
292
|
version_id: @id
|
275
293
|
)
|
276
|
-
resp =
|
294
|
+
resp = Aws::Plugins::UserAgent.feature('resource') do
|
295
|
+
@client.delete_object(options)
|
296
|
+
end
|
277
297
|
resp.data
|
278
298
|
end
|
279
299
|
|
@@ -315,7 +335,7 @@ module Aws::S3
|
|
315
335
|
# @option options [String] :range
|
316
336
|
# Downloads the specified range bytes of an object. For more information
|
317
337
|
# about the HTTP Range header, see
|
318
|
-
# [https://www.
|
338
|
+
# [https://www.rfc-editor.org/rfc/rfc9110.html#name-range][1].
|
319
339
|
#
|
320
340
|
# <note markdown="1"> Amazon S3 doesn't support retrieving multiple ranges of data per
|
321
341
|
# `GET` request.
|
@@ -324,7 +344,7 @@ module Aws::S3
|
|
324
344
|
#
|
325
345
|
#
|
326
346
|
#
|
327
|
-
# [1]: https://www.
|
347
|
+
# [1]: https://www.rfc-editor.org/rfc/rfc9110.html#name-range
|
328
348
|
# @option options [String] :response_cache_control
|
329
349
|
# Sets the `Cache-Control` header of the response.
|
330
350
|
# @option options [String] :response_content_disposition
|
@@ -353,9 +373,11 @@ module Aws::S3
|
|
353
373
|
# @option options [String] :request_payer
|
354
374
|
# Confirms that the requester knows that they will be charged for the
|
355
375
|
# request. Bucket owners need not specify this parameter in their
|
356
|
-
# requests.
|
357
|
-
# Pays
|
358
|
-
#
|
376
|
+
# requests. If either the source or destination Amazon S3 bucket has
|
377
|
+
# Requester Pays enabled, the requester will pay for corresponding
|
378
|
+
# charges to copy the object. For information about downloading objects
|
379
|
+
# from Requester Pays buckets, see [Downloading Objects in Requester
|
380
|
+
# Pays Buckets][1] in the *Amazon S3 User Guide*.
|
359
381
|
#
|
360
382
|
#
|
361
383
|
#
|
@@ -378,7 +400,9 @@ module Aws::S3
|
|
378
400
|
key: @object_key,
|
379
401
|
version_id: @id
|
380
402
|
)
|
381
|
-
resp =
|
403
|
+
resp = Aws::Plugins::UserAgent.feature('resource') do
|
404
|
+
@client.get_object(options, &block)
|
405
|
+
end
|
382
406
|
resp.data
|
383
407
|
end
|
384
408
|
|
@@ -412,8 +436,10 @@ module Aws::S3
|
|
412
436
|
# Return the object only if it has not been modified since the specified
|
413
437
|
# time; otherwise, return a 412 (precondition failed) error.
|
414
438
|
# @option options [String] :range
|
415
|
-
#
|
416
|
-
#
|
439
|
+
# HeadObject returns only the metadata for an object. If the Range is
|
440
|
+
# satisfiable, only the `ContentLength` is affected in the response. If
|
441
|
+
# the Range is not satisfiable, S3 returns a `416 - Requested Range Not
|
442
|
+
# Satisfiable` error.
|
417
443
|
# @option options [String] :sse_customer_algorithm
|
418
444
|
# Specifies the algorithm to use to when encrypting the object (for
|
419
445
|
# example, AES256).
|
@@ -430,9 +456,11 @@ module Aws::S3
|
|
430
456
|
# @option options [String] :request_payer
|
431
457
|
# Confirms that the requester knows that they will be charged for the
|
432
458
|
# request. Bucket owners need not specify this parameter in their
|
433
|
-
# requests.
|
434
|
-
# Pays
|
435
|
-
#
|
459
|
+
# requests. If either the source or destination Amazon S3 bucket has
|
460
|
+
# Requester Pays enabled, the requester will pay for corresponding
|
461
|
+
# charges to copy the object. For information about downloading objects
|
462
|
+
# from Requester Pays buckets, see [Downloading Objects in Requester
|
463
|
+
# Pays Buckets][1] in the *Amazon S3 User Guide*.
|
436
464
|
#
|
437
465
|
#
|
438
466
|
#
|
@@ -460,7 +488,9 @@ module Aws::S3
|
|
460
488
|
key: @object_key,
|
461
489
|
version_id: @id
|
462
490
|
)
|
463
|
-
resp =
|
491
|
+
resp = Aws::Plugins::UserAgent.feature('resource') do
|
492
|
+
@client.head_object(options)
|
493
|
+
end
|
464
494
|
resp.data
|
465
495
|
end
|
466
496
|
|
@@ -543,9 +573,11 @@ module Aws::S3
|
|
543
573
|
# @option options [String] :request_payer
|
544
574
|
# Confirms that the requester knows that they will be charged for the
|
545
575
|
# request. Bucket owners need not specify this parameter in their
|
546
|
-
# requests.
|
547
|
-
# Pays
|
548
|
-
#
|
576
|
+
# requests. If either the source or destination Amazon S3 bucket has
|
577
|
+
# Requester Pays enabled, the requester will pay for corresponding
|
578
|
+
# charges to copy the object. For information about downloading objects
|
579
|
+
# from Requester Pays buckets, see [Downloading Objects in Requester
|
580
|
+
# Pays Buckets][1] in the *Amazon S3 User Guide*.
|
549
581
|
#
|
550
582
|
#
|
551
583
|
#
|
@@ -589,7 +621,9 @@ module Aws::S3
|
|
589
621
|
version_id: item.id
|
590
622
|
}
|
591
623
|
end
|
592
|
-
|
624
|
+
Aws::Plugins::UserAgent.feature('resource') do
|
625
|
+
batch[0].client.delete_objects(params)
|
626
|
+
end
|
593
627
|
end
|
594
628
|
nil
|
595
629
|
end
|
@@ -23,73 +23,26 @@ each bucket. [Go here for more information](http://docs.aws.amazon.com/AmazonS3/
|
|
23
23
|
operations = config.api.operation_names - [
|
24
24
|
:create_bucket, :list_buckets, :delete_bucket
|
25
25
|
]
|
26
|
-
# Need 2 handlers so that the context can be set for other plugins
|
27
|
-
# and to remove :use_accelerate_endpoint from the params.
|
28
26
|
handlers.add(
|
29
27
|
OptionHandler, step: :initialize, operations: operations
|
30
28
|
)
|
31
|
-
handlers.add(
|
32
|
-
AccelerateHandler, step: :build, priority: 11, operations: operations
|
33
|
-
)
|
34
29
|
end
|
35
30
|
|
36
31
|
# @api private
|
37
32
|
class OptionHandler < Seahorse::Client::Handler
|
38
33
|
def call(context)
|
39
34
|
# Support client configuration and per-operation configuration
|
35
|
+
# TODO: move this to an options hash and warn here.
|
40
36
|
if context.params.is_a?(Hash)
|
41
37
|
accelerate = context.params.delete(:use_accelerate_endpoint)
|
42
38
|
end
|
43
|
-
|
44
|
-
|
45
|
-
if accelerate && !context.config.regional_endpoint
|
46
|
-
raise ArgumentError,
|
47
|
-
'Cannot use both :use_accelerate_endpoint and :endpoint'
|
48
|
-
end
|
49
|
-
# Raise if :use_fips_endpoint and accelerate are both provided
|
50
|
-
if accelerate && context.config.use_fips_endpoint
|
51
|
-
raise ArgumentError,
|
52
|
-
'Cannot use both :use_accelerate_endpoint and '\
|
53
|
-
':use_fips_endpoint'
|
39
|
+
if accelerate.nil?
|
40
|
+
accelerate = context.config.use_accelerate_endpoint
|
54
41
|
end
|
55
42
|
context[:use_accelerate_endpoint] = accelerate
|
56
43
|
@handler.call(context)
|
57
44
|
end
|
58
45
|
end
|
59
|
-
|
60
|
-
# @api private
|
61
|
-
class AccelerateHandler < Seahorse::Client::Handler
|
62
|
-
def call(context)
|
63
|
-
if context.config.regional_endpoint && context[:use_accelerate_endpoint]
|
64
|
-
dualstack = !!context[:use_dualstack_endpoint]
|
65
|
-
use_accelerate_endpoint(context, dualstack)
|
66
|
-
end
|
67
|
-
@handler.call(context)
|
68
|
-
end
|
69
|
-
|
70
|
-
private
|
71
|
-
|
72
|
-
def use_accelerate_endpoint(context, dualstack)
|
73
|
-
bucket_name = context.params[:bucket]
|
74
|
-
validate_bucket_name!(bucket_name)
|
75
|
-
endpoint = URI.parse(context.http_request.endpoint.to_s)
|
76
|
-
endpoint.scheme = 'https'
|
77
|
-
endpoint.port = 443
|
78
|
-
endpoint.host = "#{bucket_name}.s3-accelerate"\
|
79
|
-
"#{'.dualstack' if dualstack}.amazonaws.com"
|
80
|
-
context.http_request.endpoint = endpoint.to_s
|
81
|
-
# s3 accelerate endpoint doesn't work with 'expect' header
|
82
|
-
context.http_request.headers.delete('expect')
|
83
|
-
end
|
84
|
-
|
85
|
-
def validate_bucket_name!(bucket_name)
|
86
|
-
unless BucketDns.dns_compatible?(bucket_name, _ssl = true)
|
87
|
-
raise ArgumentError,
|
88
|
-
'Unable to use `use_accelerate_endpoint: true` on buckets '\
|
89
|
-
'with non-DNS compatible names.'
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
93
46
|
end
|
94
47
|
end
|
95
48
|
end
|
@@ -1,10 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative '../arn/access_point_arn'
|
4
|
-
require_relative '../arn/object_lambda_arn'
|
5
|
-
require_relative '../arn/outpost_access_point_arn'
|
6
|
-
require_relative '../arn/multi_region_access_point_arn'
|
7
|
-
|
8
3
|
module Aws
|
9
4
|
module S3
|
10
5
|
module Plugins
|
@@ -36,150 +31,9 @@ result in cross region requests.
|
|
36
31
|
resolve_s3_disable_multiregion_access_points(cfg)
|
37
32
|
end
|
38
33
|
|
39
|
-
# param validator is validate:50
|
40
|
-
# endpoint is build:90 (populates the URI for the first time)
|
41
|
-
# endpoint pattern is build:10
|
42
|
-
def add_handlers(handlers, _config)
|
43
|
-
handlers.add(ARNHandler, step: :validate, priority: 75)
|
44
|
-
handlers.add(UrlHandler)
|
45
|
-
end
|
46
|
-
|
47
|
-
# After extracting out any ARN input, resolve a new URL with it.
|
48
|
-
class UrlHandler < Seahorse::Client::Handler
|
49
|
-
def call(context)
|
50
|
-
if context.metadata[:s3_arn]
|
51
|
-
ARN.resolve_url!(
|
52
|
-
context.http_request.endpoint,
|
53
|
-
context.metadata[:s3_arn][:arn],
|
54
|
-
context.metadata[:s3_arn][:resolved_region],
|
55
|
-
context.metadata[:s3_arn][:fips],
|
56
|
-
context.metadata[:s3_arn][:dualstack],
|
57
|
-
# if regional_endpoint is false, a custom endpoint was provided
|
58
|
-
# in this case, we want to prefix the endpoint using the ARN
|
59
|
-
!context.config.regional_endpoint
|
60
|
-
)
|
61
|
-
end
|
62
|
-
@handler.call(context)
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
# This plugin will extract out any ARN input and set context for other
|
67
|
-
# plugins to use without having to translate the ARN again.
|
68
|
-
class ARNHandler < Seahorse::Client::Handler
|
69
|
-
def call(context)
|
70
|
-
bucket_member = _bucket_member(context.operation.input.shape)
|
71
|
-
if bucket_member && (bucket = context.params[bucket_member])
|
72
|
-
resolved_region, arn = ARN.resolve_arn!(
|
73
|
-
bucket,
|
74
|
-
context.config.region,
|
75
|
-
context.config.s3_use_arn_region
|
76
|
-
)
|
77
|
-
if arn
|
78
|
-
validate_config!(context, arn)
|
79
|
-
|
80
|
-
context.metadata[:s3_arn] = {
|
81
|
-
arn: arn,
|
82
|
-
resolved_region: resolved_region,
|
83
|
-
fips: context.config.use_fips_endpoint,
|
84
|
-
dualstack: extract_dualstack_config!(context)
|
85
|
-
}
|
86
|
-
end
|
87
|
-
end
|
88
|
-
@handler.call(context)
|
89
|
-
end
|
90
|
-
|
91
|
-
private
|
92
|
-
|
93
|
-
def _bucket_member(input)
|
94
|
-
input.members.each do |member, ref|
|
95
|
-
return member if ref.shape.name == 'BucketName'
|
96
|
-
end
|
97
|
-
nil
|
98
|
-
end
|
99
|
-
|
100
|
-
# other plugins use dualstack so disable it when we're done
|
101
|
-
def extract_dualstack_config!(context)
|
102
|
-
dualstack = context[:use_dualstack_endpoint]
|
103
|
-
context[:use_dualstack_endpoint] = false if dualstack
|
104
|
-
dualstack
|
105
|
-
end
|
106
|
-
|
107
|
-
def validate_config!(context, arn)
|
108
|
-
if context.config.force_path_style
|
109
|
-
raise ArgumentError,
|
110
|
-
'Cannot provide an Access Point ARN when '\
|
111
|
-
'`:force_path_style` is set to true.'
|
112
|
-
end
|
113
|
-
|
114
|
-
if context.config.use_accelerate_endpoint
|
115
|
-
raise ArgumentError,
|
116
|
-
'Cannot provide an Access Point ARN when '\
|
117
|
-
'`:use_accelerate_endpoint` is set to true.'
|
118
|
-
end
|
119
|
-
|
120
|
-
if !arn.support_dualstack? && context[:use_dualstack_endpoint]
|
121
|
-
raise ArgumentError,
|
122
|
-
'Cannot provide an Outpost Access Point, Object Lambda, '\
|
123
|
-
'or Multi-region Access Point ARN'\
|
124
|
-
' when `:use_dualstack_endpoint` is set to true.'
|
125
|
-
end
|
126
|
-
|
127
|
-
if arn.region.empty? && context.config.s3_disable_multiregion_access_points
|
128
|
-
raise ArgumentError,
|
129
|
-
'Cannot provide a Multi-region Access Point ARN with '\
|
130
|
-
'`:s3_disable_multiregion_access_points` set to true'
|
131
|
-
end
|
132
|
-
|
133
|
-
if context.config.use_fips_endpoint && !arn.support_fips?
|
134
|
-
raise ArgumentError,
|
135
|
-
'FIPS client regions are not supported for this type '\
|
136
|
-
'of ARN.'
|
137
|
-
end
|
138
|
-
end
|
139
|
-
end
|
140
|
-
|
141
34
|
class << self
|
142
|
-
# @api private
|
143
|
-
def resolve_arn!(member_value, region, use_arn_region)
|
144
|
-
if Aws::ARNParser.arn?(member_value)
|
145
|
-
arn = Aws::ARNParser.parse(member_value)
|
146
|
-
s3_arn = resolve_arn_type!(arn)
|
147
|
-
s3_arn.validate_arn!
|
148
|
-
validate_region_config!(s3_arn, region, use_arn_region)
|
149
|
-
region = s3_arn.region if use_arn_region
|
150
|
-
[region, s3_arn]
|
151
|
-
else
|
152
|
-
[region]
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
|
-
# @api private
|
157
|
-
def resolve_url!(url, arn, region, fips = false, dualstack = false, has_custom_endpoint = false)
|
158
|
-
custom_endpoint = url.host if has_custom_endpoint
|
159
|
-
url.host = arn.host_url(region, fips, dualstack, custom_endpoint)
|
160
|
-
url.path = url_path(url.path, arn)
|
161
|
-
url
|
162
|
-
end
|
163
|
-
|
164
35
|
private
|
165
36
|
|
166
|
-
def resolve_arn_type!(arn)
|
167
|
-
case arn.service
|
168
|
-
when 's3'
|
169
|
-
arn.region.empty? ?
|
170
|
-
Aws::S3::MultiRegionAccessPointARN.new(arn.to_h) :
|
171
|
-
Aws::S3::AccessPointARN.new(arn.to_h)
|
172
|
-
when 's3-outposts'
|
173
|
-
Aws::S3::OutpostAccessPointARN.new(arn.to_h)
|
174
|
-
when 's3-object-lambda'
|
175
|
-
Aws::S3::ObjectLambdaARN.new(arn.to_h)
|
176
|
-
else
|
177
|
-
raise ArgumentError,
|
178
|
-
'Only Access Point, Outposts, and Object Lambdas ARNs '\
|
179
|
-
'are currently supported.'
|
180
|
-
end
|
181
|
-
end
|
182
|
-
|
183
37
|
def resolve_s3_use_arn_region(cfg)
|
184
38
|
value = ENV['AWS_S3_USE_ARN_REGION'] ||
|
185
39
|
Aws.shared_config.s3_use_arn_region(profile: cfg.profile) ||
|
@@ -209,44 +63,6 @@ result in cross region requests.
|
|
209
63
|
end
|
210
64
|
value
|
211
65
|
end
|
212
|
-
|
213
|
-
# Remove ARN from the path because we've already set the new host
|
214
|
-
def url_path(path, arn)
|
215
|
-
path = path.sub("/#{Seahorse::Util.uri_escape(arn.to_s)}", '')
|
216
|
-
.sub("/#{arn}", '')
|
217
|
-
"/#{path}" unless path =~ /^\//
|
218
|
-
path
|
219
|
-
end
|
220
|
-
|
221
|
-
def validate_region_config!(arn, region, use_arn_region)
|
222
|
-
if ['s3-external-1', 'aws-global'].include?(region)
|
223
|
-
# These "regions" are not regional endpoints
|
224
|
-
unless use_arn_region
|
225
|
-
raise Aws::Errors::InvalidARNRegionError,
|
226
|
-
'Configured client region is not a regional endpoint.'
|
227
|
-
end
|
228
|
-
# These "regions" are in the AWS partition
|
229
|
-
# Cannot use ARN region unless it's the same partition
|
230
|
-
unless arn.partition == 'aws'
|
231
|
-
raise Aws::Errors::InvalidARNPartitionError
|
232
|
-
end
|
233
|
-
else
|
234
|
-
# use_arn_region does not apply to MRAP (global) arns
|
235
|
-
unless arn.region.empty?
|
236
|
-
# Raise if the ARN and client regions are in different partitions
|
237
|
-
if use_arn_region &&
|
238
|
-
!Aws::Partitions.partition(arn.partition).region?(region)
|
239
|
-
raise Aws::Errors::InvalidARNPartitionError
|
240
|
-
end
|
241
|
-
|
242
|
-
# Raise if regions mismatch
|
243
|
-
# Either when it's a fips client or not using the ARN region
|
244
|
-
if !use_arn_region && region != arn.region
|
245
|
-
raise Aws::Errors::InvalidARNRegionError
|
246
|
-
end
|
247
|
-
end
|
248
|
-
end
|
249
|
-
end
|
250
66
|
end
|
251
67
|
end
|
252
68
|
end
|
@@ -23,45 +23,10 @@ When set to `true`, the bucket name is always left in the
|
|
23
23
|
request URI and never moved to the host as a sub-domain.
|
24
24
|
DOCS
|
25
25
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
# @api private
|
31
|
-
class Handler < Seahorse::Client::Handler
|
32
|
-
|
33
|
-
def call(context)
|
34
|
-
move_dns_compat_bucket_to_subdomain(context)
|
35
|
-
@handler.call(context)
|
36
|
-
end
|
37
|
-
|
38
|
-
private
|
39
|
-
|
40
|
-
def move_dns_compat_bucket_to_subdomain(context)
|
41
|
-
bucket_name = context.params[:bucket]
|
42
|
-
endpoint = context.http_request.endpoint
|
43
|
-
if bucket_name &&
|
44
|
-
BucketDns.dns_compatible?(bucket_name, https?(endpoint)) &&
|
45
|
-
context.operation_name.to_s != 'get_bucket_location'
|
46
|
-
move_bucket_to_subdomain(bucket_name, endpoint)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
def move_bucket_to_subdomain(bucket_name, endpoint)
|
51
|
-
endpoint.host = "#{bucket_name}.#{endpoint.host}"
|
52
|
-
path = endpoint.path.sub("/#{bucket_name}", '')
|
53
|
-
path = "/#{path}" unless path.match(/^\//)
|
54
|
-
endpoint.path = path
|
55
|
-
end
|
56
|
-
|
57
|
-
def https?(uri)
|
58
|
-
uri.scheme == 'https'
|
59
|
-
end
|
60
|
-
|
61
|
-
end
|
62
|
-
|
26
|
+
# These class methods were originally used in a handler in this plugin.
|
27
|
+
# SigV2 legacy signer needs this logic so we keep it here as utility.
|
28
|
+
# New endpoint resolution will check this as a matcher.
|
63
29
|
class << self
|
64
|
-
|
65
30
|
# @param [String] bucket_name
|
66
31
|
# @param [Boolean] ssl
|
67
32
|
# @return [Boolean]
|
@@ -81,7 +46,6 @@ request URI and never moved to the host as a sub-domain.
|
|
81
46
|
bucket_name !~ /(\d+\.){3}\d+/ &&
|
82
47
|
bucket_name !~ /[.-]{2}/
|
83
48
|
end
|
84
|
-
|
85
49
|
end
|
86
50
|
end
|
87
51
|
end
|
@@ -13,12 +13,7 @@ module Aws
|
|
13
13
|
def call(context)
|
14
14
|
bucket_member = _bucket_member(context.operation.input.shape)
|
15
15
|
if bucket_member && (bucket = context.params[bucket_member])
|
16
|
-
|
17
|
-
bucket,
|
18
|
-
context.config.region,
|
19
|
-
context.config.s3_use_arn_region
|
20
|
-
)
|
21
|
-
if !arn && bucket.include?('/')
|
16
|
+
if !Aws::ARNParser.arn?(bucket) && bucket.include?('/')
|
22
17
|
raise ArgumentError,
|
23
18
|
'bucket name must not contain a forward-slash (/)'
|
24
19
|
end
|
@@ -5,9 +5,8 @@ module Aws
|
|
5
5
|
module Plugins
|
6
6
|
# @api private
|
7
7
|
class Dualstack < Seahorse::Client::Plugin
|
8
|
-
def add_handlers(handlers,
|
8
|
+
def add_handlers(handlers, _config)
|
9
9
|
handlers.add(OptionHandler, step: :initialize)
|
10
|
-
handlers.add(DualstackHandler, step: :build, priority: 49)
|
11
10
|
end
|
12
11
|
|
13
12
|
# @api private
|
@@ -18,57 +17,10 @@ module Aws
|
|
18
17
|
dualstack = context.params.delete(:use_dualstack_endpoint)
|
19
18
|
end
|
20
19
|
dualstack = context.config.use_dualstack_endpoint if dualstack.nil?
|
21
|
-
# Raise if :endpoint and dualstack are both provided
|
22
|
-
if dualstack && !context.config.regional_endpoint
|
23
|
-
raise ArgumentError,
|
24
|
-
'Cannot use both :use_dualstack_endpoint and :endpoint'
|
25
|
-
end
|
26
20
|
context[:use_dualstack_endpoint] = dualstack
|
27
21
|
@handler.call(context)
|
28
22
|
end
|
29
23
|
end
|
30
|
-
|
31
|
-
# @api private
|
32
|
-
class DualstackHandler < Seahorse::Client::Handler
|
33
|
-
def call(context)
|
34
|
-
# only rewrite the endpoint if it's not a custom endpoint
|
35
|
-
# accelerate/ARN already handle dualstack cases, so ignore these
|
36
|
-
# check to see if dualstack is on but configured off via operation
|
37
|
-
if context.config.regional_endpoint &&
|
38
|
-
use_dualstack_endpoint?(context)
|
39
|
-
apply_dualstack_endpoint(context)
|
40
|
-
end
|
41
|
-
@handler.call(context)
|
42
|
-
end
|
43
|
-
|
44
|
-
private
|
45
|
-
|
46
|
-
def apply_dualstack_endpoint(context)
|
47
|
-
new_endpoint = Aws::Partitions::EndpointProvider.resolve(
|
48
|
-
context.config.region,
|
49
|
-
's3',
|
50
|
-
'regional',
|
51
|
-
{
|
52
|
-
dualstack: context[:use_dualstack_endpoint],
|
53
|
-
fips: context.config.use_fips_endpoint
|
54
|
-
}
|
55
|
-
)
|
56
|
-
endpoint = URI.parse(context.http_request.endpoint.to_s)
|
57
|
-
endpoint.host = URI.parse(new_endpoint).host
|
58
|
-
context.http_request.endpoint = endpoint
|
59
|
-
end
|
60
|
-
|
61
|
-
def use_dualstack_endpoint?(context)
|
62
|
-
# case when dualstack is turned off via operation
|
63
|
-
(context[:use_dualstack_endpoint] ||
|
64
|
-
context.config.use_dualstack_endpoint) &&
|
65
|
-
# accelerate plugin already applies dualstack
|
66
|
-
!context[:use_accelerate_endpoint] &&
|
67
|
-
# arns handle dualstack
|
68
|
-
!context.metadata[:s3_arn]
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
24
|
end
|
73
25
|
end
|
74
26
|
end
|