aws-sdk-core 3.46.2 → 3.126.2
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 +5 -5
- data/CHANGELOG.md +1258 -0
- data/LICENSE.txt +202 -0
- data/VERSION +1 -1
- data/lib/aws-defaults/default_configuration.rb +153 -0
- data/lib/aws-defaults/defaults_mode_config_resolver.rb +107 -0
- data/lib/aws-defaults.rb +3 -0
- data/lib/aws-sdk-core/arn.rb +92 -0
- data/lib/aws-sdk-core/arn_parser.rb +40 -0
- data/lib/aws-sdk-core/assume_role_credentials.rb +20 -0
- data/lib/aws-sdk-core/assume_role_web_identity_credentials.rb +109 -0
- data/lib/aws-sdk-core/async_client_stubs.rb +82 -0
- data/lib/aws-sdk-core/binary/decode_handler.rb +11 -1
- data/lib/aws-sdk-core/binary/encode_handler.rb +34 -0
- data/lib/aws-sdk-core/binary/event_builder.rb +124 -0
- data/lib/aws-sdk-core/binary/event_parser.rb +50 -18
- data/lib/aws-sdk-core/binary/event_stream_decoder.rb +7 -2
- data/lib/aws-sdk-core/binary/event_stream_encoder.rb +55 -0
- data/lib/aws-sdk-core/binary.rb +5 -0
- data/lib/aws-sdk-core/client_side_monitoring/publisher.rb +11 -1
- data/lib/aws-sdk-core/client_side_monitoring/request_metrics.rb +2 -0
- data/lib/aws-sdk-core/client_stubs.rb +16 -13
- data/lib/aws-sdk-core/credential_provider.rb +1 -30
- data/lib/aws-sdk-core/credential_provider_chain.rb +102 -40
- data/lib/aws-sdk-core/credentials.rb +2 -0
- data/lib/aws-sdk-core/deprecations.rb +17 -11
- data/lib/aws-sdk-core/eager_loader.rb +2 -0
- data/lib/aws-sdk-core/ec2_metadata.rb +238 -0
- data/lib/aws-sdk-core/ecs_credentials.rb +18 -9
- data/lib/aws-sdk-core/endpoint_cache.rb +16 -11
- data/lib/aws-sdk-core/errors.rb +138 -15
- data/lib/aws-sdk-core/event_emitter.rb +44 -0
- data/lib/aws-sdk-core/ini_parser.rb +2 -0
- data/lib/aws-sdk-core/instance_profile_credentials.rb +179 -42
- data/lib/aws-sdk-core/json/builder.rb +2 -0
- data/lib/aws-sdk-core/json/error_handler.rb +21 -2
- data/lib/aws-sdk-core/json/handler.rb +21 -1
- data/lib/aws-sdk-core/json/json_engine.rb +12 -8
- data/lib/aws-sdk-core/json/oj_engine.rb +35 -6
- data/lib/aws-sdk-core/json/parser.rb +10 -0
- data/lib/aws-sdk-core/json.rb +11 -28
- data/lib/aws-sdk-core/log/formatter.rb +16 -4
- data/lib/aws-sdk-core/log/handler.rb +2 -0
- data/lib/aws-sdk-core/log/param_filter.rb +38 -13
- data/lib/aws-sdk-core/log/param_formatter.rb +2 -0
- data/lib/aws-sdk-core/pageable_response.rb +48 -24
- data/lib/aws-sdk-core/pager.rb +5 -0
- data/lib/aws-sdk-core/param_converter.rb +2 -0
- data/lib/aws-sdk-core/param_validator.rb +63 -7
- data/lib/aws-sdk-core/plugins/api_key.rb +5 -1
- data/lib/aws-sdk-core/plugins/apig_authorizer_token.rb +2 -0
- data/lib/aws-sdk-core/plugins/apig_credentials_configuration.rb +2 -0
- data/lib/aws-sdk-core/plugins/apig_user_agent.rb +2 -0
- data/lib/aws-sdk-core/plugins/client_metrics_plugin.rb +28 -1
- data/lib/aws-sdk-core/plugins/client_metrics_send_plugin.rb +2 -0
- data/lib/aws-sdk-core/plugins/credentials_configuration.rb +26 -7
- data/lib/aws-sdk-core/plugins/defaults_mode.rb +40 -0
- data/lib/aws-sdk-core/plugins/endpoint_discovery.rb +12 -4
- data/lib/aws-sdk-core/plugins/endpoint_pattern.rb +8 -6
- data/lib/aws-sdk-core/plugins/event_stream_configuration.rb +16 -0
- data/lib/aws-sdk-core/plugins/global_configuration.rb +2 -0
- data/lib/aws-sdk-core/plugins/helpful_socket_errors.rb +2 -0
- data/lib/aws-sdk-core/plugins/http_checksum.rb +57 -0
- data/lib/aws-sdk-core/plugins/idempotency_token.rb +2 -0
- data/lib/aws-sdk-core/plugins/invocation_id.rb +35 -0
- data/lib/aws-sdk-core/plugins/jsonvalue_converter.rb +2 -0
- data/lib/aws-sdk-core/plugins/logging.rb +2 -0
- data/lib/aws-sdk-core/plugins/param_converter.rb +2 -0
- data/lib/aws-sdk-core/plugins/param_validator.rb +2 -0
- data/lib/aws-sdk-core/plugins/protocols/api_gateway.rb +19 -0
- data/lib/aws-sdk-core/plugins/protocols/ec2.rb +2 -0
- data/lib/aws-sdk-core/plugins/protocols/json_rpc.rb +2 -0
- data/lib/aws-sdk-core/plugins/protocols/query.rb +2 -0
- data/lib/aws-sdk-core/plugins/protocols/rest_json.rb +18 -1
- data/lib/aws-sdk-core/plugins/protocols/rest_xml.rb +2 -0
- data/lib/aws-sdk-core/plugins/recursion_detection.rb +27 -0
- data/lib/aws-sdk-core/plugins/regional_endpoint.rb +74 -16
- data/lib/aws-sdk-core/plugins/response_paging.rb +2 -0
- data/lib/aws-sdk-core/plugins/retries/client_rate_limiter.rb +139 -0
- data/lib/aws-sdk-core/plugins/retries/clock_skew.rb +100 -0
- data/lib/aws-sdk-core/plugins/retries/error_inspector.rb +146 -0
- data/lib/aws-sdk-core/plugins/retries/retry_quota.rb +59 -0
- data/lib/aws-sdk-core/plugins/retry_errors.rb +295 -107
- data/lib/aws-sdk-core/plugins/signature_v2.rb +2 -0
- data/lib/aws-sdk-core/plugins/signature_v4.rb +28 -25
- data/lib/aws-sdk-core/plugins/stub_responses.rb +24 -7
- data/lib/aws-sdk-core/plugins/transfer_encoding.rb +53 -0
- data/lib/aws-sdk-core/plugins/user_agent.rb +6 -8
- data/lib/aws-sdk-core/process_credentials.rb +12 -5
- data/lib/aws-sdk-core/query/ec2_param_builder.rb +2 -0
- data/lib/aws-sdk-core/query/handler.rb +2 -0
- data/lib/aws-sdk-core/query/param.rb +2 -0
- data/lib/aws-sdk-core/query/param_builder.rb +2 -0
- data/lib/aws-sdk-core/query/param_list.rb +2 -0
- data/lib/aws-sdk-core/query.rb +2 -0
- data/lib/aws-sdk-core/refreshing_credentials.rb +15 -2
- data/lib/aws-sdk-core/resources/collection.rb +2 -0
- data/lib/aws-sdk-core/rest/handler.rb +2 -0
- data/lib/aws-sdk-core/rest/request/body.rb +21 -1
- data/lib/aws-sdk-core/rest/request/builder.rb +2 -0
- data/lib/aws-sdk-core/rest/request/endpoint.rb +10 -3
- data/lib/aws-sdk-core/rest/request/headers.rb +20 -6
- data/lib/aws-sdk-core/rest/request/querystring_builder.rb +4 -2
- data/lib/aws-sdk-core/rest/response/body.rb +2 -0
- data/lib/aws-sdk-core/rest/response/headers.rb +6 -3
- data/lib/aws-sdk-core/rest/response/parser.rb +2 -0
- data/lib/aws-sdk-core/rest/response/status_code.rb +2 -0
- data/lib/aws-sdk-core/rest.rb +2 -0
- data/lib/aws-sdk-core/shared_config.rb +153 -127
- data/lib/aws-sdk-core/shared_credentials.rb +9 -1
- data/lib/aws-sdk-core/sso_credentials.rb +136 -0
- data/lib/aws-sdk-core/structure.rb +14 -4
- data/lib/aws-sdk-core/stubbing/data_applicator.rb +2 -0
- data/lib/aws-sdk-core/stubbing/empty_stub.rb +2 -0
- data/lib/aws-sdk-core/stubbing/protocols/api_gateway.rb +2 -0
- data/lib/aws-sdk-core/stubbing/protocols/ec2.rb +2 -0
- data/lib/aws-sdk-core/stubbing/protocols/json.rb +3 -1
- data/lib/aws-sdk-core/stubbing/protocols/query.rb +4 -2
- data/lib/aws-sdk-core/stubbing/protocols/rest.rb +52 -7
- data/lib/aws-sdk-core/stubbing/protocols/rest_json.rb +3 -1
- data/lib/aws-sdk-core/stubbing/protocols/rest_xml.rb +2 -2
- data/lib/aws-sdk-core/stubbing/stub_data.rb +15 -4
- data/lib/aws-sdk-core/stubbing/xml_error.rb +2 -0
- data/lib/aws-sdk-core/type_builder.rb +2 -0
- data/lib/aws-sdk-core/util.rb +6 -0
- data/lib/aws-sdk-core/waiters/errors.rb +2 -0
- data/lib/aws-sdk-core/waiters/poller.rb +2 -0
- data/lib/aws-sdk-core/waiters/waiter.rb +4 -2
- data/lib/aws-sdk-core/waiters.rb +2 -0
- data/lib/aws-sdk-core/xml/builder.rb +5 -3
- data/lib/aws-sdk-core/xml/default_list.rb +2 -0
- data/lib/aws-sdk-core/xml/default_map.rb +2 -0
- data/lib/aws-sdk-core/xml/doc_builder.rb +15 -4
- data/lib/aws-sdk-core/xml/error_handler.rb +29 -4
- data/lib/aws-sdk-core/xml/parser/engines/libxml.rb +2 -0
- data/lib/aws-sdk-core/xml/parser/engines/nokogiri.rb +2 -0
- data/lib/aws-sdk-core/xml/parser/engines/oga.rb +2 -0
- data/lib/aws-sdk-core/xml/parser/engines/ox.rb +3 -1
- data/lib/aws-sdk-core/xml/parser/engines/rexml.rb +4 -1
- data/lib/aws-sdk-core/xml/parser/frame.rb +25 -0
- data/lib/aws-sdk-core/xml/parser/parsing_error.rb +2 -0
- data/lib/aws-sdk-core/xml/parser/stack.rb +2 -0
- data/lib/aws-sdk-core/xml/parser.rb +7 -0
- data/lib/aws-sdk-core/xml.rb +2 -0
- data/lib/aws-sdk-core.rb +23 -4
- data/lib/aws-sdk-sso/client.rb +568 -0
- data/lib/aws-sdk-sso/client_api.rb +190 -0
- data/lib/aws-sdk-sso/customizations.rb +1 -0
- data/lib/aws-sdk-sso/errors.rb +102 -0
- data/lib/aws-sdk-sso/resource.rb +26 -0
- data/lib/aws-sdk-sso/types.rb +352 -0
- data/lib/aws-sdk-sso.rb +55 -0
- data/lib/aws-sdk-sts/client.rb +1282 -531
- data/lib/aws-sdk-sts/client_api.rb +76 -1
- data/lib/aws-sdk-sts/customizations.rb +4 -0
- data/lib/aws-sdk-sts/errors.rb +153 -1
- data/lib/aws-sdk-sts/plugins/sts_regional_endpoints.rb +38 -0
- data/lib/aws-sdk-sts/presigner.rb +75 -0
- data/lib/aws-sdk-sts/resource.rb +4 -1
- data/lib/aws-sdk-sts/types.rb +958 -229
- data/lib/aws-sdk-sts.rb +16 -6
- data/lib/seahorse/client/async_base.rb +52 -0
- data/lib/seahorse/client/async_response.rb +64 -0
- data/lib/seahorse/client/base.rb +7 -2
- data/lib/seahorse/client/block_io.rb +6 -2
- data/lib/seahorse/client/configuration.rb +7 -1
- data/lib/seahorse/client/events.rb +3 -1
- data/lib/seahorse/client/h2/connection.rb +250 -0
- data/lib/seahorse/client/h2/handler.rb +152 -0
- data/lib/seahorse/client/handler.rb +2 -0
- data/lib/seahorse/client/handler_builder.rb +2 -0
- data/lib/seahorse/client/handler_list.rb +2 -0
- data/lib/seahorse/client/handler_list_entry.rb +6 -4
- data/lib/seahorse/client/http/async_response.rb +44 -0
- data/lib/seahorse/client/http/headers.rb +2 -0
- data/lib/seahorse/client/http/request.rb +5 -3
- data/lib/seahorse/client/http/response.rb +18 -11
- data/lib/seahorse/client/logging/formatter.rb +6 -2
- data/lib/seahorse/client/logging/handler.rb +2 -0
- data/lib/seahorse/client/managed_file.rb +2 -0
- data/lib/seahorse/client/net_http/connection_pool.rb +30 -23
- data/lib/seahorse/client/net_http/handler.rb +24 -7
- data/lib/seahorse/client/net_http/patches.rb +15 -84
- data/lib/seahorse/client/networking_error.rb +30 -0
- data/lib/seahorse/client/plugin.rb +10 -7
- data/lib/seahorse/client/plugin_list.rb +2 -0
- data/lib/seahorse/client/plugins/content_length.rb +14 -3
- data/lib/seahorse/client/plugins/endpoint.rb +4 -2
- data/lib/seahorse/client/plugins/h2.rb +69 -0
- data/lib/seahorse/client/plugins/logging.rb +2 -0
- data/lib/seahorse/client/plugins/net_http.rb +39 -3
- data/lib/seahorse/client/plugins/operation_methods.rb +2 -0
- data/lib/seahorse/client/plugins/raise_response_errors.rb +2 -0
- data/lib/seahorse/client/plugins/request_callback.rb +110 -0
- data/lib/seahorse/client/plugins/response_target.rb +23 -14
- data/lib/seahorse/client/request.rb +2 -0
- data/lib/seahorse/client/request_context.rb +2 -0
- data/lib/seahorse/client/response.rb +5 -5
- data/lib/seahorse/model/api.rb +10 -0
- data/lib/seahorse/model/authorizer.rb +2 -0
- data/lib/seahorse/model/operation.rb +9 -0
- data/lib/seahorse/model/shapes.rb +29 -2
- data/lib/seahorse/util.rb +8 -1
- data/lib/seahorse/version.rb +2 -0
- data/lib/seahorse.rb +12 -0
- metadata +64 -14
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'openssl'
|
|
4
|
+
|
|
5
|
+
module Aws
|
|
6
|
+
module Plugins
|
|
7
|
+
# @api private
|
|
8
|
+
class HttpChecksum < Seahorse::Client::Plugin
|
|
9
|
+
# @api private
|
|
10
|
+
class Handler < Seahorse::Client::Handler
|
|
11
|
+
CHUNK_SIZE = 1 * 1024 * 1024 # one MB
|
|
12
|
+
|
|
13
|
+
def call(context)
|
|
14
|
+
if context.operation.http_checksum_required
|
|
15
|
+
body = context.http_request.body
|
|
16
|
+
context.http_request.headers['Content-Md5'] ||= md5(body)
|
|
17
|
+
end
|
|
18
|
+
@handler.call(context)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
private
|
|
22
|
+
|
|
23
|
+
# @param [File, Tempfile, IO#read, String] value
|
|
24
|
+
# @return [String<MD5>]
|
|
25
|
+
def md5(value)
|
|
26
|
+
if (value.is_a?(File) || value.is_a?(Tempfile)) &&
|
|
27
|
+
!value.path.nil? && File.exist?(value.path)
|
|
28
|
+
OpenSSL::Digest::MD5.file(value).base64digest
|
|
29
|
+
elsif value.respond_to?(:read)
|
|
30
|
+
md5 = OpenSSL::Digest::MD5.new
|
|
31
|
+
update_in_chunks(md5, value)
|
|
32
|
+
md5.base64digest
|
|
33
|
+
else
|
|
34
|
+
OpenSSL::Digest::MD5.digest(value).base64digest
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def update_in_chunks(digest, io)
|
|
39
|
+
loop do
|
|
40
|
+
chunk = io.read(CHUNK_SIZE)
|
|
41
|
+
break unless chunk
|
|
42
|
+
digest.update(chunk)
|
|
43
|
+
end
|
|
44
|
+
io.rewind
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def add_handlers(handlers, _config)
|
|
50
|
+
# priority set low to ensure checksum is computed AFTER the request is
|
|
51
|
+
# built but before it is signed
|
|
52
|
+
handlers.add(Handler, priority: 10, step: :build)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'securerandom'
|
|
4
|
+
|
|
5
|
+
module Aws
|
|
6
|
+
module Plugins
|
|
7
|
+
|
|
8
|
+
# @api private
|
|
9
|
+
class InvocationId < Seahorse::Client::Plugin
|
|
10
|
+
|
|
11
|
+
# @api private
|
|
12
|
+
class Handler < Seahorse::Client::Handler
|
|
13
|
+
|
|
14
|
+
def call(context)
|
|
15
|
+
apply_invocation_id(context)
|
|
16
|
+
@handler.call(context)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
private
|
|
20
|
+
|
|
21
|
+
def apply_invocation_id(context)
|
|
22
|
+
context.http_request.headers['amz-sdk-invocation-id'] = SecureRandom.uuid
|
|
23
|
+
if context[:input_event_emitter]
|
|
24
|
+
# only used for eventstreaming at input
|
|
25
|
+
context.http_request.headers['x-amz-content-sha256'] = 'STREAMING-AWS4-HMAC-SHA256-EVENTS'
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
handler(Handler, step: :initialize)
|
|
32
|
+
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -1,10 +1,29 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Aws
|
|
2
4
|
module Plugins
|
|
3
5
|
module Protocols
|
|
4
6
|
class ApiGateway < Seahorse::Client::Plugin
|
|
7
|
+
|
|
8
|
+
class ContentTypeHandler < Seahorse::Client::Handler
|
|
9
|
+
def call(context)
|
|
10
|
+
body = context.http_request.body
|
|
11
|
+
# Rest::Handler will set a default JSON body, so size can be checked
|
|
12
|
+
# if this handler is run after serialization.
|
|
13
|
+
if !body.respond_to?(:size) ||
|
|
14
|
+
(body.respond_to?(:size) && body.size > 0)
|
|
15
|
+
context.http_request.headers['Content-Type'] ||=
|
|
16
|
+
'application/json'
|
|
17
|
+
end
|
|
18
|
+
@handler.call(context)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
5
22
|
handler(Rest::Handler)
|
|
23
|
+
handler(ContentTypeHandler, priority: 30)
|
|
6
24
|
handler(Json::ErrorHandler, step: :sign)
|
|
7
25
|
end
|
|
26
|
+
|
|
8
27
|
end
|
|
9
28
|
end
|
|
10
29
|
end
|
|
@@ -1,12 +1,29 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Aws
|
|
2
4
|
module Plugins
|
|
3
5
|
module Protocols
|
|
4
6
|
class RestJson < Seahorse::Client::Plugin
|
|
5
7
|
|
|
8
|
+
class ContentTypeHandler < Seahorse::Client::Handler
|
|
9
|
+
def call(context)
|
|
10
|
+
body = context.http_request.body
|
|
11
|
+
# Rest::Handler will set a default JSON body, so size can be checked
|
|
12
|
+
# if this handler is run after serialization.
|
|
13
|
+
if !body.respond_to?(:size) ||
|
|
14
|
+
(body.respond_to?(:size) && body.size > 0)
|
|
15
|
+
context.http_request.headers['Content-Type'] ||=
|
|
16
|
+
'application/json'
|
|
17
|
+
end
|
|
18
|
+
@handler.call(context)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
6
22
|
handler(Rest::Handler)
|
|
23
|
+
handler(ContentTypeHandler, priority: 30)
|
|
7
24
|
handler(Json::ErrorHandler, step: :sign)
|
|
8
|
-
|
|
9
25
|
end
|
|
26
|
+
|
|
10
27
|
end
|
|
11
28
|
end
|
|
12
29
|
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Aws
|
|
4
|
+
module Plugins
|
|
5
|
+
# @api private
|
|
6
|
+
class RecursionDetection < Seahorse::Client::Plugin
|
|
7
|
+
|
|
8
|
+
# @api private
|
|
9
|
+
class Handler < Seahorse::Client::Handler
|
|
10
|
+
def call(context)
|
|
11
|
+
|
|
12
|
+
unless context.http_request.headers.key?('x-amz-trace-id')
|
|
13
|
+
if ENV['AWS_LAMBDA_FUNCTION_NAME'] &&
|
|
14
|
+
(trace_id = ENV['_X_AMZ_TRACE_ID'])
|
|
15
|
+
context.http_request.headers['x-amz-trace-id'] = trace_id
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
@handler.call(context)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# should be at the end of build so that
|
|
23
|
+
# modeled traits / service customizations apply first
|
|
24
|
+
handler(Handler, step: :build, order: 99)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -1,11 +1,9 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Aws
|
|
2
4
|
module Plugins
|
|
3
5
|
# @api private
|
|
4
6
|
class RegionalEndpoint < Seahorse::Client::Plugin
|
|
5
|
-
|
|
6
|
-
# raised when region is not configured
|
|
7
|
-
MISSING_REGION = 'missing required configuration option :region'
|
|
8
|
-
|
|
9
7
|
option(:profile)
|
|
10
8
|
|
|
11
9
|
option(:region,
|
|
@@ -14,7 +12,7 @@ module Aws
|
|
|
14
12
|
docstring: <<-DOCS) do |cfg|
|
|
15
13
|
The AWS region to connect to. The configured `:region` is
|
|
16
14
|
used to determine the service `:endpoint`. When not passed,
|
|
17
|
-
a default `:region` is
|
|
15
|
+
a default `:region` is searched for in the following locations:
|
|
18
16
|
|
|
19
17
|
* `Aws.config[:region]`
|
|
20
18
|
* `ENV['AWS_REGION']`
|
|
@@ -26,35 +24,95 @@ a default `:region` is search for in the following locations:
|
|
|
26
24
|
resolve_region(cfg)
|
|
27
25
|
end
|
|
28
26
|
|
|
27
|
+
option(:use_dualstack_endpoint,
|
|
28
|
+
doc_type: 'Boolean',
|
|
29
|
+
docstring: <<-DOCS) do |cfg|
|
|
30
|
+
When set to `true`, dualstack enabled endpoints (with `.aws` TLD)
|
|
31
|
+
will be used if available.
|
|
32
|
+
DOCS
|
|
33
|
+
resolve_use_dualstack_endpoint(cfg)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
option(:use_fips_endpoint,
|
|
37
|
+
doc_type: 'Boolean',
|
|
38
|
+
docstring: <<-DOCS) do |cfg|
|
|
39
|
+
When set to `true`, fips compatible endpoints will be used if available.
|
|
40
|
+
When a `fips` region is used, the region is normalized and this config
|
|
41
|
+
is set to `true`.
|
|
42
|
+
DOCS
|
|
43
|
+
resolve_use_fips_endpoint(cfg)
|
|
44
|
+
end
|
|
45
|
+
|
|
29
46
|
option(:regional_endpoint, false)
|
|
30
47
|
|
|
31
48
|
option(:endpoint, doc_type: String, docstring: <<-DOCS) do |cfg|
|
|
32
49
|
The client endpoint is normally constructed from the `:region`
|
|
33
50
|
option. You should only configure an `:endpoint` when connecting
|
|
34
|
-
to test endpoints. This should be
|
|
51
|
+
to test or custom endpoints. This should be a valid HTTP(S) URI.
|
|
35
52
|
DOCS
|
|
36
53
|
endpoint_prefix = cfg.api.metadata['endpointPrefix']
|
|
37
54
|
if cfg.region && endpoint_prefix
|
|
38
|
-
|
|
55
|
+
if cfg.respond_to?(:sts_regional_endpoints)
|
|
56
|
+
sts_regional = cfg.sts_regional_endpoints
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# check region is a valid RFC host label
|
|
60
|
+
unless Seahorse::Util.host_label?(cfg.region)
|
|
61
|
+
raise Errors::InvalidRegionError
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
region = cfg.region
|
|
65
|
+
new_region = region.gsub('fips-', '').gsub('-fips', '')
|
|
66
|
+
if region != new_region
|
|
67
|
+
warn("Legacy region #{region} was transformed to #{new_region}."\
|
|
68
|
+
'`use_fips_endpoint` config was set to true.')
|
|
69
|
+
cfg.override_config(:use_fips_endpoint, true)
|
|
70
|
+
cfg.override_config(:region, new_region)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
Aws::Partitions::EndpointProvider.resolve(
|
|
74
|
+
cfg.region,
|
|
75
|
+
endpoint_prefix,
|
|
76
|
+
sts_regional,
|
|
77
|
+
{
|
|
78
|
+
dualstack: cfg.use_dualstack_endpoint,
|
|
79
|
+
fips: cfg.use_fips_endpoint
|
|
80
|
+
}
|
|
81
|
+
)
|
|
39
82
|
end
|
|
40
83
|
end
|
|
41
84
|
|
|
42
85
|
def after_initialize(client)
|
|
43
|
-
if client.config.region.nil?
|
|
86
|
+
if client.config.region.nil? || client.config.region == ''
|
|
44
87
|
raise Errors::MissingRegionError
|
|
45
88
|
end
|
|
46
89
|
end
|
|
47
90
|
|
|
48
|
-
|
|
91
|
+
class << self
|
|
92
|
+
private
|
|
49
93
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
94
|
+
def resolve_region(cfg)
|
|
95
|
+
keys = %w[AWS_REGION AMAZON_REGION AWS_DEFAULT_REGION]
|
|
96
|
+
env_region = ENV.values_at(*keys).compact.first
|
|
97
|
+
env_region = nil if env_region == ''
|
|
98
|
+
cfg_region = Aws.shared_config.region(profile: cfg.profile)
|
|
99
|
+
env_region || cfg_region
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def resolve_use_dualstack_endpoint(cfg)
|
|
103
|
+
value = ENV['AWS_USE_DUALSTACK_ENDPOINT']
|
|
104
|
+
value ||= Aws.shared_config.use_dualstack_endpoint(
|
|
105
|
+
profile: cfg.profile
|
|
106
|
+
)
|
|
107
|
+
Aws::Util.str_2_bool(value) || false
|
|
108
|
+
end
|
|
57
109
|
|
|
110
|
+
def resolve_use_fips_endpoint(cfg)
|
|
111
|
+
value = ENV['AWS_USE_FIPS_ENDPOINT']
|
|
112
|
+
value ||= Aws.shared_config.use_fips_endpoint(profile: cfg.profile)
|
|
113
|
+
Aws::Util.str_2_bool(value) || false
|
|
114
|
+
end
|
|
115
|
+
end
|
|
58
116
|
end
|
|
59
117
|
end
|
|
60
118
|
end
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Aws
|
|
4
|
+
module Plugins
|
|
5
|
+
module Retries
|
|
6
|
+
# @api private
|
|
7
|
+
# Used only in 'adaptive' retry mode
|
|
8
|
+
class ClientRateLimiter
|
|
9
|
+
MIN_CAPACITY = 1
|
|
10
|
+
MIN_FILL_RATE = 0.5
|
|
11
|
+
SMOOTH = 0.8
|
|
12
|
+
# How much to scale back after a throttling response
|
|
13
|
+
BETA = 0.7
|
|
14
|
+
# Controls how aggressively we scale up after being throttled
|
|
15
|
+
SCALE_CONSTANT = 0.4
|
|
16
|
+
|
|
17
|
+
def initialize
|
|
18
|
+
@mutex = Mutex.new
|
|
19
|
+
@fill_rate = nil
|
|
20
|
+
@max_capacity = nil
|
|
21
|
+
@current_capacity = 0
|
|
22
|
+
@last_timestamp = nil
|
|
23
|
+
@enabled = false
|
|
24
|
+
@measured_tx_rate = 0
|
|
25
|
+
@last_tx_rate_bucket = Aws::Util.monotonic_seconds
|
|
26
|
+
@request_count = 0
|
|
27
|
+
@last_max_rate = 0
|
|
28
|
+
@last_throttle_time = Aws::Util.monotonic_seconds
|
|
29
|
+
@calculated_rate = nil
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def token_bucket_acquire(amount, wait_to_fill = true)
|
|
33
|
+
# Client side throttling is not enabled until we see a
|
|
34
|
+
# throttling error
|
|
35
|
+
return unless @enabled
|
|
36
|
+
|
|
37
|
+
@mutex.synchronize do
|
|
38
|
+
token_bucket_refill
|
|
39
|
+
|
|
40
|
+
# Next see if we have enough capacity for the requested amount
|
|
41
|
+
while @current_capacity < amount
|
|
42
|
+
raise Aws::Errors::RetryCapacityNotAvailableError unless wait_to_fill
|
|
43
|
+
@mutex.sleep((amount - @current_capacity) / @fill_rate)
|
|
44
|
+
token_bucket_refill
|
|
45
|
+
end
|
|
46
|
+
@current_capacity -= amount
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def update_sending_rate(is_throttling_error)
|
|
51
|
+
@mutex.synchronize do
|
|
52
|
+
update_measured_rate
|
|
53
|
+
|
|
54
|
+
if is_throttling_error
|
|
55
|
+
rate_to_use = if @enabled
|
|
56
|
+
[@measured_tx_rate, @fill_rate].min
|
|
57
|
+
else
|
|
58
|
+
@measured_tx_rate
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# The fill_rate is from the token bucket
|
|
62
|
+
@last_max_rate = rate_to_use
|
|
63
|
+
calculate_time_window
|
|
64
|
+
@last_throttle_time = Aws::Util.monotonic_seconds
|
|
65
|
+
@calculated_rate = cubic_throttle(rate_to_use)
|
|
66
|
+
enable_token_bucket
|
|
67
|
+
else
|
|
68
|
+
calculate_time_window
|
|
69
|
+
@calculated_rate = cubic_success(Aws::Util.monotonic_seconds)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
new_rate = [@calculated_rate, 2 * @measured_tx_rate].min
|
|
73
|
+
token_bucket_update_rate(new_rate)
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
private
|
|
78
|
+
|
|
79
|
+
def token_bucket_refill
|
|
80
|
+
timestamp = Aws::Util.monotonic_seconds
|
|
81
|
+
unless @last_timestamp
|
|
82
|
+
@last_timestamp = timestamp
|
|
83
|
+
return
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
fill_amount = (timestamp - @last_timestamp) * @fill_rate
|
|
87
|
+
@current_capacity = [
|
|
88
|
+
@max_capacity, @current_capacity + fill_amount
|
|
89
|
+
].min
|
|
90
|
+
|
|
91
|
+
@last_timestamp = timestamp
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def token_bucket_update_rate(new_rps)
|
|
95
|
+
# Refill based on our current rate before we update to the
|
|
96
|
+
# new fill rate
|
|
97
|
+
token_bucket_refill
|
|
98
|
+
@fill_rate = [new_rps, MIN_FILL_RATE].max
|
|
99
|
+
@max_capacity = [new_rps, MIN_CAPACITY].max
|
|
100
|
+
# When we scale down we can't have a current capacity that exceeds our
|
|
101
|
+
# max_capacity.
|
|
102
|
+
@current_capacity = [@current_capacity, @max_capacity].min
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def enable_token_bucket
|
|
106
|
+
@enabled = true
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def update_measured_rate
|
|
110
|
+
t = Aws::Util.monotonic_seconds
|
|
111
|
+
time_bucket = (t * 2).floor / 2.0
|
|
112
|
+
@request_count += 1
|
|
113
|
+
if time_bucket > @last_tx_rate_bucket
|
|
114
|
+
current_rate = @request_count / (time_bucket - @last_tx_rate_bucket)
|
|
115
|
+
@measured_tx_rate = (current_rate * SMOOTH) +
|
|
116
|
+
(@measured_tx_rate * (1 - SMOOTH))
|
|
117
|
+
@request_count = 0
|
|
118
|
+
@last_tx_rate_bucket = time_bucket
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def calculate_time_window
|
|
123
|
+
# This is broken out into a separate calculation because it only
|
|
124
|
+
# gets updated when @last_max_rate changes so it can be cached.
|
|
125
|
+
@time_window = ((@last_max_rate * (1 - BETA)) / SCALE_CONSTANT)**(1.0 / 3)
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def cubic_success(timestamp)
|
|
129
|
+
dt = timestamp - @last_throttle_time
|
|
130
|
+
(SCALE_CONSTANT * ((dt - @time_window)**3)) + @last_max_rate
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def cubic_throttle(rate_to_use)
|
|
134
|
+
rate_to_use * BETA
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
end
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Aws
|
|
4
|
+
module Plugins
|
|
5
|
+
module Retries
|
|
6
|
+
|
|
7
|
+
# @api private
|
|
8
|
+
class ClockSkew
|
|
9
|
+
|
|
10
|
+
CLOCK_SKEW_THRESHOLD = 5 * 60 # five minutes
|
|
11
|
+
|
|
12
|
+
def initialize
|
|
13
|
+
@mutex = Mutex.new
|
|
14
|
+
# clock_corrections are recorded only on errors
|
|
15
|
+
# and only when time difference is greater than the
|
|
16
|
+
# CLOCK_SKEW_THRESHOLD
|
|
17
|
+
@endpoint_clock_corrections = Hash.new(0)
|
|
18
|
+
|
|
19
|
+
# estimated_skew is calculated on every request
|
|
20
|
+
# and is used to estimate a TTL for requests
|
|
21
|
+
@endpoint_estimated_skews = Hash.new(nil)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Gets the clock_correction in seconds to apply to a given endpoint
|
|
25
|
+
# @param endpoint [URI / String]
|
|
26
|
+
def clock_correction(endpoint)
|
|
27
|
+
@mutex.synchronize { @endpoint_clock_corrections[endpoint.to_s] }
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# The estimated skew factors in any clock skew from
|
|
31
|
+
# the service along with any network latency.
|
|
32
|
+
# This provides a more accurate value for the ttl,
|
|
33
|
+
# which should represent when the client will stop
|
|
34
|
+
# waiting for a request.
|
|
35
|
+
# Estimated Skew should not be used to correct clock skew errors
|
|
36
|
+
# it should only be used to estimate TTL for a request
|
|
37
|
+
def estimated_skew(endpoint)
|
|
38
|
+
@mutex.synchronize { @endpoint_estimated_skews[endpoint.to_s] }
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Determines whether a request has clock skew by comparing
|
|
42
|
+
# the current time against the server's time in the response
|
|
43
|
+
# @param context [Seahorse::Client::RequestContext]
|
|
44
|
+
def clock_skewed?(context)
|
|
45
|
+
server_time = server_time(context.http_response)
|
|
46
|
+
!!server_time &&
|
|
47
|
+
(Time.now.utc - server_time).abs > CLOCK_SKEW_THRESHOLD
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Called only on clock skew related errors
|
|
51
|
+
# Update the stored clock skew correction value for an endpoint
|
|
52
|
+
# from the server's time in the response
|
|
53
|
+
# @param context [Seahorse::Client::RequestContext]
|
|
54
|
+
def update_clock_correction(context)
|
|
55
|
+
endpoint = context.http_request.endpoint
|
|
56
|
+
now_utc = Time.now.utc
|
|
57
|
+
server_time = server_time(context.http_response)
|
|
58
|
+
if server_time && (now_utc - server_time).abs > CLOCK_SKEW_THRESHOLD
|
|
59
|
+
set_clock_correction(endpoint, server_time - now_utc)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Called for every request
|
|
64
|
+
# Update our estimated clock skew for the endpoint
|
|
65
|
+
# from the servers time in the response
|
|
66
|
+
# @param context [Seahorse::Client::RequestContext]
|
|
67
|
+
def update_estimated_skew(context)
|
|
68
|
+
endpoint = context.http_request.endpoint
|
|
69
|
+
now_utc = Time.now.utc
|
|
70
|
+
server_time = server_time(context.http_response)
|
|
71
|
+
return unless server_time
|
|
72
|
+
@mutex.synchronize do
|
|
73
|
+
@endpoint_estimated_skews[endpoint.to_s] = server_time - now_utc
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
private
|
|
78
|
+
|
|
79
|
+
# @param response [Seahorse::Client::Http::Response:]
|
|
80
|
+
def server_time(response)
|
|
81
|
+
begin
|
|
82
|
+
Time.parse(response.headers['date']).utc
|
|
83
|
+
rescue
|
|
84
|
+
nil
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Sets the clock correction for an endpoint
|
|
89
|
+
# @param endpoint [URI / String]
|
|
90
|
+
# @param correction [Number]
|
|
91
|
+
def set_clock_correction(endpoint, correction)
|
|
92
|
+
@mutex.synchronize do
|
|
93
|
+
@endpoint_clock_corrections[endpoint.to_s] = correction
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|