aws-sdk-s3 1.150.0 → 1.169.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +110 -0
- data/VERSION +1 -1
- data/lib/aws-sdk-s3/access_grants_credentials_provider.rb +12 -3
- data/lib/aws-sdk-s3/bucket.rb +252 -88
- data/lib/aws-sdk-s3/bucket_acl.rb +3 -3
- data/lib/aws-sdk-s3/bucket_cors.rb +4 -4
- data/lib/aws-sdk-s3/bucket_lifecycle.rb +4 -4
- data/lib/aws-sdk-s3/bucket_lifecycle_configuration.rb +42 -5
- data/lib/aws-sdk-s3/bucket_logging.rb +3 -3
- data/lib/aws-sdk-s3/bucket_notification.rb +3 -3
- data/lib/aws-sdk-s3/bucket_policy.rb +8 -8
- data/lib/aws-sdk-s3/bucket_request_payment.rb +3 -3
- data/lib/aws-sdk-s3/bucket_tagging.rb +4 -4
- data/lib/aws-sdk-s3/bucket_versioning.rb +5 -5
- data/lib/aws-sdk-s3/bucket_website.rb +4 -4
- data/lib/aws-sdk-s3/client.rb +1685 -668
- data/lib/aws-sdk-s3/client_api.rb +49 -4
- data/lib/aws-sdk-s3/customizations/bucket.rb +1 -1
- data/lib/aws-sdk-s3/customizations/object.rb +11 -5
- data/lib/aws-sdk-s3/customizations/object_summary.rb +5 -0
- data/lib/aws-sdk-s3/customizations/object_version.rb +13 -0
- data/lib/aws-sdk-s3/customizations.rb +24 -38
- data/lib/aws-sdk-s3/encryption/client.rb +2 -2
- data/lib/aws-sdk-s3/encryption/kms_cipher_provider.rb +2 -2
- data/lib/aws-sdk-s3/encryptionV2/client.rb +2 -2
- data/lib/aws-sdk-s3/encryptionV2/kms_cipher_provider.rb +2 -2
- data/lib/aws-sdk-s3/endpoint_parameters.rb +21 -18
- data/lib/aws-sdk-s3/endpoint_provider.rb +1 -0
- data/lib/aws-sdk-s3/endpoints.rb +416 -1614
- data/lib/aws-sdk-s3/errors.rb +3 -0
- data/lib/aws-sdk-s3/file_downloader.rb +1 -1
- data/lib/aws-sdk-s3/file_uploader.rb +1 -1
- data/lib/aws-sdk-s3/multipart_stream_uploader.rb +1 -1
- data/lib/aws-sdk-s3/multipart_upload.rb +31 -8
- data/lib/aws-sdk-s3/multipart_upload_part.rb +11 -11
- data/lib/aws-sdk-s3/object.rb +441 -158
- data/lib/aws-sdk-s3/object_acl.rb +3 -3
- data/lib/aws-sdk-s3/object_copier.rb +1 -1
- data/lib/aws-sdk-s3/object_summary.rb +403 -134
- data/lib/aws-sdk-s3/object_version.rb +53 -13
- data/lib/aws-sdk-s3/plugins/access_grants.rb +75 -5
- data/lib/aws-sdk-s3/plugins/endpoints.rb +24 -212
- data/lib/aws-sdk-s3/plugins/express_session_auth.rb +7 -1
- data/lib/aws-sdk-s3/plugins/http_200_errors.rb +53 -16
- data/lib/aws-sdk-s3/resource.rb +37 -11
- data/lib/aws-sdk-s3/types.rb +1106 -401
- data/lib/aws-sdk-s3.rb +35 -31
- data/sig/bucket.rbs +4 -0
- data/sig/bucket_lifecycle_configuration.rbs +7 -3
- data/sig/client.rbs +49 -5
- data/sig/multipart_upload.rbs +1 -0
- data/sig/object.rbs +7 -0
- data/sig/object_summary.rbs +1 -0
- data/sig/object_version.rbs +6 -0
- data/sig/resource.rbs +7 -1
- data/sig/types.rbs +36 -2
- data/sig/waiters.rbs +12 -0
- metadata +7 -6
@@ -243,7 +243,7 @@ module Aws::S3
|
|
243
243
|
:retry
|
244
244
|
end
|
245
245
|
end
|
246
|
-
Aws::Plugins::UserAgent.
|
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.
|
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.
|
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
|
-
#
|
687
|
-
#
|
688
|
-
# KMS), you must have permission to use the
|
689
|
-
#
|
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.
|
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.
|
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
|
-
|
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:
|
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:
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
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
|
-
|
30
|
-
|
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
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
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(
|
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
|
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
|