aws-sdk-core 2.0.14 → 2.0.15
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/apis/EMR.api.json +8 -2
- data/apis/EMR.waiters2.json +42 -0
- data/apis/StorageGateway.api.json +79 -5
- data/lib/aws-sdk-core.rb +1 -0
- data/lib/aws-sdk-core/api/service_customizations.rb +1 -0
- data/lib/aws-sdk-core/json/rpc_body_handler.rb +3 -2
- data/lib/aws-sdk-core/plugins/dynamodb_crc32_validation.rb +52 -0
- data/lib/aws-sdk-core/plugins/retry_errors.rb +2 -2
- data/lib/aws-sdk-core/query/ec2_param_builder.rb +1 -1
- data/lib/aws-sdk-core/query/param_builder.rb +1 -1
- data/lib/aws-sdk-core/version.rb +1 -1
- data/lib/aws-sdk-core/xml/builder.rb +1 -1
- data/lib/seahorse.rb +1 -1
- data/lib/seahorse/client/events.rb +21 -0
- data/lib/seahorse/client/http/response.rb +132 -0
- data/lib/seahorse/client/net_http/handler.rb +31 -25
- data/lib/seahorse/client/networking_error.rb +15 -0
- data/lib/seahorse/client/param_converter.rb +1 -1
- data/lib/seahorse/client/response.rb +25 -19
- metadata +6 -3
- data/lib/seahorse/client/http/error.rb +0 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 84fc88b74b44f8ef7c02f5d7a4a75ebc2f932aa7
|
4
|
+
data.tar.gz: 0706c496c2feca0125dceabe8ffcc09b3fb7a9ad
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f5e2875fe0423c6db01c9be6db915ca89462ff4cb44f99ddaa6a41a104a7b3eb22ca591fd78caa580f9674fe6009e2b1c0fe54753c56b554883e4d14a6ea7b36
|
7
|
+
data.tar.gz: 68bb2fc0e47ee3923be741bca221aa98926e268d0d361ff15e62dc68b5361b86751ff60190a57156aba293580f78f65676511aa25493a80a6e31abdeb29f72fe
|
data/apis/EMR.api.json
CHANGED
@@ -456,7 +456,9 @@
|
|
456
456
|
"VisibleToAllUsers":{"shape":"Boolean"},
|
457
457
|
"Applications":{"shape":"ApplicationList"},
|
458
458
|
"Tags":{"shape":"TagList"},
|
459
|
-
"ServiceRole":{"shape":"String"}
|
459
|
+
"ServiceRole":{"shape":"String"},
|
460
|
+
"NormalizedInstanceHours":{"shape":"Integer"},
|
461
|
+
"MasterPublicDnsName":{"shape":"String"}
|
460
462
|
}
|
461
463
|
},
|
462
464
|
"ClusterId":{"type":"string"},
|
@@ -508,7 +510,8 @@
|
|
508
510
|
"members":{
|
509
511
|
"Id":{"shape":"ClusterId"},
|
510
512
|
"Name":{"shape":"String"},
|
511
|
-
"Status":{"shape":"ClusterStatus"}
|
513
|
+
"Status":{"shape":"ClusterStatus"},
|
514
|
+
"NormalizedInstanceHours":{"shape":"Integer"}
|
512
515
|
}
|
513
516
|
},
|
514
517
|
"ClusterSummaryList":{
|
@@ -1044,6 +1047,7 @@
|
|
1044
1047
|
"members":{
|
1045
1048
|
"ClusterId":{"shape":"ClusterId"},
|
1046
1049
|
"StepStates":{"shape":"StepStateList"},
|
1050
|
+
"StepIds":{"shape":"XmlStringList"},
|
1047
1051
|
"Marker":{"shape":"Marker"}
|
1048
1052
|
}
|
1049
1053
|
},
|
@@ -1265,6 +1269,8 @@
|
|
1265
1269
|
"members":{
|
1266
1270
|
"Id":{"shape":"StepId"},
|
1267
1271
|
"Name":{"shape":"String"},
|
1272
|
+
"Config":{"shape":"HadoopStepConfig"},
|
1273
|
+
"ActionOnFailure":{"shape":"ActionOnFailure"},
|
1268
1274
|
"Status":{"shape":"StepStatus"}
|
1269
1275
|
}
|
1270
1276
|
},
|
@@ -0,0 +1,42 @@
|
|
1
|
+
{
|
2
|
+
"version": 2,
|
3
|
+
"waiters": {
|
4
|
+
"ClusterRunning": {
|
5
|
+
"delay": 30,
|
6
|
+
"operation": "DescribeCluster",
|
7
|
+
"maxAttempts": 60,
|
8
|
+
"acceptors": [
|
9
|
+
{
|
10
|
+
"state": "success",
|
11
|
+
"matcher": "path",
|
12
|
+
"argument": "Cluster.Status.State",
|
13
|
+
"expected": "RUNNING"
|
14
|
+
},
|
15
|
+
{
|
16
|
+
"state": "success",
|
17
|
+
"matcher": "path",
|
18
|
+
"argument": "Cluster.Status.State",
|
19
|
+
"expected": "WAITING"
|
20
|
+
},
|
21
|
+
{
|
22
|
+
"state": "failure",
|
23
|
+
"matcher": "path",
|
24
|
+
"argument": "Cluster.Status.State",
|
25
|
+
"expected": "TERMINATING"
|
26
|
+
},
|
27
|
+
{
|
28
|
+
"state": "failure",
|
29
|
+
"matcher": "path",
|
30
|
+
"argument": "Cluster.Status.State",
|
31
|
+
"expected": "TERMINATED"
|
32
|
+
},
|
33
|
+
{
|
34
|
+
"state": "failure",
|
35
|
+
"matcher": "path",
|
36
|
+
"argument": "Cluster.Status.State",
|
37
|
+
"expected": "TERMINATED_WITH_ERRORS"
|
38
|
+
}
|
39
|
+
]
|
40
|
+
}
|
41
|
+
}
|
42
|
+
}
|
@@ -786,6 +786,27 @@
|
|
786
786
|
}
|
787
787
|
]
|
788
788
|
},
|
789
|
+
"ResetCache":{
|
790
|
+
"name":"ResetCache",
|
791
|
+
"http":{
|
792
|
+
"method":"POST",
|
793
|
+
"requestUri":"/"
|
794
|
+
},
|
795
|
+
"input":{"shape":"ResetCacheInput"},
|
796
|
+
"output":{"shape":"ResetCacheOutput"},
|
797
|
+
"errors":[
|
798
|
+
{
|
799
|
+
"shape":"InvalidGatewayRequestException",
|
800
|
+
"error":{"httpStatusCode":400},
|
801
|
+
"exception":true
|
802
|
+
},
|
803
|
+
{
|
804
|
+
"shape":"InternalServerError",
|
805
|
+
"error":{"httpStatusCode":500},
|
806
|
+
"exception":true
|
807
|
+
}
|
808
|
+
]
|
809
|
+
},
|
789
810
|
"RetrieveTapeArchive":{
|
790
811
|
"name":"RetrieveTapeArchive",
|
791
812
|
"http":{
|
@@ -995,6 +1016,27 @@
|
|
995
1016
|
"exception":true
|
996
1017
|
}
|
997
1018
|
]
|
1019
|
+
},
|
1020
|
+
"UpdateVTLDeviceType":{
|
1021
|
+
"name":"UpdateVTLDeviceType",
|
1022
|
+
"http":{
|
1023
|
+
"method":"POST",
|
1024
|
+
"requestUri":"/"
|
1025
|
+
},
|
1026
|
+
"input":{"shape":"UpdateVTLDeviceTypeInput"},
|
1027
|
+
"output":{"shape":"UpdateVTLDeviceTypeOutput"},
|
1028
|
+
"errors":[
|
1029
|
+
{
|
1030
|
+
"shape":"InvalidGatewayRequestException",
|
1031
|
+
"error":{"httpStatusCode":400},
|
1032
|
+
"exception":true
|
1033
|
+
},
|
1034
|
+
{
|
1035
|
+
"shape":"InternalServerError",
|
1036
|
+
"error":{"httpStatusCode":500},
|
1037
|
+
"exception":true
|
1038
|
+
}
|
1039
|
+
]
|
998
1040
|
}
|
999
1041
|
},
|
1000
1042
|
"shapes":{
|
@@ -1615,6 +1657,11 @@
|
|
1615
1657
|
"min":1,
|
1616
1658
|
"max":255
|
1617
1659
|
},
|
1660
|
+
"DeviceType":{
|
1661
|
+
"type":"string",
|
1662
|
+
"min":2,
|
1663
|
+
"max":50
|
1664
|
+
},
|
1618
1665
|
"DeviceiSCSIAttributes":{
|
1619
1666
|
"type":"structure",
|
1620
1667
|
"members":{
|
@@ -1643,6 +1690,7 @@
|
|
1643
1690
|
"DiskId":{"shape":"DiskId"},
|
1644
1691
|
"DiskPath":{"shape":"string"},
|
1645
1692
|
"DiskNode":{"shape":"string"},
|
1693
|
+
"DiskStatus":{"shape":"string"},
|
1646
1694
|
"DiskSizeInBytes":{"shape":"long"},
|
1647
1695
|
"DiskAllocationType":{"shape":"DiskAllocationType"},
|
1648
1696
|
"DiskAllocationResource":{"shape":"string"}
|
@@ -1924,6 +1972,19 @@
|
|
1924
1972
|
"min":1,
|
1925
1973
|
"max":25
|
1926
1974
|
},
|
1975
|
+
"ResetCacheInput":{
|
1976
|
+
"type":"structure",
|
1977
|
+
"required":["GatewayARN"],
|
1978
|
+
"members":{
|
1979
|
+
"GatewayARN":{"shape":"GatewayARN"}
|
1980
|
+
}
|
1981
|
+
},
|
1982
|
+
"ResetCacheOutput":{
|
1983
|
+
"type":"structure",
|
1984
|
+
"members":{
|
1985
|
+
"GatewayARN":{"shape":"GatewayARN"}
|
1986
|
+
}
|
1987
|
+
},
|
1927
1988
|
"RetrieveTapeArchiveInput":{
|
1928
1989
|
"type":"structure",
|
1929
1990
|
"required":[
|
@@ -2086,11 +2147,7 @@
|
|
2086
2147
|
"member":{"shape":"TapeRecoveryPointInfo"}
|
2087
2148
|
},
|
2088
2149
|
"TapeRecoveryPointStatus":{"type":"string"},
|
2089
|
-
"TapeSize":{
|
2090
|
-
"type":"long",
|
2091
|
-
"min":107374182400,
|
2092
|
-
"max":2748779069440
|
2093
|
-
},
|
2150
|
+
"TapeSize":{"type":"long"},
|
2094
2151
|
"TapeStatus":{"type":"string"},
|
2095
2152
|
"Tapes":{
|
2096
2153
|
"type":"list",
|
@@ -2213,6 +2270,23 @@
|
|
2213
2270
|
"VolumeARN":{"shape":"VolumeARN"}
|
2214
2271
|
}
|
2215
2272
|
},
|
2273
|
+
"UpdateVTLDeviceTypeInput":{
|
2274
|
+
"type":"structure",
|
2275
|
+
"required":[
|
2276
|
+
"VTLDeviceARN",
|
2277
|
+
"DeviceType"
|
2278
|
+
],
|
2279
|
+
"members":{
|
2280
|
+
"VTLDeviceARN":{"shape":"VTLDeviceARN"},
|
2281
|
+
"DeviceType":{"shape":"DeviceType"}
|
2282
|
+
}
|
2283
|
+
},
|
2284
|
+
"UpdateVTLDeviceTypeOutput":{
|
2285
|
+
"type":"structure",
|
2286
|
+
"members":{
|
2287
|
+
"VTLDeviceARN":{"shape":"VTLDeviceARN"}
|
2288
|
+
}
|
2289
|
+
},
|
2216
2290
|
"VTLDevice":{
|
2217
2291
|
"type":"structure",
|
2218
2292
|
"members":{
|
data/lib/aws-sdk-core.rb
CHANGED
@@ -124,6 +124,7 @@ module Aws
|
|
124
124
|
autoload :CSDConditionalSigning, 'aws-sdk-core/plugins/csd_conditional_signing'
|
125
125
|
autoload :DynamoDBExtendedRetries, 'aws-sdk-core/plugins/dynamodb_extended_retries'
|
126
126
|
autoload :DynamoDBSimpleAttributes, 'aws-sdk-core/plugins/dynamodb_simple_attributes'
|
127
|
+
autoload :DynamoDBCRC32Validation, 'aws-sdk-core/plugins/dynamodb_crc32_validation'
|
127
128
|
autoload :EC2CopyEncryptedSnapshot, 'aws-sdk-core/plugins/ec2_copy_encrypted_snapshot'
|
128
129
|
autoload :GlacierAccountId, 'aws-sdk-core/plugins/glacier_account_id'
|
129
130
|
autoload :GlacierApiVersion, 'aws-sdk-core/plugins/glacier_api_version'
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Aws
|
2
|
+
module Plugins
|
3
|
+
|
4
|
+
# @seahorse.client.option [Boolean] :compute_checksums (true)
|
5
|
+
# When `true`, a CRC32 checksum is computed of every HTTP
|
6
|
+
# response body and compared against the `X-Amz-Crc32` header.
|
7
|
+
# If the checksums do not match, the request is re-sent.
|
8
|
+
# Failures can be retried up to `:retry_limit` times.
|
9
|
+
class DynamoDBCRC32Validation < Seahorse::Client::Plugin
|
10
|
+
|
11
|
+
option(:compute_checksums, true)
|
12
|
+
|
13
|
+
def add_handlers(handlers, config)
|
14
|
+
if config.compute_checksums
|
15
|
+
handlers.add(Handler, step: :sign)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class Handler < Seahorse::Client::Handler
|
20
|
+
|
21
|
+
def call(context)
|
22
|
+
# disable response gzipping - Net::HTTP unzips these responses
|
23
|
+
# before we can see the body, making it impossible to verify
|
24
|
+
# the CRC32 checksum against the compressed body stream
|
25
|
+
context.http_request.headers['accept-encoding'] = ''
|
26
|
+
|
27
|
+
@handler.call(context).on_success do |response|
|
28
|
+
response.error = validate(context)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def validate(context)
|
35
|
+
unless crc32_is_valid?(context.http_response)
|
36
|
+
msg = "Response failed CRC32 check."
|
37
|
+
return Aws::DynamoDB::Errors::CRC32CheckFailed.new(context, msg)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def crc32_is_valid?(response)
|
42
|
+
if crc_checksum = response.headers['x-amz-crc32']
|
43
|
+
crc_checksum.to_i == Zlib.crc32(response.body_contents)
|
44
|
+
else
|
45
|
+
true
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -61,7 +61,7 @@ module Aws
|
|
61
61
|
end
|
62
62
|
|
63
63
|
def networking?
|
64
|
-
@error.is_a?(Seahorse::Client::
|
64
|
+
@error.is_a?(Seahorse::Client::NetworkingError) ||
|
65
65
|
NETWORKING_ERRORS.include?(@name) ||
|
66
66
|
@http_status_code == 0
|
67
67
|
end
|
@@ -115,7 +115,7 @@ module Aws
|
|
115
115
|
context.retries += 1
|
116
116
|
context.config.credentials.refresh! if error.expired_credentials?
|
117
117
|
context.http_request.body.rewind
|
118
|
-
context.http_response.
|
118
|
+
context.http_response.reset
|
119
119
|
call(context)
|
120
120
|
end
|
121
121
|
|
@@ -57,7 +57,7 @@ module Aws
|
|
57
57
|
when 'structure' then structure(shape, value, prefix + '.')
|
58
58
|
when 'list' then list(shape, value, prefix)
|
59
59
|
when 'map' then raise NotImplementedError
|
60
|
-
when 'blob' then set(prefix, Base64.strict_encode64(value))
|
60
|
+
when 'blob' then set(prefix, Base64.strict_encode64(value.read))
|
61
61
|
when 'timestamp'
|
62
62
|
set(prefix, shape.format_time(value, 'iso8601').to_s)
|
63
63
|
else
|
@@ -80,7 +80,7 @@ module Aws
|
|
80
80
|
when 'structure' then structure(shape, value, prefix + '.')
|
81
81
|
when 'list' then list(shape, value, prefix)
|
82
82
|
when 'map' then map(shape, value, prefix)
|
83
|
-
when 'blob' then set(prefix, Base64.strict_encode64(value))
|
83
|
+
when 'blob' then set(prefix, Base64.strict_encode64(value.read))
|
84
84
|
when 'timestamp'
|
85
85
|
set(prefix, shape.format_time(value, 'iso8601').to_s)
|
86
86
|
else
|
data/lib/aws-sdk-core/version.rb
CHANGED
@@ -66,7 +66,7 @@ module Aws
|
|
66
66
|
when 'structure' then structure(name, shape, value)
|
67
67
|
when 'list' then list(name, shape, value)
|
68
68
|
when 'timestamp' then node(name, shape, shape.format_time(value, 'iso8601'))
|
69
|
-
when 'blob' then node(name, shape, Base64.strict_encode64(value))
|
69
|
+
when 'blob' then node(name, shape, Base64.strict_encode64(value.read))
|
70
70
|
when 'map' then raise NotImplementedError, 'not supported'
|
71
71
|
else
|
72
72
|
node(name, shape, value.to_s)
|
data/lib/seahorse.rb
CHANGED
@@ -12,6 +12,7 @@ module Seahorse
|
|
12
12
|
autoload :HandlerList, 'seahorse/client/handler_list'
|
13
13
|
autoload :HandlerListEntry, 'seahorse/client/handler_list_entry'
|
14
14
|
autoload :ManagedFile, 'seahorse/client/managed_file'
|
15
|
+
autoload :NetworkingError, 'seahorse/client/networking_error'
|
15
16
|
autoload :ParamConverter, 'seahorse/client/param_converter'
|
16
17
|
autoload :ParamValidator, 'seahorse/client/param_validator'
|
17
18
|
autoload :Plugin, 'seahorse/client/plugin'
|
@@ -21,7 +22,6 @@ module Seahorse
|
|
21
22
|
autoload :Response, 'seahorse/client/response'
|
22
23
|
|
23
24
|
module Http
|
24
|
-
autoload :Error, 'seahorse/client/http/error'
|
25
25
|
autoload :Headers, 'seahorse/client/http/headers'
|
26
26
|
autoload :Request, 'seahorse/client/http/request'
|
27
27
|
autoload :Response, 'seahorse/client/http/response'
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Seahorse
|
2
|
+
module Client
|
3
|
+
module EventEmitter
|
4
|
+
|
5
|
+
def initialize(*args)
|
6
|
+
@listeners = {}
|
7
|
+
super
|
8
|
+
end
|
9
|
+
|
10
|
+
def emit(event_name, *args, &block)
|
11
|
+
@listeners[event_name] ||= []
|
12
|
+
@listeners[event_name] << Proc.new
|
13
|
+
end
|
14
|
+
|
15
|
+
def signal(event, *args)
|
16
|
+
@listeners
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -10,6 +10,8 @@ module Seahorse
|
|
10
10
|
@status_code = options[:status_code] || 0
|
11
11
|
@headers = options[:headers] || Headers.new
|
12
12
|
@body = options[:body] || StringIO.new
|
13
|
+
@listeners = Hash.new { |h,k| h[k] = [] }
|
14
|
+
@complete = false
|
13
15
|
end
|
14
16
|
|
15
17
|
# @return [Integer] Returns `0` if the request failed to generate
|
@@ -22,6 +24,9 @@ module Seahorse
|
|
22
24
|
# @return [IO]
|
23
25
|
attr_accessor :body
|
24
26
|
|
27
|
+
# @return [StandardError, nil]
|
28
|
+
attr_reader :error
|
29
|
+
|
25
30
|
# @param [#read, #size, #rewind] io
|
26
31
|
def body=(io)
|
27
32
|
@body = case io
|
@@ -39,6 +44,133 @@ module Seahorse
|
|
39
44
|
contents
|
40
45
|
end
|
41
46
|
|
47
|
+
# @param [Integer] status_code
|
48
|
+
# @param [Hash<String,String>] headers
|
49
|
+
def signal_headers(status_code, headers)
|
50
|
+
@status_code = status_code
|
51
|
+
@headers = Headers.new(headers)
|
52
|
+
emit(:headers, @status_code, @headers)
|
53
|
+
end
|
54
|
+
|
55
|
+
# @param [string] chunk
|
56
|
+
def signal_data(chunk)
|
57
|
+
unless chunk == ''
|
58
|
+
@body.write(chunk)
|
59
|
+
emit(:data, chunk)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# Completes the http response.
|
64
|
+
#
|
65
|
+
# @example Completing the response in a singal call
|
66
|
+
#
|
67
|
+
# http_response.signal_done(
|
68
|
+
# status_code: 200,
|
69
|
+
# headers: {},
|
70
|
+
# body: ''
|
71
|
+
# )
|
72
|
+
#
|
73
|
+
# @example Complete the response in parts
|
74
|
+
#
|
75
|
+
# # signal headers straight-way
|
76
|
+
# http_response.signal_headers(200, {})
|
77
|
+
#
|
78
|
+
# # signal data as it is received from the socket
|
79
|
+
# http_response.signal_data("...")
|
80
|
+
# http_response.signal_data("...")
|
81
|
+
# http_response.signal_data("...")
|
82
|
+
#
|
83
|
+
# # signal done once the body data is all written
|
84
|
+
# http_response.signal_done
|
85
|
+
#
|
86
|
+
# @overload signal_done()
|
87
|
+
#
|
88
|
+
# @overload signal_done(options = {})
|
89
|
+
# @option options [required, Integer] :status_code
|
90
|
+
# @option options [required, Hash] :headers
|
91
|
+
# @option options [required, String] :body
|
92
|
+
#
|
93
|
+
def signal_done(options = {})
|
94
|
+
if options.keys.sort == [:body, :headers, :status_code]
|
95
|
+
signal_headers(options[:status_code], options[:headers])
|
96
|
+
signal_data(options[:body])
|
97
|
+
signal_done
|
98
|
+
elsif options.empty?
|
99
|
+
@body.rewind if @body.respond_to?(:rewind)
|
100
|
+
@done = true
|
101
|
+
emit(:done)
|
102
|
+
else
|
103
|
+
msg = "options must be empty or must contain :status_code, :headers, "
|
104
|
+
msg << "and :body"
|
105
|
+
raise ArgumentError, msg
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
# @param [StandardError] networking_error
|
110
|
+
def signal_error(networking_error)
|
111
|
+
@error = networking_error
|
112
|
+
signal_done
|
113
|
+
end
|
114
|
+
|
115
|
+
def on_headers(status_code_range = nil, &block)
|
116
|
+
@listeners[:headers] << listener(status_code_range, Proc.new)
|
117
|
+
end
|
118
|
+
|
119
|
+
def on_data(&callback)
|
120
|
+
@listeners[:data] << Proc.new
|
121
|
+
end
|
122
|
+
|
123
|
+
def on_done(status_code_range, &callback)
|
124
|
+
listener = listener(status_code_range, Proc.new)
|
125
|
+
if @done
|
126
|
+
listener.call
|
127
|
+
else
|
128
|
+
@listeners[:done] << listener
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
def on_success(status_code_range = 200..599, &callback)
|
133
|
+
on_done(status_code_range) do
|
134
|
+
unless @error
|
135
|
+
yield
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
def on_error(&callback)
|
141
|
+
on_done(0..599) do
|
142
|
+
if @error
|
143
|
+
yield(@error)
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
def reset
|
149
|
+
@status_code = 0
|
150
|
+
@headers.clear
|
151
|
+
@body.truncate(0)
|
152
|
+
@error = nil
|
153
|
+
end
|
154
|
+
|
155
|
+
private
|
156
|
+
|
157
|
+
def listener(range, callback)
|
158
|
+
range = range..range if Integer === range
|
159
|
+
if range
|
160
|
+
lambda do |*args|
|
161
|
+
if range.include?(@status_code)
|
162
|
+
callback.call(*args)
|
163
|
+
end
|
164
|
+
end
|
165
|
+
else
|
166
|
+
callback
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
def emit(event_name, *args)
|
171
|
+
@listeners[event_name].each { |listener| listener.call(*args) }
|
172
|
+
end
|
173
|
+
|
42
174
|
end
|
43
175
|
end
|
44
176
|
end
|
@@ -22,13 +22,8 @@ module Seahorse
|
|
22
22
|
# @param [RequestContext] context
|
23
23
|
# @return [Response]
|
24
24
|
def call(context)
|
25
|
-
|
26
|
-
|
27
|
-
transmit(context.config, context.http_request, context.http_response)
|
28
|
-
rescue *NETWORK_ERRORS => error
|
29
|
-
response.error = Http::Error.new(error, error_message(context, error))
|
30
|
-
end
|
31
|
-
response
|
25
|
+
transmit(context.config, context.http_request, context.http_response)
|
26
|
+
Response.new(context: context)
|
32
27
|
end
|
33
28
|
|
34
29
|
# @param [Configuration] config
|
@@ -39,9 +34,9 @@ module Seahorse
|
|
39
34
|
|
40
35
|
private
|
41
36
|
|
42
|
-
def error_message(
|
37
|
+
def error_message(req, error)
|
43
38
|
if error.is_a?(SocketError) && error.message == DNS_ERROR_MESSAGE
|
44
|
-
host =
|
39
|
+
host = req.endpoint.host
|
45
40
|
"unable to connect to `#{host}`; SocketError: #{error.message}"
|
46
41
|
else
|
47
42
|
error.message
|
@@ -49,27 +44,38 @@ module Seahorse
|
|
49
44
|
end
|
50
45
|
|
51
46
|
# @param [Configuration] config
|
52
|
-
# @param [Http::Request]
|
53
|
-
# @param [Http::Response]
|
47
|
+
# @param [Http::Request] req
|
48
|
+
# @param [Http::Response] resp
|
54
49
|
# @return [void]
|
55
|
-
def transmit(config,
|
56
|
-
|
57
|
-
|
58
|
-
http.read_timeout = config.http_read_timeout
|
59
|
-
http.request(net_http_request(request)) do |resp|
|
50
|
+
def transmit(config, req, resp)
|
51
|
+
session(config, req) do |http|
|
52
|
+
http.request(build_net_request(req)) do |net_resp|
|
60
53
|
|
61
|
-
|
62
|
-
|
63
|
-
response.headers.update(response_headers(resp))
|
54
|
+
status_code = net_resp.code.to_i
|
55
|
+
headers = extract_headers(net_resp)
|
64
56
|
|
65
|
-
|
66
|
-
|
67
|
-
|
57
|
+
resp.signal_headers(status_code, headers)
|
58
|
+
net_resp.read_body do |chunk|
|
59
|
+
resp.signal_data(chunk)
|
68
60
|
end
|
69
|
-
|
61
|
+
resp.signal_done
|
70
62
|
|
71
63
|
end
|
72
64
|
end
|
65
|
+
rescue *NETWORK_ERRORS => error
|
66
|
+
# these are retryable
|
67
|
+
error = NetworkingError.new(error, error_message(req, error))
|
68
|
+
resp.signal_error(error)
|
69
|
+
rescue => error
|
70
|
+
# not retryable
|
71
|
+
resp.signal_error(error)
|
72
|
+
end
|
73
|
+
|
74
|
+
def session(config, req, &block)
|
75
|
+
pool_for(config).session_for(req.endpoint) do |http|
|
76
|
+
http.read_timeout = config.http_read_timeout
|
77
|
+
yield(http)
|
78
|
+
end
|
73
79
|
end
|
74
80
|
|
75
81
|
# Extracts the {ConnectionPool} configuration options.
|
@@ -86,7 +92,7 @@ module Seahorse
|
|
86
92
|
# a {Http::Request}.
|
87
93
|
# @param [Http::Request] request
|
88
94
|
# @return [Net::HTTP::Request]
|
89
|
-
def
|
95
|
+
def build_net_request(request)
|
90
96
|
request_class = net_http_request_class(request)
|
91
97
|
req = request_class.new(request.endpoint.request_uri, headers(request))
|
92
98
|
req.body_stream = request.body
|
@@ -118,7 +124,7 @@ module Seahorse
|
|
118
124
|
|
119
125
|
# @param [Net::HTTP::Response] response
|
120
126
|
# @return [Hash<String, String>]
|
121
|
-
def
|
127
|
+
def extract_headers(response)
|
122
128
|
response.to_hash.inject({}) do |headers, (k, v)|
|
123
129
|
headers[k] = v.first
|
124
130
|
headers
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Seahorse
|
2
|
+
module Client
|
3
|
+
class NetworkingError < StandardError
|
4
|
+
|
5
|
+
def initialize(error, msg = nil)
|
6
|
+
super(msg || error.message)
|
7
|
+
set_backtrace(error.backtrace)
|
8
|
+
@original_error = error
|
9
|
+
end
|
10
|
+
|
11
|
+
attr_reader :original_error
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -12,6 +12,9 @@ module Seahorse
|
|
12
12
|
@error = options[:error]
|
13
13
|
@http_request = @context.http_request
|
14
14
|
@http_response = @context.http_response
|
15
|
+
@http_response.on_error do |error|
|
16
|
+
@error = error
|
17
|
+
end
|
15
18
|
end
|
16
19
|
|
17
20
|
# @return [RequestContext]
|
@@ -24,14 +27,21 @@ module Seahorse
|
|
24
27
|
# @return [StandardError, nil]
|
25
28
|
attr_accessor :error
|
26
29
|
|
27
|
-
# @
|
28
|
-
#
|
29
|
-
#
|
30
|
+
# @overload on(status_code, &block)
|
31
|
+
# @param [Integer] status_code The block will be
|
32
|
+
# triggered only for responses with the given status code.
|
33
|
+
#
|
34
|
+
# @overload on(status_code_range, &block)
|
35
|
+
# @param [Range<Integer>] status_code_range The block will be
|
36
|
+
# triggered only for responses with a status code that falls
|
37
|
+
# witin the given range.
|
38
|
+
#
|
30
39
|
# @return [self]
|
31
|
-
def on(
|
32
|
-
|
33
|
-
|
34
|
-
|
40
|
+
def on(range, &block)
|
41
|
+
response = self
|
42
|
+
@context.http_response.on_success(range) do
|
43
|
+
block.call(response)
|
44
|
+
end
|
35
45
|
self
|
36
46
|
end
|
37
47
|
|
@@ -41,15 +51,10 @@ module Seahorse
|
|
41
51
|
on(200..299, &block)
|
42
52
|
end
|
43
53
|
|
44
|
-
# @
|
45
|
-
#
|
54
|
+
# @return [Boolean] Returns `true` if the response is complete with
|
55
|
+
# a ~ 200 level http status code.
|
46
56
|
def successful?
|
47
|
-
(200..299).include?(status_code)
|
48
|
-
end
|
49
|
-
|
50
|
-
# @api private
|
51
|
-
def respond_to?(*args)
|
52
|
-
@data.respond_to?(args.first, false) || super
|
57
|
+
(200..299).include?(@context.http_response.status_code) && @error.nil?
|
53
58
|
end
|
54
59
|
|
55
60
|
# @api private
|
@@ -61,12 +66,13 @@ module Seahorse
|
|
61
66
|
end
|
62
67
|
end
|
63
68
|
|
64
|
-
private
|
65
|
-
|
66
|
-
|
67
|
-
@http_response.status_code
|
69
|
+
# @api private
|
70
|
+
def respond_to?(*args)
|
71
|
+
@data.respond_to?(args.first, false) || super
|
68
72
|
end
|
69
73
|
|
74
|
+
private
|
75
|
+
|
70
76
|
def method_missing(*args, &block)
|
71
77
|
if @data.respond_to?(args.first, false)
|
72
78
|
@data.send(*args, &block)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aws-sdk-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.15
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Amazon Web Services
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-12-
|
11
|
+
date: 2014-12-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: multi_json
|
@@ -133,6 +133,7 @@ files:
|
|
133
133
|
- lib/aws-sdk-core/paging/pager.rb
|
134
134
|
- lib/aws-sdk-core/paging/provider.rb
|
135
135
|
- lib/aws-sdk-core/plugins/csd_conditional_signing.rb
|
136
|
+
- lib/aws-sdk-core/plugins/dynamodb_crc32_validation.rb
|
136
137
|
- lib/aws-sdk-core/plugins/dynamodb_extended_retries.rb
|
137
138
|
- lib/aws-sdk-core/plugins/dynamodb_simple_attributes.rb
|
138
139
|
- lib/aws-sdk-core/plugins/ec2_copy_encrypted_snapshot.rb
|
@@ -210,11 +211,11 @@ files:
|
|
210
211
|
- lib/seahorse/client/base.rb
|
211
212
|
- lib/seahorse/client/block_io.rb
|
212
213
|
- lib/seahorse/client/configuration.rb
|
214
|
+
- lib/seahorse/client/events.rb
|
213
215
|
- lib/seahorse/client/handler.rb
|
214
216
|
- lib/seahorse/client/handler_builder.rb
|
215
217
|
- lib/seahorse/client/handler_list.rb
|
216
218
|
- lib/seahorse/client/handler_list_entry.rb
|
217
|
-
- lib/seahorse/client/http/error.rb
|
218
219
|
- lib/seahorse/client/http/headers.rb
|
219
220
|
- lib/seahorse/client/http/request.rb
|
220
221
|
- lib/seahorse/client/http/response.rb
|
@@ -224,6 +225,7 @@ files:
|
|
224
225
|
- lib/seahorse/client/net_http/connection_pool.rb
|
225
226
|
- lib/seahorse/client/net_http/handler.rb
|
226
227
|
- lib/seahorse/client/net_http/patches.rb
|
228
|
+
- lib/seahorse/client/networking_error.rb
|
227
229
|
- lib/seahorse/client/param_converter.rb
|
228
230
|
- lib/seahorse/client/param_validator.rb
|
229
231
|
- lib/seahorse/client/plugin.rb
|
@@ -294,6 +296,7 @@ files:
|
|
294
296
|
- apis/ElasticTranscoder.waiters.json
|
295
297
|
- apis/EMR.api.json
|
296
298
|
- apis/EMR.paginators.json
|
299
|
+
- apis/EMR.waiters2.json
|
297
300
|
- apis/Glacier.api.json
|
298
301
|
- apis/Glacier.paginators.json
|
299
302
|
- apis/Glacier.resources.json
|
@@ -1,17 +0,0 @@
|
|
1
|
-
module Seahorse
|
2
|
-
module Client
|
3
|
-
module Http
|
4
|
-
class Error < StandardError
|
5
|
-
|
6
|
-
def initialize(error, msg = nil)
|
7
|
-
super(msg || error.message)
|
8
|
-
set_backtrace(error.backtrace)
|
9
|
-
@original_error = error
|
10
|
-
end
|
11
|
-
|
12
|
-
attr_reader :original_error
|
13
|
-
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|