aws-sdk-s3 1.150.0 → 1.169.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +110 -0
  3. data/VERSION +1 -1
  4. data/lib/aws-sdk-s3/access_grants_credentials_provider.rb +12 -3
  5. data/lib/aws-sdk-s3/bucket.rb +252 -88
  6. data/lib/aws-sdk-s3/bucket_acl.rb +3 -3
  7. data/lib/aws-sdk-s3/bucket_cors.rb +4 -4
  8. data/lib/aws-sdk-s3/bucket_lifecycle.rb +4 -4
  9. data/lib/aws-sdk-s3/bucket_lifecycle_configuration.rb +42 -5
  10. data/lib/aws-sdk-s3/bucket_logging.rb +3 -3
  11. data/lib/aws-sdk-s3/bucket_notification.rb +3 -3
  12. data/lib/aws-sdk-s3/bucket_policy.rb +8 -8
  13. data/lib/aws-sdk-s3/bucket_request_payment.rb +3 -3
  14. data/lib/aws-sdk-s3/bucket_tagging.rb +4 -4
  15. data/lib/aws-sdk-s3/bucket_versioning.rb +5 -5
  16. data/lib/aws-sdk-s3/bucket_website.rb +4 -4
  17. data/lib/aws-sdk-s3/client.rb +1685 -668
  18. data/lib/aws-sdk-s3/client_api.rb +49 -4
  19. data/lib/aws-sdk-s3/customizations/bucket.rb +1 -1
  20. data/lib/aws-sdk-s3/customizations/object.rb +11 -5
  21. data/lib/aws-sdk-s3/customizations/object_summary.rb +5 -0
  22. data/lib/aws-sdk-s3/customizations/object_version.rb +13 -0
  23. data/lib/aws-sdk-s3/customizations.rb +24 -38
  24. data/lib/aws-sdk-s3/encryption/client.rb +2 -2
  25. data/lib/aws-sdk-s3/encryption/kms_cipher_provider.rb +2 -2
  26. data/lib/aws-sdk-s3/encryptionV2/client.rb +2 -2
  27. data/lib/aws-sdk-s3/encryptionV2/kms_cipher_provider.rb +2 -2
  28. data/lib/aws-sdk-s3/endpoint_parameters.rb +21 -18
  29. data/lib/aws-sdk-s3/endpoint_provider.rb +1 -0
  30. data/lib/aws-sdk-s3/endpoints.rb +416 -1614
  31. data/lib/aws-sdk-s3/errors.rb +3 -0
  32. data/lib/aws-sdk-s3/file_downloader.rb +1 -1
  33. data/lib/aws-sdk-s3/file_uploader.rb +1 -1
  34. data/lib/aws-sdk-s3/multipart_stream_uploader.rb +1 -1
  35. data/lib/aws-sdk-s3/multipart_upload.rb +31 -8
  36. data/lib/aws-sdk-s3/multipart_upload_part.rb +11 -11
  37. data/lib/aws-sdk-s3/object.rb +441 -158
  38. data/lib/aws-sdk-s3/object_acl.rb +3 -3
  39. data/lib/aws-sdk-s3/object_copier.rb +1 -1
  40. data/lib/aws-sdk-s3/object_summary.rb +403 -134
  41. data/lib/aws-sdk-s3/object_version.rb +53 -13
  42. data/lib/aws-sdk-s3/plugins/access_grants.rb +75 -5
  43. data/lib/aws-sdk-s3/plugins/endpoints.rb +24 -212
  44. data/lib/aws-sdk-s3/plugins/express_session_auth.rb +7 -1
  45. data/lib/aws-sdk-s3/plugins/http_200_errors.rb +53 -16
  46. data/lib/aws-sdk-s3/resource.rb +37 -11
  47. data/lib/aws-sdk-s3/types.rb +1106 -401
  48. data/lib/aws-sdk-s3.rb +35 -31
  49. data/sig/bucket.rbs +4 -0
  50. data/sig/bucket_lifecycle_configuration.rbs +7 -3
  51. data/sig/client.rbs +49 -5
  52. data/sig/multipart_upload.rbs +1 -0
  53. data/sig/object.rbs +7 -0
  54. data/sig/object_summary.rbs +1 -0
  55. data/sig/object_version.rbs +6 -0
  56. data/sig/resource.rbs +7 -1
  57. data/sig/types.rbs +36 -2
  58. data/sig/waiters.rbs +12 -0
  59. metadata +7 -6
@@ -243,7 +243,7 @@ module Aws::S3
243
243
  :retry
244
244
  end
245
245
  end
246
- Aws::Plugins::UserAgent.feature('resource') do
246
+ Aws::Plugins::UserAgent.metric('RESOURCE_MODEL') do
247
247
  Aws::Waiters::Waiter.new(options).wait({})
248
248
  end
249
249
  end
@@ -303,7 +303,7 @@ module Aws::S3
303
303
  key: @object_key,
304
304
  version_id: @id
305
305
  )
306
- resp = Aws::Plugins::UserAgent.feature('resource') do
306
+ resp = Aws::Plugins::UserAgent.metric('RESOURCE_MODEL') do
307
307
  @client.delete_object(options)
308
308
  end
309
309
  resp.data
@@ -523,6 +523,15 @@ module Aws::S3
523
523
  # fails with the HTTP status code `403 Forbidden` (access denied).
524
524
  # @option options [String] :checksum_mode
525
525
  # To retrieve the checksum, this mode must be enabled.
526
+ #
527
+ # **General purpose buckets** - In addition, if you enable checksum mode
528
+ # and the object is uploaded with a [checksum][1] and encrypted with an
529
+ # Key Management Service (KMS) key, you must have permission to use the
530
+ # `kms:Decrypt` action to retrieve the checksum.
531
+ #
532
+ #
533
+ #
534
+ # [1]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_Checksum.html
526
535
  # @return [Types::GetObjectOutput]
527
536
  def get(options = {}, &block)
528
537
  options = options.merge(
@@ -530,7 +539,7 @@ module Aws::S3
530
539
  key: @object_key,
531
540
  version_id: @id
532
541
  )
533
- resp = Aws::Plugins::UserAgent.feature('resource') do
542
+ resp = Aws::Plugins::UserAgent.metric('RESOURCE_MODEL') do
534
543
  @client.get_object(options, &block)
535
544
  end
536
545
  resp.data
@@ -544,6 +553,12 @@ module Aws::S3
544
553
  # if_none_match: "IfNoneMatch",
545
554
  # if_unmodified_since: Time.now,
546
555
  # range: "Range",
556
+ # response_cache_control: "ResponseCacheControl",
557
+ # response_content_disposition: "ResponseContentDisposition",
558
+ # response_content_encoding: "ResponseContentEncoding",
559
+ # response_content_language: "ResponseContentLanguage",
560
+ # response_content_type: "ResponseContentType",
561
+ # response_expires: Time.now,
547
562
  # sse_customer_algorithm: "SSECustomerAlgorithm",
548
563
  # sse_customer_key: "SSECustomerKey",
549
564
  # sse_customer_key_md5: "SSECustomerKeyMD5",
@@ -630,6 +645,18 @@ module Aws::S3
630
645
  # satisfiable, only the `ContentLength` is affected in the response. If
631
646
  # the Range is not satisfiable, S3 returns a `416 - Requested Range Not
632
647
  # Satisfiable` error.
648
+ # @option options [String] :response_cache_control
649
+ # Sets the `Cache-Control` header of the response.
650
+ # @option options [String] :response_content_disposition
651
+ # Sets the `Content-Disposition` header of the response.
652
+ # @option options [String] :response_content_encoding
653
+ # Sets the `Content-Encoding` header of the response.
654
+ # @option options [String] :response_content_language
655
+ # Sets the `Content-Language` header of the response.
656
+ # @option options [String] :response_content_type
657
+ # Sets the `Content-Type` header of the response.
658
+ # @option options [Time,DateTime,Date,Integer,String] :response_expires
659
+ # Sets the `Expires` header of the response.
633
660
  # @option options [String] :sse_customer_algorithm
634
661
  # Specifies the algorithm to use when encrypting the object (for
635
662
  # example, AES256).
@@ -683,10 +710,20 @@ module Aws::S3
683
710
  # @option options [String] :checksum_mode
684
711
  # To retrieve the checksum, this parameter must be enabled.
685
712
  #
686
- # In addition, if you enable `ChecksumMode` and the object is encrypted
687
- # with Amazon Web Services Key Management Service (Amazon Web Services
688
- # KMS), you must have permission to use the `kms:Decrypt` action for the
689
- # request to succeed.
713
+ # **General purpose buckets** - If you enable checksum mode and the
714
+ # object is uploaded with a [checksum][1] and encrypted with an Key
715
+ # Management Service (KMS) key, you must have permission to use the
716
+ # `kms:Decrypt` action to retrieve the checksum.
717
+ #
718
+ # **Directory buckets** - If you enable `ChecksumMode` and the object is
719
+ # encrypted with Amazon Web Services Key Management Service (Amazon Web
720
+ # Services KMS), you must also have the `kms:GenerateDataKey` and
721
+ # `kms:Decrypt` permissions in IAM identity-based policies and KMS key
722
+ # policies for the KMS key to retrieve the checksum of the object.
723
+ #
724
+ #
725
+ #
726
+ # [1]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_Checksum.html
690
727
  # @return [Types::HeadObjectOutput]
691
728
  def head(options = {})
692
729
  options = options.merge(
@@ -694,7 +731,7 @@ module Aws::S3
694
731
  key: @object_key,
695
732
  version_id: @id
696
733
  )
697
- resp = Aws::Plugins::UserAgent.feature('resource') do
734
+ resp = Aws::Plugins::UserAgent.metric('RESOURCE_MODEL') do
698
735
  @client.head_object(options)
699
736
  end
700
737
  resp.data
@@ -832,13 +869,13 @@ module Aws::S3
832
869
  # For the `x-amz-checksum-algorithm ` header, replace ` algorithm ` with
833
870
  # the supported algorithm from the following list:
834
871
  #
835
- # * CRC32
872
+ # * `CRC32`
836
873
  #
837
- # * CRC32C
874
+ # * `CRC32C`
838
875
  #
839
- # * SHA1
876
+ # * `SHA1`
840
877
  #
841
- # * SHA256
878
+ # * `SHA256`
842
879
  #
843
880
  # For more information, see [Checking object integrity][1] in the
844
881
  # *Amazon S3 User Guide*.
@@ -868,7 +905,7 @@ module Aws::S3
868
905
  version_id: item.id
869
906
  }
870
907
  end
871
- Aws::Plugins::UserAgent.feature('resource') do
908
+ Aws::Plugins::UserAgent.metric('RESOURCE_MODEL') do
872
909
  batch[0].client.delete_objects(params)
873
910
  end
874
911
  end
@@ -880,3 +917,6 @@ module Aws::S3
880
917
  end
881
918
  end
882
919
  end
920
+
921
+ # Load customizations if they exist
922
+ require 'aws-sdk-s3/customizations/object_version'
@@ -44,36 +44,70 @@ setting, caching, and fallback behavior.
44
44
  list_objects_v2: 'READ',
45
45
  list_object_versions: 'READ',
46
46
  list_parts: 'READ',
47
+ head_bucket: 'READ',
48
+ get_object_attributes: 'READ',
47
49
  put_object: 'WRITE',
48
50
  put_object_acl: 'WRITE',
49
51
  delete_object: 'WRITE',
50
52
  abort_multipart_upload: 'WRITE',
51
53
  create_multipart_upload: 'WRITE',
52
54
  upload_part: 'WRITE',
53
- complete_multipart_upload: 'WRITE'
55
+ complete_multipart_upload: 'WRITE',
56
+ delete_objects: 'WRITE',
57
+ copy_object: 'READWRITE'
54
58
  }.freeze
55
59
 
56
60
  def call(context)
61
+ provider = context.config.access_grants_credentials_provider
62
+
57
63
  if access_grants_operation?(context) &&
58
- !s3_express_endpoint?(context)
64
+ !s3_express_endpoint?(context) &&
65
+ !credentials_head_bucket_call?(provider)
59
66
  params = context[:endpoint_params]
60
67
  permission = PERMISSION_MAP[context.operation_name]
61
68
 
62
- provider = context.config.access_grants_credentials_provider
69
+ key =
70
+ case context.operation_name
71
+ when :delete_objects
72
+ delete_params = context.params[:delete]
73
+ common_prefixes(delete_params[:objects].map { |o| o[:key] })
74
+ when :copy_object
75
+ source_bucket, source_key = params[:copy_source].split('/', 2)
76
+ if params[:bucket] != source_bucket
77
+ raise ArgumentError,
78
+ 'source and destination bucket must be the same'
79
+ end
80
+ common_prefixes([params[:key], source_key])
81
+ else
82
+ params[:key]
83
+ end
84
+
63
85
  credentials = provider.access_grants_credentials_for(
64
86
  bucket: params[:bucket],
65
- key: params[:key],
87
+ key: key,
66
88
  prefix: params[:prefix],
67
89
  permission: permission
68
90
  )
69
91
  context[:sigv4_credentials] = credentials # Sign will use this
70
92
  end
71
93
 
72
- @handler.call(context)
94
+ with_metric(credentials) { @handler.call(context) }
73
95
  end
74
96
 
75
97
  private
76
98
 
99
+ def with_metric(credentials, &block)
100
+ return block.call unless credentials
101
+
102
+ Aws::Plugins::UserAgent.metric('S3_ACCESS_GRANTS', &block)
103
+ end
104
+
105
+ # HeadBucket is a supported call. When fetching credentials,
106
+ # this plugin is executed again, and becomes recursive.
107
+ def credentials_head_bucket_call?(provider)
108
+ provider.instance_variable_get(:@head_bucket_call)
109
+ end
110
+
77
111
  def access_grants_operation?(context)
78
112
  params = context[:endpoint_params]
79
113
  params[:bucket] && PERMISSION_MAP[context.operation_name]
@@ -82,6 +116,42 @@ setting, caching, and fallback behavior.
82
116
  def s3_express_endpoint?(context)
83
117
  context[:endpoint_properties]['backend'] == 'S3Express'
84
118
  end
119
+
120
+ # Return the common prefix of the keys, regardless of the delimiter.
121
+ # For example, given keys ['foo/bar', 'foo/baz'], the common prefix
122
+ # is 'foo/ba'.
123
+ def common_prefixes(keys)
124
+ return '' if keys.empty?
125
+
126
+ first_key = keys[0]
127
+ common_ancestor = first_key
128
+ last_prefix = ''
129
+ keys.each do |k|
130
+ until common_ancestor.empty?
131
+ break if k.start_with?(common_ancestor)
132
+
133
+ last_index = common_ancestor.rindex('/')
134
+ return '' if last_index.nil?
135
+
136
+ last_prefix = common_ancestor[(last_index + 1)..-1]
137
+ common_ancestor = common_ancestor[0...last_index]
138
+ end
139
+ end
140
+ new_common_ancestor = "#{common_ancestor}/#{last_prefix}"
141
+ keys.each do |k|
142
+ until last_prefix.empty?
143
+ break if k.start_with?(new_common_ancestor)
144
+
145
+ last_prefix = last_prefix[0...-1]
146
+ new_common_ancestor = "#{common_ancestor}/#{last_prefix}"
147
+ end
148
+ end
149
+ if new_common_ancestor == "#{first_key}/"
150
+ first_key
151
+ else
152
+ new_common_ancestor
153
+ end
154
+ end
85
155
  end
86
156
 
87
157
  def add_handlers(handlers, config)
@@ -15,25 +15,28 @@ module Aws::S3
15
15
  :endpoint_provider,
16
16
  doc_type: 'Aws::S3::EndpointProvider',
17
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|
18
+ docstring: <<~DOCS) do |_cfg|
19
+ The endpoint provider used to resolve endpoints. Any object that responds to
20
+ `#resolve_endpoint(parameters)` where `parameters` is a Struct similar to
21
+ `Aws::S3::EndpointParameters`.
22
+ DOCS
23
23
  Aws::S3::EndpointProvider.new
24
24
  end
25
25
 
26
26
  option(
27
27
  :disable_s3_express_session_auth,
28
28
  doc_type: 'Boolean',
29
- default: nil,
30
- docstring: "Parameter to indicate whether S3Express session auth should be disabled")
29
+ docstring: <<~DOCS) do |cfg|
30
+ Parameter to indicate whether S3Express session auth should be disabled
31
+ DOCS
32
+ nil
33
+ end
31
34
 
32
35
  # @api private
33
36
  class Handler < Seahorse::Client::Handler
34
37
  def call(context)
35
38
  unless context[:discovered_endpoint]
36
- params = parameters_for_operation(context)
39
+ params = Aws::S3::Endpoints.parameters_for_operation(context)
37
40
  endpoint = context.config.endpoint_provider.resolve_endpoint(params)
38
41
 
39
42
  context.http_request.endpoint = endpoint.url
@@ -46,11 +49,23 @@ module Aws::S3
46
49
  context[:auth_scheme] =
47
50
  Aws::Endpoints.resolve_auth_scheme(context, endpoint)
48
51
 
49
- @handler.call(context)
52
+ with_metrics(context) { @handler.call(context) }
50
53
  end
51
54
 
52
55
  private
53
56
 
57
+ def with_metrics(context, &block)
58
+ metrics = []
59
+ metrics << 'ENDPOINT_OVERRIDE' unless context.config.regional_endpoint
60
+ if context[:auth_scheme] && context[:auth_scheme]['name'] == 'sigv4a'
61
+ metrics << 'SIGV4A_SIGNING'
62
+ end
63
+ if context.config.credentials&.credentials&.account_id
64
+ metrics << 'RESOLVED_ACCOUNT_ID'
65
+ end
66
+ Aws::Plugins::UserAgent.metric(*metrics, &block)
67
+ end
68
+
54
69
  def apply_endpoint_headers(context, headers)
55
70
  headers.each do |key, values|
56
71
  value = values
@@ -61,209 +76,6 @@ module Aws::S3
61
76
  context.http_request.headers[key] = value
62
77
  end
63
78
  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
79
  end
268
80
 
269
81
  def add_handlers(handlers, _config)
@@ -47,11 +47,17 @@ for different buckets.
47
47
  context[:sigv4_credentials] = credentials # Sign will use this
48
48
  end
49
49
  end
50
- @handler.call(context)
50
+ with_metric(credentials) { @handler.call(context) }
51
51
  end
52
52
 
53
53
  private
54
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
+
55
61
  def checksum_required?(context)
56
62
  context.operation.http_checksum_required ||
57
63
  (context.operation.http_checksum &&
@@ -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