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
@@ -0,0 +1,274 @@
1
+ # frozen_string_literal: true
2
+
3
+ # WARNING ABOUT GENERATED CODE
4
+ #
5
+ # This file is generated. See the contributing guide for more information:
6
+ # https://github.com/aws/aws-sdk-ruby/blob/version-3/CONTRIBUTING.md
7
+ #
8
+ # WARNING ABOUT GENERATED CODE
9
+
10
+
11
+ module Aws::S3
12
+ module Plugins
13
+ class Endpoints < Seahorse::Client::Plugin
14
+ option(
15
+ :endpoint_provider,
16
+ doc_type: 'Aws::S3::EndpointProvider',
17
+ rbs_type: 'untyped',
18
+ docstring: 'The endpoint provider used to resolve endpoints. Any '\
19
+ 'object that responds to `#resolve_endpoint(parameters)` '\
20
+ 'where `parameters` is a Struct similar to '\
21
+ '`Aws::S3::EndpointParameters`'
22
+ ) do |cfg|
23
+ Aws::S3::EndpointProvider.new
24
+ end
25
+
26
+ option(
27
+ :disable_s3_express_session_auth,
28
+ doc_type: 'Boolean',
29
+ default: nil,
30
+ docstring: "Parameter to indicate whether S3Express session auth should be disabled")
31
+
32
+ # @api private
33
+ class Handler < Seahorse::Client::Handler
34
+ def call(context)
35
+ unless context[:discovered_endpoint]
36
+ params = parameters_for_operation(context)
37
+ endpoint = context.config.endpoint_provider.resolve_endpoint(params)
38
+
39
+ context.http_request.endpoint = endpoint.url
40
+ apply_endpoint_headers(context, endpoint.headers)
41
+
42
+ context[:endpoint_params] = params
43
+ context[:endpoint_properties] = endpoint.properties
44
+ end
45
+
46
+ context[:auth_scheme] =
47
+ Aws::Endpoints.resolve_auth_scheme(context, endpoint)
48
+
49
+ @handler.call(context)
50
+ end
51
+
52
+ private
53
+
54
+ def apply_endpoint_headers(context, headers)
55
+ headers.each do |key, values|
56
+ value = values
57
+ .compact
58
+ .map { |s| Seahorse::Util.escape_header_list_string(s.to_s) }
59
+ .join(',')
60
+
61
+ context.http_request.headers[key] = value
62
+ end
63
+ end
64
+
65
+ def parameters_for_operation(context)
66
+ case context.operation_name
67
+ when :abort_multipart_upload
68
+ Aws::S3::Endpoints::AbortMultipartUpload.build(context)
69
+ when :complete_multipart_upload
70
+ Aws::S3::Endpoints::CompleteMultipartUpload.build(context)
71
+ when :copy_object
72
+ Aws::S3::Endpoints::CopyObject.build(context)
73
+ when :create_bucket
74
+ Aws::S3::Endpoints::CreateBucket.build(context)
75
+ when :create_multipart_upload
76
+ Aws::S3::Endpoints::CreateMultipartUpload.build(context)
77
+ when :create_session
78
+ Aws::S3::Endpoints::CreateSession.build(context)
79
+ when :delete_bucket
80
+ Aws::S3::Endpoints::DeleteBucket.build(context)
81
+ when :delete_bucket_analytics_configuration
82
+ Aws::S3::Endpoints::DeleteBucketAnalyticsConfiguration.build(context)
83
+ when :delete_bucket_cors
84
+ Aws::S3::Endpoints::DeleteBucketCors.build(context)
85
+ when :delete_bucket_encryption
86
+ Aws::S3::Endpoints::DeleteBucketEncryption.build(context)
87
+ when :delete_bucket_intelligent_tiering_configuration
88
+ Aws::S3::Endpoints::DeleteBucketIntelligentTieringConfiguration.build(context)
89
+ when :delete_bucket_inventory_configuration
90
+ Aws::S3::Endpoints::DeleteBucketInventoryConfiguration.build(context)
91
+ when :delete_bucket_lifecycle
92
+ Aws::S3::Endpoints::DeleteBucketLifecycle.build(context)
93
+ when :delete_bucket_metrics_configuration
94
+ Aws::S3::Endpoints::DeleteBucketMetricsConfiguration.build(context)
95
+ when :delete_bucket_ownership_controls
96
+ Aws::S3::Endpoints::DeleteBucketOwnershipControls.build(context)
97
+ when :delete_bucket_policy
98
+ Aws::S3::Endpoints::DeleteBucketPolicy.build(context)
99
+ when :delete_bucket_replication
100
+ Aws::S3::Endpoints::DeleteBucketReplication.build(context)
101
+ when :delete_bucket_tagging
102
+ Aws::S3::Endpoints::DeleteBucketTagging.build(context)
103
+ when :delete_bucket_website
104
+ Aws::S3::Endpoints::DeleteBucketWebsite.build(context)
105
+ when :delete_object
106
+ Aws::S3::Endpoints::DeleteObject.build(context)
107
+ when :delete_object_tagging
108
+ Aws::S3::Endpoints::DeleteObjectTagging.build(context)
109
+ when :delete_objects
110
+ Aws::S3::Endpoints::DeleteObjects.build(context)
111
+ when :delete_public_access_block
112
+ Aws::S3::Endpoints::DeletePublicAccessBlock.build(context)
113
+ when :get_bucket_accelerate_configuration
114
+ Aws::S3::Endpoints::GetBucketAccelerateConfiguration.build(context)
115
+ when :get_bucket_acl
116
+ Aws::S3::Endpoints::GetBucketAcl.build(context)
117
+ when :get_bucket_analytics_configuration
118
+ Aws::S3::Endpoints::GetBucketAnalyticsConfiguration.build(context)
119
+ when :get_bucket_cors
120
+ Aws::S3::Endpoints::GetBucketCors.build(context)
121
+ when :get_bucket_encryption
122
+ Aws::S3::Endpoints::GetBucketEncryption.build(context)
123
+ when :get_bucket_intelligent_tiering_configuration
124
+ Aws::S3::Endpoints::GetBucketIntelligentTieringConfiguration.build(context)
125
+ when :get_bucket_inventory_configuration
126
+ Aws::S3::Endpoints::GetBucketInventoryConfiguration.build(context)
127
+ when :get_bucket_lifecycle
128
+ Aws::S3::Endpoints::GetBucketLifecycle.build(context)
129
+ when :get_bucket_lifecycle_configuration
130
+ Aws::S3::Endpoints::GetBucketLifecycleConfiguration.build(context)
131
+ when :get_bucket_location
132
+ Aws::S3::Endpoints::GetBucketLocation.build(context)
133
+ when :get_bucket_logging
134
+ Aws::S3::Endpoints::GetBucketLogging.build(context)
135
+ when :get_bucket_metrics_configuration
136
+ Aws::S3::Endpoints::GetBucketMetricsConfiguration.build(context)
137
+ when :get_bucket_notification
138
+ Aws::S3::Endpoints::GetBucketNotification.build(context)
139
+ when :get_bucket_notification_configuration
140
+ Aws::S3::Endpoints::GetBucketNotificationConfiguration.build(context)
141
+ when :get_bucket_ownership_controls
142
+ Aws::S3::Endpoints::GetBucketOwnershipControls.build(context)
143
+ when :get_bucket_policy
144
+ Aws::S3::Endpoints::GetBucketPolicy.build(context)
145
+ when :get_bucket_policy_status
146
+ Aws::S3::Endpoints::GetBucketPolicyStatus.build(context)
147
+ when :get_bucket_replication
148
+ Aws::S3::Endpoints::GetBucketReplication.build(context)
149
+ when :get_bucket_request_payment
150
+ Aws::S3::Endpoints::GetBucketRequestPayment.build(context)
151
+ when :get_bucket_tagging
152
+ Aws::S3::Endpoints::GetBucketTagging.build(context)
153
+ when :get_bucket_versioning
154
+ Aws::S3::Endpoints::GetBucketVersioning.build(context)
155
+ when :get_bucket_website
156
+ Aws::S3::Endpoints::GetBucketWebsite.build(context)
157
+ when :get_object
158
+ Aws::S3::Endpoints::GetObject.build(context)
159
+ when :get_object_acl
160
+ Aws::S3::Endpoints::GetObjectAcl.build(context)
161
+ when :get_object_attributes
162
+ Aws::S3::Endpoints::GetObjectAttributes.build(context)
163
+ when :get_object_legal_hold
164
+ Aws::S3::Endpoints::GetObjectLegalHold.build(context)
165
+ when :get_object_lock_configuration
166
+ Aws::S3::Endpoints::GetObjectLockConfiguration.build(context)
167
+ when :get_object_retention
168
+ Aws::S3::Endpoints::GetObjectRetention.build(context)
169
+ when :get_object_tagging
170
+ Aws::S3::Endpoints::GetObjectTagging.build(context)
171
+ when :get_object_torrent
172
+ Aws::S3::Endpoints::GetObjectTorrent.build(context)
173
+ when :get_public_access_block
174
+ Aws::S3::Endpoints::GetPublicAccessBlock.build(context)
175
+ when :head_bucket
176
+ Aws::S3::Endpoints::HeadBucket.build(context)
177
+ when :head_object
178
+ Aws::S3::Endpoints::HeadObject.build(context)
179
+ when :list_bucket_analytics_configurations
180
+ Aws::S3::Endpoints::ListBucketAnalyticsConfigurations.build(context)
181
+ when :list_bucket_intelligent_tiering_configurations
182
+ Aws::S3::Endpoints::ListBucketIntelligentTieringConfigurations.build(context)
183
+ when :list_bucket_inventory_configurations
184
+ Aws::S3::Endpoints::ListBucketInventoryConfigurations.build(context)
185
+ when :list_bucket_metrics_configurations
186
+ Aws::S3::Endpoints::ListBucketMetricsConfigurations.build(context)
187
+ when :list_buckets
188
+ Aws::S3::Endpoints::ListBuckets.build(context)
189
+ when :list_directory_buckets
190
+ Aws::S3::Endpoints::ListDirectoryBuckets.build(context)
191
+ when :list_multipart_uploads
192
+ Aws::S3::Endpoints::ListMultipartUploads.build(context)
193
+ when :list_object_versions
194
+ Aws::S3::Endpoints::ListObjectVersions.build(context)
195
+ when :list_objects
196
+ Aws::S3::Endpoints::ListObjects.build(context)
197
+ when :list_objects_v2
198
+ Aws::S3::Endpoints::ListObjectsV2.build(context)
199
+ when :list_parts
200
+ Aws::S3::Endpoints::ListParts.build(context)
201
+ when :put_bucket_accelerate_configuration
202
+ Aws::S3::Endpoints::PutBucketAccelerateConfiguration.build(context)
203
+ when :put_bucket_acl
204
+ Aws::S3::Endpoints::PutBucketAcl.build(context)
205
+ when :put_bucket_analytics_configuration
206
+ Aws::S3::Endpoints::PutBucketAnalyticsConfiguration.build(context)
207
+ when :put_bucket_cors
208
+ Aws::S3::Endpoints::PutBucketCors.build(context)
209
+ when :put_bucket_encryption
210
+ Aws::S3::Endpoints::PutBucketEncryption.build(context)
211
+ when :put_bucket_intelligent_tiering_configuration
212
+ Aws::S3::Endpoints::PutBucketIntelligentTieringConfiguration.build(context)
213
+ when :put_bucket_inventory_configuration
214
+ Aws::S3::Endpoints::PutBucketInventoryConfiguration.build(context)
215
+ when :put_bucket_lifecycle
216
+ Aws::S3::Endpoints::PutBucketLifecycle.build(context)
217
+ when :put_bucket_lifecycle_configuration
218
+ Aws::S3::Endpoints::PutBucketLifecycleConfiguration.build(context)
219
+ when :put_bucket_logging
220
+ Aws::S3::Endpoints::PutBucketLogging.build(context)
221
+ when :put_bucket_metrics_configuration
222
+ Aws::S3::Endpoints::PutBucketMetricsConfiguration.build(context)
223
+ when :put_bucket_notification
224
+ Aws::S3::Endpoints::PutBucketNotification.build(context)
225
+ when :put_bucket_notification_configuration
226
+ Aws::S3::Endpoints::PutBucketNotificationConfiguration.build(context)
227
+ when :put_bucket_ownership_controls
228
+ Aws::S3::Endpoints::PutBucketOwnershipControls.build(context)
229
+ when :put_bucket_policy
230
+ Aws::S3::Endpoints::PutBucketPolicy.build(context)
231
+ when :put_bucket_replication
232
+ Aws::S3::Endpoints::PutBucketReplication.build(context)
233
+ when :put_bucket_request_payment
234
+ Aws::S3::Endpoints::PutBucketRequestPayment.build(context)
235
+ when :put_bucket_tagging
236
+ Aws::S3::Endpoints::PutBucketTagging.build(context)
237
+ when :put_bucket_versioning
238
+ Aws::S3::Endpoints::PutBucketVersioning.build(context)
239
+ when :put_bucket_website
240
+ Aws::S3::Endpoints::PutBucketWebsite.build(context)
241
+ when :put_object
242
+ Aws::S3::Endpoints::PutObject.build(context)
243
+ when :put_object_acl
244
+ Aws::S3::Endpoints::PutObjectAcl.build(context)
245
+ when :put_object_legal_hold
246
+ Aws::S3::Endpoints::PutObjectLegalHold.build(context)
247
+ when :put_object_lock_configuration
248
+ Aws::S3::Endpoints::PutObjectLockConfiguration.build(context)
249
+ when :put_object_retention
250
+ Aws::S3::Endpoints::PutObjectRetention.build(context)
251
+ when :put_object_tagging
252
+ Aws::S3::Endpoints::PutObjectTagging.build(context)
253
+ when :put_public_access_block
254
+ Aws::S3::Endpoints::PutPublicAccessBlock.build(context)
255
+ when :restore_object
256
+ Aws::S3::Endpoints::RestoreObject.build(context)
257
+ when :select_object_content
258
+ Aws::S3::Endpoints::SelectObjectContent.build(context)
259
+ when :upload_part
260
+ Aws::S3::Endpoints::UploadPart.build(context)
261
+ when :upload_part_copy
262
+ Aws::S3::Endpoints::UploadPartCopy.build(context)
263
+ when :write_get_object_response
264
+ Aws::S3::Endpoints::WriteGetObjectResponse.build(context)
265
+ end
266
+ end
267
+ end
268
+
269
+ def add_handlers(handlers, _config)
270
+ handlers.add(Handler, step: :build, priority: 75)
271
+ end
272
+ end
273
+ end
274
+ end
@@ -16,7 +16,8 @@ module Aws
16
16
 
17
17
  def call(context)
18
18
  body = context.http_request.body
19
- if body.respond_to?(:size) && body.size > 0
19
+ if body.respond_to?(:size) && body.size > 0 &&
20
+ !context[:use_accelerate_endpoint]
20
21
  context.http_request.headers['expect'] = '100-continue'
21
22
  end
22
23
  @handler.call(context)
@@ -0,0 +1,97 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Aws
4
+ module S3
5
+ module Plugins
6
+ # @api private
7
+ class ExpressSessionAuth < Seahorse::Client::Plugin
8
+ # This should be s3_disable_express_auth instead
9
+ # But this is not a built in. We're overwriting the generated value
10
+ option(:disable_s3_express_session_auth,
11
+ default: false,
12
+ doc_type: 'Boolean',
13
+ docstring: <<-DOCS) do |cfg|
14
+ When `true`, S3 Express session authentication is disabled.
15
+ DOCS
16
+ resolve_disable_s3_express_session_auth(cfg)
17
+ end
18
+
19
+ option(:express_credentials_provider,
20
+ doc_type: 'Aws::S3::ExpressCredentialsProvider',
21
+ rbs_type: 'untyped',
22
+ docstring: <<-DOCS) do |_cfg|
23
+ Credential Provider for S3 Express endpoints. Manages credentials
24
+ for different buckets.
25
+ DOCS
26
+ Aws::S3::ExpressCredentialsProvider.new
27
+ end
28
+
29
+ # @api private
30
+ class Handler < Seahorse::Client::Handler
31
+ def call(context)
32
+ if (props = context[:endpoint_properties])
33
+ # S3 Express endpoint - turn off md5 and enable crc32 default
34
+ if props['backend'] == 'S3Express'
35
+ if context.operation_name == :put_object || checksum_required?(context)
36
+ context[:default_request_checksum_algorithm] = 'CRC32'
37
+ end
38
+ context[:s3_express_endpoint] = true
39
+ end
40
+
41
+ # if s3 express auth, use new credentials and sign additional header
42
+ if context[:auth_scheme]['name'] == 'sigv4-s3express' &&
43
+ !context.config.disable_s3_express_session_auth
44
+ bucket = context.params[:bucket]
45
+ credentials_provider = context.config.express_credentials_provider
46
+ credentials = credentials_provider.express_credentials_for(bucket)
47
+ context[:sigv4_credentials] = credentials # Sign will use this
48
+ end
49
+ end
50
+ with_metric(credentials) { @handler.call(context) }
51
+ end
52
+
53
+ private
54
+
55
+ def with_metric(credentials, &block)
56
+ return block.call unless credentials
57
+
58
+ Aws::Plugins::UserAgent.metric('S3_EXPRESS_BUCKET', &block)
59
+ end
60
+
61
+ def checksum_required?(context)
62
+ context.operation.http_checksum_required ||
63
+ (context.operation.http_checksum &&
64
+ context.operation.http_checksum['requestChecksumRequired'])
65
+ end
66
+ end
67
+
68
+ handler(Handler)
69
+
70
+ # Optimization - sets this client as the client to create sessions.
71
+ def after_initialize(client)
72
+ provider = client.config.express_credentials_provider
73
+ provider.client = client unless provider.client
74
+ end
75
+
76
+ class << self
77
+ private
78
+
79
+ def resolve_disable_s3_express_session_auth(cfg)
80
+ value = ENV['AWS_S3_DISABLE_EXPRESS_SESSION_AUTH'] ||
81
+ Aws.shared_config.s3_disable_express_session_auth(profile: cfg.profile) ||
82
+ 'false'
83
+ value = Aws::Util.str_2_bool(value)
84
+ # Raise if provided value is not true or false
85
+ if value.nil?
86
+ raise ArgumentError,
87
+ 'Must provide either `true` or `false` for the '\
88
+ '`s3_disable_express_session_auth` profile option or for '\
89
+ "ENV['AWS_S3_DISABLE_EXPRESS_SESSION_AUTH']."
90
+ end
91
+ value
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
@@ -15,22 +15,67 @@ module Aws
15
15
 
16
16
  def call(context)
17
17
  @handler.call(context).on(200) do |response|
18
- if error = check_for_error(context)
19
- context.http_response.status_code = 500
20
- response.data = nil
21
- response.error = error
18
+ return response if streaming_output?(context.operation.output)
19
+
20
+ error = check_for_error(context)
21
+ return response unless error
22
+
23
+ context.http_response.status_code = 500
24
+ response.data = nil
25
+ response.error = error
26
+ end
27
+ end
28
+
29
+ private
30
+
31
+ # Streaming outputs are not subject to 200 errors.
32
+ def streaming_output?(output)
33
+ if (payload = output[:payload_member])
34
+ # checking ref and shape
35
+ payload['streaming'] || payload.shape['streaming'] ||
36
+ payload.eventstream
37
+ else
38
+ false
39
+ end
40
+ end
41
+
42
+ # Checks if the output shape is a structure shape and has members that
43
+ # are in the body for the case of a payload and a normal structure. A
44
+ # non-structure shape will not have members in the body. In the case
45
+ # of a string or blob, the body contents would have been checked first
46
+ # before this method is called in incomplete_xml_body?.
47
+ def members_in_body?(output)
48
+ shape =
49
+ if output[:payload_member]
50
+ output[:payload_member].shape
51
+ else
52
+ output.shape
22
53
  end
54
+
55
+ if structure_shape?(shape)
56
+ shape.members.any? { |_, k| k.location.nil? }
57
+ else
58
+ false
23
59
  end
24
60
  end
25
61
 
62
+ def structure_shape?(shape)
63
+ shape.is_a?(Seahorse::Model::Shapes::StructureShape)
64
+ end
65
+
66
+ # Must have a member in the body and have the start of an XML Tag.
67
+ # Other incomplete xml bodies will result in an XML ParsingError.
68
+ def incomplete_xml_body?(xml, output)
69
+ members_in_body?(output) && !xml.match(/<\w/)
70
+ end
71
+
26
72
  def check_for_error(context)
27
73
  xml = context.http_response.body_contents
28
- if xml.match(/<Error>/)
74
+ if xml.match(/\?>\s*<Error>/)
29
75
  error_code = xml.match(/<Code>(.+?)<\/Code>/)[1]
30
76
  error_message = xml.match(/<Message>(.+?)<\/Message>/)[1]
31
77
  S3::Errors.error_class(error_code).new(context, error_message)
32
- elsif !xml.match(/<\w/) # Must have the start of an XML Tag
33
- # Other incomplete xml bodies will result in XML ParsingError
78
+ elsif incomplete_xml_body?(xml, context.operation.output)
34
79
  Seahorse::Client::NetworkingError.new(
35
80
  S3::Errors
36
81
  .error_class('InternalError')
@@ -40,15 +85,7 @@ module Aws
40
85
  end
41
86
  end
42
87
 
43
- handler(
44
- Handler,
45
- step: :sign,
46
- operations: [
47
- :complete_multipart_upload,
48
- :copy_object,
49
- :upload_part_copy,
50
- ]
51
- )
88
+ handler(Handler, step: :sign)
52
89
  end
53
90
  end
54
91
  end
@@ -16,40 +16,17 @@ Defaults to `legacy` mode which uses the global endpoint.
16
16
  resolve_iad_regional_endpoint(cfg)
17
17
  end
18
18
 
19
- def add_handlers(handlers, config)
20
- # only modify non-custom endpoints
21
- if config.regional_endpoint && config.region == 'us-east-1'
22
- handlers.add(Handler)
23
- end
24
- end
25
-
26
- # @api private
27
- class Handler < Seahorse::Client::Handler
28
-
29
- def call(context)
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]
35
- host = context.http_request.endpoint.host
36
- legacy_host = IADRegionalEndpoint.legacy_host(host)
37
- context.http_request.endpoint.host = legacy_host
38
- end
39
- @handler.call(context)
40
- end
41
-
42
- end
43
-
44
- def self.legacy_host(host)
45
- host.sub(".us-east-1", '')
46
- end
47
-
48
19
  private
49
20
 
50
21
  def self.resolve_iad_regional_endpoint(cfg)
22
+ default_mode_value =
23
+ if cfg.respond_to?(:defaults_mode_config_resolver)
24
+ cfg.defaults_mode_config_resolver.resolve(:s3_us_east_1_regional_endpoint)
25
+ end
26
+
51
27
  mode = ENV['AWS_S3_US_EAST_1_REGIONAL_ENDPOINT'] ||
52
28
  Aws.shared_config.s3_us_east_1_regional_endpoint(profile: cfg.profile) ||
29
+ default_mode_value ||
53
30
  'legacy'
54
31
  mode = mode.downcase
55
32
  unless %w(legacy regional).include?(mode)
@@ -22,7 +22,9 @@ module Aws
22
22
 
23
23
  def populate_location_constraint(params, region)
24
24
  params[:create_bucket_configuration] ||= {}
25
- params[:create_bucket_configuration][:location_constraint] ||= region
25
+ unless params[:create_bucket_configuration][:location]
26
+ params[:create_bucket_configuration][:location_constraint] ||= region
27
+ end
26
28
  end
27
29
 
28
30
  end
@@ -22,9 +22,12 @@ module Aws
22
22
  CHUNK_SIZE = 1 * 1024 * 1024 # one MB
23
23
 
24
24
  def call(context)
25
- body = context.http_request.body
26
- if body.respond_to?(:size) && body.size > 0
27
- context.http_request.headers['Content-Md5'] ||= md5(body)
25
+ if !context[:checksum_algorithms] && # skip in favor of flexible checksum
26
+ !context[:s3_express_endpoint] # s3 express endpoints do not support md5
27
+ body = context.http_request.body
28
+ if body.respond_to?(:size) && body.size > 0
29
+ context.http_request.headers['Content-Md5'] ||= md5(body)
30
+ end
28
31
  end
29
32
  @handler.call(context)
30
33
  end