aws-sdk-s3 1.88.1 → 1.105.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +833 -0
  3. data/LICENSE.txt +202 -0
  4. data/VERSION +1 -0
  5. data/lib/aws-sdk-s3/arn/access_point_arn.rb +14 -11
  6. data/lib/aws-sdk-s3/arn/multi_region_access_point_arn.rb +68 -0
  7. data/lib/aws-sdk-s3/arn/object_lambda_arn.rb +69 -0
  8. data/lib/aws-sdk-s3/arn/outpost_access_point_arn.rb +9 -10
  9. data/lib/aws-sdk-s3/bucket.rb +30 -29
  10. data/lib/aws-sdk-s3/bucket_acl.rb +9 -6
  11. data/lib/aws-sdk-s3/bucket_cors.rb +8 -7
  12. data/lib/aws-sdk-s3/bucket_lifecycle.rb +6 -5
  13. data/lib/aws-sdk-s3/bucket_lifecycle_configuration.rb +3 -3
  14. data/lib/aws-sdk-s3/bucket_logging.rb +6 -6
  15. data/lib/aws-sdk-s3/bucket_notification.rb +4 -4
  16. data/lib/aws-sdk-s3/bucket_policy.rb +6 -5
  17. data/lib/aws-sdk-s3/bucket_request_payment.rb +8 -8
  18. data/lib/aws-sdk-s3/bucket_tagging.rb +6 -5
  19. data/lib/aws-sdk-s3/bucket_versioning.rb +13 -10
  20. data/lib/aws-sdk-s3/bucket_website.rb +6 -5
  21. data/lib/aws-sdk-s3/client.rb +1823 -1323
  22. data/lib/aws-sdk-s3/client_api.rb +65 -1
  23. data/lib/aws-sdk-s3/customizations/bucket.rb +8 -3
  24. data/lib/aws-sdk-s3/customizations/object.rb +41 -16
  25. data/lib/aws-sdk-s3/encryption/client.rb +1 -1
  26. data/lib/aws-sdk-s3/encryption/decrypt_handler.rb +0 -4
  27. data/lib/aws-sdk-s3/encryptionV2/client.rb +1 -1
  28. data/lib/aws-sdk-s3/encryptionV2/decrypt_handler.rb +0 -4
  29. data/lib/aws-sdk-s3/encryptionV2/encrypt_handler.rb +0 -4
  30. data/lib/aws-sdk-s3/errors.rb +1 -1
  31. data/lib/aws-sdk-s3/event_streams.rb +1 -1
  32. data/lib/aws-sdk-s3/file_downloader.rb +6 -1
  33. data/lib/aws-sdk-s3/file_uploader.rb +3 -3
  34. data/lib/aws-sdk-s3/multipart_upload.rb +7 -7
  35. data/lib/aws-sdk-s3/multipart_upload_part.rb +9 -8
  36. data/lib/aws-sdk-s3/object.rb +164 -75
  37. data/lib/aws-sdk-s3/object_acl.rb +10 -7
  38. data/lib/aws-sdk-s3/object_summary.rb +75 -71
  39. data/lib/aws-sdk-s3/object_version.rb +18 -17
  40. data/lib/aws-sdk-s3/plugins/accelerate.rb +7 -1
  41. data/lib/aws-sdk-s3/plugins/arn.rb +91 -42
  42. data/lib/aws-sdk-s3/plugins/bucket_dns.rb +1 -1
  43. data/lib/aws-sdk-s3/plugins/dualstack.rb +25 -31
  44. data/lib/aws-sdk-s3/plugins/get_bucket_location_fix.rb +1 -1
  45. data/lib/aws-sdk-s3/plugins/iad_regional_endpoint.rb +11 -10
  46. data/lib/aws-sdk-s3/plugins/object_lambda_endpoint.rb +25 -0
  47. data/lib/aws-sdk-s3/plugins/s3_signer.rb +35 -5
  48. data/lib/aws-sdk-s3/presigner.rb +19 -5
  49. data/lib/aws-sdk-s3/resource.rb +5 -3
  50. data/lib/aws-sdk-s3/types.rb +1397 -845
  51. data/lib/aws-sdk-s3/waiters.rb +1 -1
  52. data/lib/aws-sdk-s3.rb +2 -2
  53. metadata +17 -12
@@ -1,7 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative '../arn/access_point_arn'
4
+ require_relative '../arn/object_lambda_arn'
4
5
  require_relative '../arn/outpost_access_point_arn'
6
+ require_relative '../arn/multi_region_access_point_arn'
5
7
 
6
8
  module Aws
7
9
  module S3
@@ -22,9 +24,21 @@ be made. Set to `false` to use the client's region instead.
22
24
  resolve_s3_use_arn_region(cfg)
23
25
  end
24
26
 
25
- # param validator is validate:50 (required to add account_id from arn)
27
+ option(
28
+ :s3_disable_multiregion_access_points,
29
+ default: false,
30
+ doc_type: 'Boolean',
31
+ docstring: <<-DOCS) do |cfg|
32
+ When set to `false` this will option will raise errors when multi-region
33
+ access point ARNs are used. Multi-region access points can potentially
34
+ result in cross region requests.
35
+ DOCS
36
+ resolve_s3_disable_multiregion_access_points(cfg)
37
+ end
38
+
39
+ # param validator is validate:50
26
40
  # endpoint is build:90 (populates the URI for the first time)
27
- # endpoint pattern is build:10 (prefix account id to host)
41
+ # endpoint pattern is build:10
28
42
  def add_handlers(handlers, _config)
29
43
  handlers.add(ARNHandler, step: :validate, priority: 75)
30
44
  handlers.add(UrlHandler)
@@ -38,6 +52,7 @@ be made. Set to `false` to use the client's region instead.
38
52
  context.http_request.endpoint,
39
53
  context.metadata[:s3_arn][:arn],
40
54
  context.metadata[:s3_arn][:resolved_region],
55
+ context.metadata[:s3_arn][:fips],
41
56
  context.metadata[:s3_arn][:dualstack],
42
57
  # if regional_endpoint is false, a custom endpoint was provided
43
58
  # in this case, we want to prefix the endpoint using the ARN
@@ -65,6 +80,7 @@ be made. Set to `false` to use the client's region instead.
65
80
  context.metadata[:s3_arn] = {
66
81
  arn: arn,
67
82
  resolved_region: resolved_region,
83
+ fips: context.config.use_fips_endpoint,
68
84
  dualstack: extract_dualstack_config!(context)
69
85
  }
70
86
  end
@@ -103,8 +119,21 @@ be made. Set to `false` to use the client's region instead.
103
119
 
104
120
  if !arn.support_dualstack? && context[:use_dualstack_endpoint]
105
121
  raise ArgumentError,
106
- 'Cannot provide an Outpost Access Point ARN when '\
107
- '`:use_dualstack_endpoint` is set to true.'
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.'
108
137
  end
109
138
  end
110
139
  end
@@ -114,15 +143,7 @@ be made. Set to `false` to use the client's region instead.
114
143
  def resolve_arn!(member_value, region, use_arn_region)
115
144
  if Aws::ARNParser.arn?(member_value)
116
145
  arn = Aws::ARNParser.parse(member_value)
117
- if arn.resource.start_with?('accesspoint')
118
- s3_arn = Aws::S3::AccessPointARN.new(arn.to_h)
119
- elsif arn.resource.start_with?('outpost')
120
- s3_arn = Aws::S3::OutpostAccessPointARN.new(arn.to_h)
121
- else
122
- raise ArgumentError,
123
- 'Only Access Point and Outpost Access Point type ARNs '\
124
- 'are currently supported.'
125
- end
146
+ s3_arn = resolve_arn_type!(arn)
126
147
  s3_arn.validate_arn!
127
148
  validate_region_config!(s3_arn, region, use_arn_region)
128
149
  region = s3_arn.region if use_arn_region
@@ -133,15 +154,32 @@ be made. Set to `false` to use the client's region instead.
133
154
  end
134
155
 
135
156
  # @api private
136
- def resolve_url!(url, arn, region, dualstack = false, has_custom_endpoint = false)
157
+ def resolve_url!(url, arn, region, fips = false, dualstack = false, has_custom_endpoint = false)
137
158
  custom_endpoint = url.host if has_custom_endpoint
138
- url.host = arn.host_url(region, dualstack, custom_endpoint)
159
+ url.host = arn.host_url(region, fips, dualstack, custom_endpoint)
139
160
  url.path = url_path(url.path, arn)
140
161
  url
141
162
  end
142
163
 
143
164
  private
144
165
 
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
+
145
183
  def resolve_s3_use_arn_region(cfg)
146
184
  value = ENV['AWS_S3_USE_ARN_REGION'] ||
147
185
  Aws.shared_config.s3_use_arn_region(profile: cfg.profile) ||
@@ -157,8 +195,22 @@ be made. Set to `false` to use the client's region instead.
157
195
  value
158
196
  end
159
197
 
160
- # Remove ARN from the path since it was substituted already
161
- # This only works because accesspoints care about the URL
198
+ def resolve_s3_disable_multiregion_access_points(cfg)
199
+ value = ENV['AWS_S3_DISABLE_MULTIREGION_ACCESS_POINTS'] ||
200
+ Aws.shared_config.s3_disable_multiregion_access_points(profile: cfg.profile) ||
201
+ 'false'
202
+ value = Aws::Util.str_2_bool(value)
203
+ # Raise if provided value is not true or false
204
+ if value.nil?
205
+ raise ArgumentError,
206
+ 'Must provide either `true` or `false` for '\
207
+ 's3_use_arn_region profile option or for '\
208
+ "ENV['AWS_S3_USE_ARN_REGION']"
209
+ end
210
+ value
211
+ end
212
+
213
+ # Remove ARN from the path because we've already set the new host
162
214
  def url_path(path, arn)
163
215
  path = path.sub("/#{Seahorse::Util.uri_escape(arn.to_s)}", '')
164
216
  .sub("/#{arn}", '')
@@ -167,34 +219,31 @@ be made. Set to `false` to use the client's region instead.
167
219
  end
168
220
 
169
221
  def validate_region_config!(arn, region, use_arn_region)
170
- fips = arn.support_fips?
171
-
172
- # s3-external-1 is specific just to s3 and not part of partitions
173
- # aws-global is a partition region
174
- unless arn.partition == 'aws' &&
175
- (region == 's3-external-1' || region == 'aws-global')
176
- if !fips && arn.region.include?('fips')
177
- raise ArgumentError,
178
- 'FIPS region ARNs are not supported for this type of ARN.'
179
- end
180
-
181
- if !fips && !use_arn_region && region.include?('fips')
182
- raise ArgumentError,
183
- 'FIPS client regions are not supported for this type of '\
184
- 'ARN without `:s3_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.'
185
227
  end
186
-
187
- # if it's a fips region, attempt to normalize it
188
- if fips || use_arn_region
189
- region = region.gsub('fips-', '').gsub('-fips', '')
190
- end
191
- if use_arn_region &&
192
- !Aws::Partitions.partition(arn.partition).region?(region)
228
+ # These "regions" are in the AWS partition
229
+ # Cannot use ARN region unless it's the same partition
230
+ unless arn.partition == 'aws'
193
231
  raise Aws::Errors::InvalidARNPartitionError
194
232
  end
195
-
196
- if !use_arn_region && region != arn.region
197
- raise Aws::Errors::InvalidARNRegionError
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
198
247
  end
199
248
  end
200
249
  end
@@ -24,7 +24,7 @@ request URI and never moved to the host as a sub-domain.
24
24
  DOCS
25
25
 
26
26
  def add_handlers(handlers, config)
27
- handlers.add(Handler) unless config.force_path_style
27
+ handlers.add(Handler, priority: 48) unless config.force_path_style
28
28
  end
29
29
 
30
30
  # @api private
@@ -5,18 +5,9 @@ module Aws
5
5
  module Plugins
6
6
  # @api private
7
7
  class Dualstack < Seahorse::Client::Plugin
8
-
9
- option(:use_dualstack_endpoint,
10
- default: false,
11
- doc_type: 'Boolean',
12
- docstring: <<-DOCS)
13
- When set to `true`, IPv6-compatible bucket endpoints will be used
14
- for all operations.
15
- DOCS
16
-
17
8
  def add_handlers(handlers, config)
18
9
  handlers.add(OptionHandler, step: :initialize)
19
- handlers.add(DualstackHandler, step: :build, priority: 11)
10
+ handlers.add(DualstackHandler, step: :build, priority: 49)
20
11
  end
21
12
 
22
13
  # @api private
@@ -40,38 +31,41 @@ for all operations.
40
31
  # @api private
41
32
  class DualstackHandler < Seahorse::Client::Handler
42
33
  def call(context)
43
- if context.config.regional_endpoint && use_dualstack_endpoint?(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)
44
39
  apply_dualstack_endpoint(context)
45
40
  end
46
41
  @handler.call(context)
47
42
  end
48
43
 
49
44
  private
50
- def apply_dualstack_endpoint(context)
51
- bucket_name = context.params[:bucket]
52
- region = context.config.region
53
- dns_suffix = Aws::Partitions::EndpointProvider.dns_suffix_for(region)
54
45
 
55
- if use_bucket_dns?(bucket_name, context)
56
- host = "#{bucket_name}.s3.dualstack.#{region}.#{dns_suffix}"
57
- else
58
- host = "s3.dualstack.#{region}.#{dns_suffix}"
59
- end
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
+ )
60
56
  endpoint = URI.parse(context.http_request.endpoint.to_s)
61
- endpoint.scheme = context.http_request.endpoint.scheme
62
- endpoint.port = context.http_request.endpoint.port
63
- endpoint.host = host
64
- context.http_request.endpoint = endpoint.to_s
65
- end
66
-
67
- def use_bucket_dns?(bucket_name, context)
68
- ssl = context.http_request.endpoint.scheme == "https"
69
- bucket_name && BucketDns.dns_compatible?(bucket_name, ssl) &&
70
- !context.config.force_path_style
57
+ endpoint.host = URI.parse(new_endpoint).host
58
+ context.http_request.endpoint = endpoint
71
59
  end
72
60
 
73
61
  def use_dualstack_endpoint?(context)
74
- context[:use_dualstack_endpoint] && !context[:use_accelerate_endpoint]
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]
75
69
  end
76
70
  end
77
71
 
@@ -11,7 +11,7 @@ module Aws
11
11
  @handler.call(context).on(200) do |response|
12
12
  response.data = S3::Types::GetBucketLocationOutput.new
13
13
  xml = context.http_response.body_contents
14
- matches = xml.match(/>(.+?)<\/LocationConstraint>/)
14
+ matches = xml.match(/<LocationConstraint.*?>(.+?)<\/LocationConstraint>/)
15
15
  response.data[:location_constraint] = matches ? matches[1] : ''
16
16
  end
17
17
  end
@@ -10,14 +10,15 @@ module Aws
10
10
  default: 'legacy',
11
11
  doc_type: String,
12
12
  docstring: <<-DOCS) do |cfg|
13
- Passing in `regional` to enable regional endpoint for S3's `us-east-1`
14
- region. Defaults to `legacy` mode using global endpoint.
13
+ Pass in `regional` to enable the `us-east-1` regional endpoint.
14
+ Defaults to `legacy` mode which uses the global endpoint.
15
15
  DOCS
16
16
  resolve_iad_regional_endpoint(cfg)
17
17
  end
18
18
 
19
19
  def add_handlers(handlers, config)
20
- if config.region == 'us-east-1'
20
+ # only modify non-custom endpoints
21
+ if config.regional_endpoint && config.region == 'us-east-1'
21
22
  handlers.add(Handler)
22
23
  end
23
24
  end
@@ -26,14 +27,14 @@ region. Defaults to `legacy` mode using global endpoint.
26
27
  class Handler < Seahorse::Client::Handler
27
28
 
28
29
  def call(context)
29
- # keep legacy global endpoint pattern by default
30
- if context.config.s3_us_east_1_regional_endpoint == 'legacy'
30
+ # WriteGetObjectResponse does not have a global endpoint
31
+ # ARNs are regionalized, so don't touch those either.
32
+ if context.operation.name != 'WriteGetObjectResponse' &&
33
+ context.config.s3_us_east_1_regional_endpoint == 'legacy' &&
34
+ !context.metadata[:s3_arn]
31
35
  host = context.http_request.endpoint.host
32
- # if it's an ARN, don't touch the endpoint at all
33
- unless context.metadata[:s3_arn]
34
- legacy_host = IADRegionalEndpoint.legacy_host(host)
35
- context.http_request.endpoint.host = legacy_host
36
- end
36
+ legacy_host = IADRegionalEndpoint.legacy_host(host)
37
+ context.http_request.endpoint.host = legacy_host
37
38
  end
38
39
  @handler.call(context)
39
40
  end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Aws
4
+ module S3
5
+ module Plugins
6
+ # WriteGetObjectResponse is called from Lambda after a data transform.
7
+ # If there is no custom endpoint, we change the endpoint from s3 to
8
+ # s3-object-lambda just for this operation.
9
+ class ObjectLambdaEndpoint < Seahorse::Client::Plugin
10
+ class Handler < Seahorse::Client::Handler
11
+ def call(context)
12
+ if context.config.regional_endpoint
13
+ host = context.http_request.endpoint.host
14
+ host = host.sub('s3.', 's3-object-lambda.')
15
+ context.http_request.endpoint.host = host
16
+ end
17
+ @handler.call(context)
18
+ end
19
+ end
20
+
21
+ handler(Handler, operations: [:write_get_object_response])
22
+ end
23
+ end
24
+ end
25
+ end
@@ -22,7 +22,9 @@ module Aws
22
22
  # S3 removes core's signature_v4 plugin that checks for this
23
23
  raise Aws::Errors::MissingRegionError if cfg.region.nil?
24
24
 
25
- Aws::Partitions::EndpointProvider.signing_region(cfg.region, 's3')
25
+ Aws::Partitions::EndpointProvider.signing_region(
26
+ cfg.region, 's3'
27
+ )
26
28
  end
27
29
 
28
30
  def add_handlers(handlers, cfg)
@@ -74,9 +76,23 @@ module Aws
74
76
  credentials: context.config.credentials
75
77
  )
76
78
  elsif (arn = context.metadata[:s3_arn])
79
+ if arn[:arn].is_a?(MultiRegionAccessPointARN)
80
+ signing_region = '*'
81
+ signing_algorithm = :sigv4a
82
+ else
83
+ signing_region = arn[:resolved_region]
84
+ signing_algorithm = :sigv4
85
+ end
77
86
  S3Signer.build_v4_signer(
78
87
  service: arn[:arn].service,
79
- region: arn[:resolved_region],
88
+ signing_algorithm: signing_algorithm,
89
+ region: signing_region,
90
+ credentials: context.config.credentials
91
+ )
92
+ elsif context.operation.name == 'WriteGetObjectResponse'
93
+ S3Signer.build_v4_signer(
94
+ service: 's3-object-lambda',
95
+ region: context.config.sigv4_region,
80
96
  credentials: context.config.credentials
81
97
  )
82
98
  else
@@ -148,7 +164,12 @@ module Aws
148
164
 
149
165
  def custom_endpoint?(resp)
150
166
  resolved_suffix = Aws::Partitions::EndpointProvider.dns_suffix_for(
151
- resp.context.config.region
167
+ resp.context.config.region,
168
+ 's3',
169
+ {
170
+ dualstack: resp.context[:use_dualstack_endpoint],
171
+ fips: resp.context.config.use_fips_endpoint
172
+ }
152
173
  )
153
174
  !resp.context.http_request.endpoint.hostname.include?(resolved_suffix)
154
175
  end
@@ -210,6 +231,7 @@ module Aws
210
231
  service: options[:service],
211
232
  region: options[:region],
212
233
  credentials_provider: options[:credentials],
234
+ signing_algorithm: options.fetch(:signing_algorithm, :sigv4),
213
235
  uri_escape_path: false,
214
236
  unsigned_headers: ['content-length', 'x-amzn-trace-id']
215
237
  )
@@ -219,12 +241,20 @@ module Aws
219
241
  # Otherwise it will retry with the ARN as the bucket name.
220
242
  def new_hostname(context, region)
221
243
  uri = URI.parse(
222
- Aws::Partitions::EndpointProvider.resolve(region, 's3')
244
+ Aws::Partitions::EndpointProvider.resolve(
245
+ region, 's3', 'regional',
246
+ {
247
+ dualstack: context[:use_dualstack_endpoint],
248
+ fips: context.config.use_fips_endpoint
249
+ }
250
+ )
223
251
  )
224
252
 
225
253
  if (arn = context.metadata[:s3_arn])
226
254
  # Retry with the response region and not the ARN resolved one
227
- ARN.resolve_url!(uri, arn[:arn], region).host
255
+ ARN.resolve_url!(
256
+ uri, arn[:arn], region, arn[:fips], arn[:dualstack]
257
+ ).host
228
258
  else
229
259
  "#{context.params[:bucket]}.#{uri.host}"
230
260
  end
@@ -58,8 +58,7 @@ module Aws
58
58
  # is returned instead of the default HTTPS URL.
59
59
  #
60
60
  # @option params [Boolean] :virtual_host (false) When `true`, the
61
- # bucket name will be used as the hostname. This will cause
62
- # the returned URL to be 'http' and not 'https'.
61
+ # bucket name will be used as the hostname.
63
62
  #
64
63
  # @option params [Boolean] :use_accelerate_endpoint (false) When `true`,
65
64
  # Presigner will attempt to use accelerated endpoint.
@@ -139,6 +138,7 @@ module Aws
139
138
 
140
139
  req = @client.build_request(method, params)
141
140
  use_bucket_as_hostname(req) if virtual_host
141
+ handle_presigned_url_context(req)
142
142
 
143
143
  x_amz_headers = sign_but_dont_send(
144
144
  req, expires_in, scheme, time, unsigned_headers, hoist
@@ -184,6 +184,17 @@ module Aws
184
184
  end
185
185
  end
186
186
 
187
+ # Used for excluding presigned_urls from API request count.
188
+ #
189
+ # Store context information as early as possible, to allow
190
+ # handlers to perform decisions based on this flag if need.
191
+ def handle_presigned_url_context(req)
192
+ req.handle(step: :initialize, priority: 98) do |context|
193
+ context[:presigned_url] = true
194
+ @handler.call(context)
195
+ end
196
+ end
197
+
187
198
  # @param [Seahorse::Client::Request] req
188
199
  def sign_but_dont_send(
189
200
  req, expires_in, scheme, time, unsigned_headers, hoist = true
@@ -220,17 +231,23 @@ module Aws
220
231
  end
221
232
  http_req.endpoint.query = query.join('&') unless query.empty?
222
233
 
234
+ signing_algorithm = :sigv4
235
+
223
236
  # If it's an ARN, get the resolved region and service
224
237
  if (arn = context.metadata[:s3_arn])
225
238
  region = arn[:resolved_region]
226
239
  service = arn[:arn].service
240
+ region = arn[:arn].is_a?(MultiRegionAccessPointARN) ? '*': arn[:resolved_region]
241
+ signing_algorithm = arn[:arn].is_a?(MultiRegionAccessPointARN) ? :sigv4a : :sigv4
227
242
  end
228
243
 
229
244
  signer = Aws::Sigv4::Signer.new(
230
245
  service: service || 's3',
231
246
  region: region || context.config.region,
247
+ signing_algorithm: signing_algorithm,
232
248
  credentials_provider: context.config.credentials,
233
249
  unsigned_headers: unsigned_headers,
250
+ apply_checksum_header: false,
234
251
  uri_escape_path: false
235
252
  )
236
253
 
@@ -243,9 +260,6 @@ module Aws
243
260
  time: time
244
261
  ).to_s
245
262
 
246
- # Used for excluding presigned_urls from API request count
247
- context[:presigned_url] = true
248
-
249
263
  Seahorse::Client::Response.new(context: context, data: url)
250
264
  end
251
265
  # Return the headers
@@ -3,7 +3,7 @@
3
3
  # WARNING ABOUT GENERATED CODE
4
4
  #
5
5
  # This file is generated. See the contributing guide for more information:
6
- # https://github.com/aws/aws-sdk-ruby/blob/master/CONTRIBUTING.md
6
+ # https://github.com/aws/aws-sdk-ruby/blob/version-3/CONTRIBUTING.md
7
7
  #
8
8
  # WARNING ABOUT GENERATED CODE
9
9
 
@@ -65,8 +65,10 @@ module Aws::S3
65
65
  # @option options [String] :grant_read_acp
66
66
  # Allows grantee to read the bucket ACL.
67
67
  # @option options [String] :grant_write
68
- # Allows grantee to create, overwrite, and delete any object in the
69
- # bucket.
68
+ # Allows grantee to create new objects in the bucket.
69
+ #
70
+ # For the bucket and object owners of existing objects, also allows
71
+ # deletions and overwrites of those objects.
70
72
  # @option options [String] :grant_write_acp
71
73
  # Allows grantee to write the ACL for the applicable bucket.
72
74
  # @option options [Boolean] :object_lock_enabled_for_bucket