aws-sdk-s3 1.88.1 → 1.105.1

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 (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