aws-sdk-s3 1.109.0 → 1.156.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 (100) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +352 -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 +241 -0
  6. data/lib/aws-sdk-s3/bucket.rb +585 -110
  7. data/lib/aws-sdk-s3/bucket_acl.rb +28 -6
  8. data/lib/aws-sdk-s3/bucket_cors.rb +34 -10
  9. data/lib/aws-sdk-s3/bucket_lifecycle.rb +34 -10
  10. data/lib/aws-sdk-s3/bucket_lifecycle_configuration.rb +34 -10
  11. data/lib/aws-sdk-s3/bucket_logging.rb +35 -6
  12. data/lib/aws-sdk-s3/bucket_notification.rb +12 -6
  13. data/lib/aws-sdk-s3/bucket_policy.rb +78 -10
  14. data/lib/aws-sdk-s3/bucket_region_cache.rb +9 -5
  15. data/lib/aws-sdk-s3/bucket_request_payment.rb +28 -6
  16. data/lib/aws-sdk-s3/bucket_tagging.rb +34 -10
  17. data/lib/aws-sdk-s3/bucket_versioning.rb +72 -14
  18. data/lib/aws-sdk-s3/bucket_website.rb +34 -10
  19. data/lib/aws-sdk-s3/client.rb +7900 -3252
  20. data/lib/aws-sdk-s3/client_api.rb +706 -228
  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 +97 -21
  24. data/lib/aws-sdk-s3/customizations/types/permanent_redirect.rb +26 -0
  25. data/lib/aws-sdk-s3/customizations.rb +10 -0
  26. data/lib/aws-sdk-s3/encryption/client.rb +6 -2
  27. data/lib/aws-sdk-s3/encryption/kms_cipher_provider.rb +13 -9
  28. data/lib/aws-sdk-s3/encryptionV2/client.rb +6 -2
  29. data/lib/aws-sdk-s3/encryptionV2/decrypt_handler.rb +1 -0
  30. data/lib/aws-sdk-s3/encryptionV2/kms_cipher_provider.rb +10 -6
  31. data/lib/aws-sdk-s3/endpoint_parameters.rb +186 -0
  32. data/lib/aws-sdk-s3/endpoint_provider.rb +592 -0
  33. data/lib/aws-sdk-s3/endpoints.rb +2689 -0
  34. data/lib/aws-sdk-s3/express_credentials.rb +55 -0
  35. data/lib/aws-sdk-s3/express_credentials_provider.rb +59 -0
  36. data/lib/aws-sdk-s3/file_downloader.rb +170 -45
  37. data/lib/aws-sdk-s3/file_uploader.rb +11 -4
  38. data/lib/aws-sdk-s3/multipart_file_uploader.rb +30 -11
  39. data/lib/aws-sdk-s3/multipart_stream_uploader.rb +46 -17
  40. data/lib/aws-sdk-s3/multipart_upload.rb +194 -19
  41. data/lib/aws-sdk-s3/multipart_upload_part.rb +280 -30
  42. data/lib/aws-sdk-s3/object.rb +1753 -266
  43. data/lib/aws-sdk-s3/object_acl.rb +49 -13
  44. data/lib/aws-sdk-s3/object_copier.rb +7 -5
  45. data/lib/aws-sdk-s3/object_multipart_copier.rb +46 -22
  46. data/lib/aws-sdk-s3/object_summary.rb +1497 -221
  47. data/lib/aws-sdk-s3/object_version.rb +383 -58
  48. data/lib/aws-sdk-s3/plugins/accelerate.rb +3 -50
  49. data/lib/aws-sdk-s3/plugins/access_grants.rb +114 -0
  50. data/lib/aws-sdk-s3/plugins/arn.rb +0 -184
  51. data/lib/aws-sdk-s3/plugins/bucket_dns.rb +3 -39
  52. data/lib/aws-sdk-s3/plugins/bucket_name_restrictions.rb +1 -6
  53. data/lib/aws-sdk-s3/plugins/dualstack.rb +1 -49
  54. data/lib/aws-sdk-s3/plugins/endpoints.rb +274 -0
  55. data/lib/aws-sdk-s3/plugins/expect_100_continue.rb +2 -1
  56. data/lib/aws-sdk-s3/plugins/express_session_auth.rb +97 -0
  57. data/lib/aws-sdk-s3/plugins/http_200_errors.rb +53 -16
  58. data/lib/aws-sdk-s3/plugins/iad_regional_endpoint.rb +6 -29
  59. data/lib/aws-sdk-s3/plugins/location_constraint.rb +3 -1
  60. data/lib/aws-sdk-s3/plugins/md5s.rb +6 -3
  61. data/lib/aws-sdk-s3/plugins/s3_signer.rb +42 -126
  62. data/lib/aws-sdk-s3/plugins/skip_whole_multipart_get_checksums.rb +31 -0
  63. data/lib/aws-sdk-s3/plugins/streaming_retry.rb +23 -2
  64. data/lib/aws-sdk-s3/presigned_post.rb +99 -78
  65. data/lib/aws-sdk-s3/presigner.rb +28 -37
  66. data/lib/aws-sdk-s3/resource.rb +89 -13
  67. data/lib/aws-sdk-s3/types.rb +6544 -4909
  68. data/lib/aws-sdk-s3.rb +5 -1
  69. data/sig/bucket.rbs +212 -0
  70. data/sig/bucket_acl.rbs +78 -0
  71. data/sig/bucket_cors.rbs +69 -0
  72. data/sig/bucket_lifecycle.rbs +88 -0
  73. data/sig/bucket_lifecycle_configuration.rbs +111 -0
  74. data/sig/bucket_logging.rbs +76 -0
  75. data/sig/bucket_notification.rbs +114 -0
  76. data/sig/bucket_policy.rbs +59 -0
  77. data/sig/bucket_request_payment.rbs +54 -0
  78. data/sig/bucket_tagging.rbs +65 -0
  79. data/sig/bucket_versioning.rbs +77 -0
  80. data/sig/bucket_website.rbs +93 -0
  81. data/sig/client.rbs +2381 -0
  82. data/sig/customizations/bucket.rbs +19 -0
  83. data/sig/customizations/object.rbs +38 -0
  84. data/sig/customizations/object_summary.rbs +35 -0
  85. data/sig/errors.rbs +34 -0
  86. data/sig/multipart_upload.rbs +110 -0
  87. data/sig/multipart_upload_part.rbs +105 -0
  88. data/sig/object.rbs +442 -0
  89. data/sig/object_acl.rbs +86 -0
  90. data/sig/object_summary.rbs +334 -0
  91. data/sig/object_version.rbs +137 -0
  92. data/sig/resource.rbs +127 -0
  93. data/sig/types.rbs +2568 -0
  94. data/sig/waiters.rbs +95 -0
  95. metadata +50 -16
  96. data/lib/aws-sdk-s3/arn/access_point_arn.rb +0 -69
  97. data/lib/aws-sdk-s3/arn/multi_region_access_point_arn.rb +0 -68
  98. data/lib/aws-sdk-s3/arn/object_lambda_arn.rb +0 -69
  99. data/lib/aws-sdk-s3/arn/outpost_access_point_arn.rb +0 -74
  100. data/lib/aws-sdk-s3/plugins/object_lambda_endpoint.rb +0 -25
@@ -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
- accelerate = context.config.use_accelerate_endpoint if accelerate.nil?
44
- # Raise if :endpoint and accelerate are both provided
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
@@ -0,0 +1,114 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Aws
4
+ module S3
5
+ module Plugins
6
+ # @api private
7
+ class AccessGrants < Seahorse::Client::Plugin
8
+ @s3control =
9
+ begin
10
+ require 'aws-sdk-s3control'
11
+ true
12
+ rescue LoadError
13
+ false
14
+ end
15
+
16
+ option(
17
+ :access_grants,
18
+ default: false,
19
+ doc_type: 'Boolean',
20
+ docstring: <<-DOCS)
21
+ When `true`, the S3 client will use the S3 Access Grants feature to
22
+ authenticate requests. Bucket credentials will be fetched from S3
23
+ Control using the `get_data_access` API.
24
+ DOCS
25
+
26
+ option(:access_grants_credentials_provider,
27
+ doc_type: 'Aws::S3::AccessGrantsCredentialsProvider',
28
+ rbs_type: 'untyped',
29
+ docstring: <<-DOCS) do |_cfg|
30
+ When `access_grants` is `true`, this option can be used to provide
31
+ additional options to the credentials provider, including a privilege
32
+ setting, caching, and fallback behavior.
33
+ DOCS
34
+ Aws::S3::AccessGrantsCredentialsProvider.new
35
+ end
36
+
37
+ # @api private
38
+ class Handler < Seahorse::Client::Handler
39
+ PERMISSION_MAP = {
40
+ head_object: 'READ',
41
+ get_object: 'READ',
42
+ get_object_acl: 'READ',
43
+ list_multipart_uploads: 'READ',
44
+ list_objects_v2: 'READ',
45
+ list_object_versions: 'READ',
46
+ list_parts: 'READ',
47
+ put_object: 'WRITE',
48
+ put_object_acl: 'WRITE',
49
+ delete_object: 'WRITE',
50
+ abort_multipart_upload: 'WRITE',
51
+ create_multipart_upload: 'WRITE',
52
+ upload_part: 'WRITE',
53
+ complete_multipart_upload: 'WRITE'
54
+ }.freeze
55
+
56
+ def call(context)
57
+ if access_grants_operation?(context) &&
58
+ !s3_express_endpoint?(context)
59
+ params = context[:endpoint_params]
60
+ permission = PERMISSION_MAP[context.operation_name]
61
+
62
+ provider = context.config.access_grants_credentials_provider
63
+ credentials = provider.access_grants_credentials_for(
64
+ bucket: params[:bucket],
65
+ key: params[:key],
66
+ prefix: params[:prefix],
67
+ permission: permission
68
+ )
69
+ context[:sigv4_credentials] = credentials # Sign will use this
70
+ end
71
+
72
+ with_metric(credentials) { @handler.call(context) }
73
+ end
74
+
75
+ private
76
+
77
+ def with_metric(credentials, &block)
78
+ return block.call unless credentials
79
+
80
+ Aws::Plugins::UserAgent.metric('S3_ACCESS_GRANTS', &block)
81
+ end
82
+
83
+ def access_grants_operation?(context)
84
+ params = context[:endpoint_params]
85
+ params[:bucket] && PERMISSION_MAP[context.operation_name]
86
+ end
87
+
88
+ def s3_express_endpoint?(context)
89
+ context[:endpoint_properties]['backend'] == 'S3Express'
90
+ end
91
+ end
92
+
93
+ def add_handlers(handlers, config)
94
+ return unless AccessGrants.s3control? && config.access_grants
95
+
96
+ handlers.add(Handler)
97
+ end
98
+
99
+ def after_initialize(client)
100
+ return unless AccessGrants.s3control? && client.config.access_grants
101
+
102
+ provider = client.config.access_grants_credentials_provider
103
+ provider.s3_client = client unless provider.s3_client
104
+ end
105
+
106
+ class << self
107
+ def s3control?
108
+ @s3control
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
114
+ 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
- def add_handlers(handlers, config)
27
- handlers.add(Handler, priority: 48) unless config.force_path_style
28
- end
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
- _resolved_region, arn = ARN.resolve_arn!(
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, config)
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