kinetic_sdk 0.1.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.yardoc-includes/yard-helpers.rb +14 -0
- data/.yardopts +7 -0
- data/CHANGELOG.md +41 -0
- data/GettingStarted.md +6 -12
- data/README.md +85 -37
- data/Rakefile +13 -0
- data/kinetic_sdk.gemspec +33 -0
- data/lib/kinetic_sdk/agent/agent-sdk.rb +90 -0
- data/lib/kinetic_sdk/agent/lib/bridges.rb +92 -0
- data/lib/kinetic_sdk/agent/lib/filestores.rb +91 -0
- data/lib/kinetic_sdk/agent/lib/handler.rb +91 -0
- data/lib/kinetic_sdk/bridgehub/bridgehub-sdk.rb +11 -3
- data/lib/kinetic_sdk/bridgehub/lib/access_keys.rb +5 -5
- data/lib/kinetic_sdk/bridgehub/lib/bridge.rb +5 -5
- data/lib/kinetic_sdk/{request_ce/request-ce-sdk.rb → core/core-sdk.rb} +30 -16
- data/lib/kinetic_sdk/core/lib/attribute_definitions.rb +500 -0
- data/lib/kinetic_sdk/core/lib/bridges.rb +141 -0
- data/lib/kinetic_sdk/{request_ce → core}/lib/categories.rb +3 -3
- data/lib/kinetic_sdk/{request_ce → core}/lib/datastore_form.rb +8 -8
- data/lib/kinetic_sdk/{request_ce → core}/lib/datastore_submissions.rb +20 -9
- data/lib/kinetic_sdk/{request_ce → core}/lib/form.rb +7 -7
- data/lib/kinetic_sdk/{request_ce → core}/lib/form_types.rb +4 -4
- data/lib/kinetic_sdk/{request_ce → core}/lib/jwt.rb +4 -4
- data/lib/kinetic_sdk/{request_ce → core}/lib/kapp.rb +7 -7
- data/lib/kinetic_sdk/{request_ce → core}/lib/meta.rb +3 -3
- data/lib/kinetic_sdk/{request_ce → core}/lib/oauth.rb +4 -4
- data/lib/kinetic_sdk/{request_ce → core}/lib/security_policy_definitions.rb +11 -11
- data/lib/kinetic_sdk/core/lib/space.rb +156 -0
- data/lib/kinetic_sdk/{request_ce → core}/lib/submissions.rb +11 -11
- data/lib/kinetic_sdk/{request_ce → core}/lib/system_api.rb +19 -7
- data/lib/kinetic_sdk/{request_ce → core}/lib/teams.rb +9 -9
- data/lib/kinetic_sdk/{request_ce → core}/lib/users.rb +15 -15
- data/lib/kinetic_sdk/{request_ce → core}/lib/webhook_jobs.rb +5 -5
- data/lib/kinetic_sdk/{request_ce → core}/lib/webhooks.rb +9 -9
- data/lib/kinetic_sdk/discussions/discussions-sdk.rb +12 -4
- data/lib/kinetic_sdk/discussions/lib/discussions.rb +8 -8
- data/lib/kinetic_sdk/discussions/lib/invitations.rb +9 -9
- data/lib/kinetic_sdk/discussions/lib/messages.rb +8 -8
- data/lib/kinetic_sdk/discussions/lib/meta.rb +1 -1
- data/lib/kinetic_sdk/discussions/lib/participants.rb +5 -5
- data/lib/kinetic_sdk/discussions/lib/related_items.rb +4 -4
- data/lib/kinetic_sdk/discussions/lib/websockets.rb +9 -9
- data/lib/kinetic_sdk/filehub/filehub-sdk.rb +11 -3
- data/lib/kinetic_sdk/filehub/lib/access_keys.rb +5 -5
- data/lib/kinetic_sdk/filehub/lib/filestores.rb +5 -5
- data/lib/kinetic_sdk/task/lib/access_keys.rb +35 -7
- data/lib/kinetic_sdk/task/lib/categories.rb +30 -17
- data/lib/kinetic_sdk/task/lib/config.rb +14 -14
- data/lib/kinetic_sdk/task/lib/engine.rb +1 -1
- data/lib/kinetic_sdk/task/lib/errors.rb +10 -10
- data/lib/kinetic_sdk/task/lib/export.rb +32 -0
- data/lib/kinetic_sdk/task/lib/groups.rb +23 -10
- data/lib/kinetic_sdk/task/lib/handlers.rb +27 -11
- data/lib/kinetic_sdk/task/lib/health.rb +11 -3
- data/lib/kinetic_sdk/task/lib/license.rb +4 -4
- data/lib/kinetic_sdk/task/lib/policy_rules.rb +25 -12
- data/lib/kinetic_sdk/task/lib/runs.rb +43 -0
- data/lib/kinetic_sdk/task/lib/setup.rb +2 -2
- data/lib/kinetic_sdk/task/lib/sources.rb +39 -8
- data/lib/kinetic_sdk/task/lib/tasks.rb +1 -1
- data/lib/kinetic_sdk/task/lib/trees.rb +84 -28
- data/lib/kinetic_sdk/task/lib/users.rb +6 -6
- data/lib/kinetic_sdk/task/task-sdk.rb +16 -4
- data/lib/kinetic_sdk/utils/kinetic-export-utils.rb +157 -0
- data/lib/kinetic_sdk/utils/kinetic-http.rb +388 -98
- data/lib/kinetic_sdk/utils/logger.rb +82 -46
- data/lib/kinetic_sdk/utils/prettier-xml-formatter.rb +60 -0
- data/lib/kinetic_sdk/version.rb +1 -1
- data/lib/kinetic_sdk.rb +5 -2
- metadata +41 -27
- data/lib/kinetic_sdk/request_ce/lib/attribute_definitions.rb +0 -153
- data/lib/kinetic_sdk/request_ce/lib/bridges.rb +0 -66
- data/lib/kinetic_sdk/request_ce/lib/space.rb +0 -89
@@ -21,20 +21,25 @@ module KineticSdk
|
|
21
21
|
# {KineticSdk::Utils::KineticHttpResponse#response} method.
|
22
22
|
module KineticHttpUtils
|
23
23
|
|
24
|
-
# Include the Logger module
|
25
|
-
include KineticSdk::Utils::Logger
|
26
|
-
|
27
24
|
# Send an HTTP DELETE request
|
28
25
|
#
|
29
26
|
# @param url [String] url to send the request to
|
30
27
|
# @param headers [Hash] hash of headers to send
|
31
|
-
# @param
|
28
|
+
# @param http_options [Hash] hash of http options
|
29
|
+
# @option http_options [Fixnum] :max_redirects optional - max number of times to redirect
|
30
|
+
# @option http_options [Fixnum] :gateway_retry_limit optional - max number of times to retry a bad gateway
|
31
|
+
# @option http_options [Float] :gateway_retry_delay optional - number of seconds to delay before retrying a bad gateway
|
32
32
|
# @return [KineticSdk::Utils::KineticHttpResponse] response
|
33
|
-
def delete(url, headers={},
|
33
|
+
def delete(url, headers={}, http_options=@options)
|
34
|
+
# determine the http options
|
35
|
+
redirect_limit = http_options[:max_redirects] || max_redirects
|
36
|
+
gateway_retries = http_options[:gateway_retry_limit] || gateway_retry_limit
|
37
|
+
gateway_delay = http_options[:gateway_retry_delay] || gateway_retry_delay
|
38
|
+
|
34
39
|
# parse the URL
|
35
40
|
uri = URI.parse(url)
|
36
41
|
|
37
|
-
debug("DELETE #{uri} #{headers.inspect}")
|
42
|
+
@logger.debug("DELETE #{uri} #{headers.inspect}")
|
38
43
|
|
39
44
|
# build the http object
|
40
45
|
http = build_http(uri)
|
@@ -46,24 +51,45 @@ module KineticSdk
|
|
46
51
|
response = http.request(request)
|
47
52
|
# handle the response
|
48
53
|
case response
|
54
|
+
# handle 302
|
49
55
|
when Net::HTTPRedirection then
|
50
56
|
if redirect_limit == -1
|
51
|
-
info("HTTP response code: #{response.code}") unless
|
57
|
+
@logger.info("HTTP response code: #{response.code}") unless @logger.debug?
|
52
58
|
KineticHttpResponse.new(response)
|
53
59
|
elsif redirect_limit == 0
|
54
60
|
raise Net::HTTPFatalError.new("Too many redirects", response)
|
55
61
|
else
|
56
|
-
|
62
|
+
delete(response['location'], headers, http_options.merge({
|
63
|
+
:max_redirects => redirect_limit - 1
|
64
|
+
}))
|
65
|
+
end
|
66
|
+
# handle 502, 503, 504
|
67
|
+
when Net::HTTPBadGateway, Net::HTTPServiceUnavailable, Net::HTTPGatewayTimeOut then
|
68
|
+
if gateway_retries == -1
|
69
|
+
KineticHttpResponse.new(response)
|
70
|
+
elsif gateway_retries == 0
|
71
|
+
@logger.info("HTTP response: #{response.code} #{response.message}") unless @logger.debug?
|
72
|
+
raise Net::HTTPFatalError.new("#{response.code} #{response.message}", response)
|
73
|
+
else
|
74
|
+
@logger.info("#{response.code} #{response.message}, retrying in #{gateway_delay} seconds")
|
75
|
+
sleep(gateway_delay)
|
76
|
+
delete(url, headers, http_options.merge({
|
77
|
+
:gateway_retry_limit => gateway_retries - 1
|
78
|
+
}))
|
57
79
|
end
|
58
|
-
when NilClass then
|
59
|
-
info("HTTP response code: 0") unless
|
60
|
-
|
80
|
+
when Net::HTTPUnknownResponse, NilClass then
|
81
|
+
@logger.info("HTTP response code: 0") unless @logger.debug?
|
82
|
+
e = Net::HTTPFatalError.new("Unknown response from server", response)
|
83
|
+
KineticHttpResponse.new(e)
|
61
84
|
else
|
62
|
-
info("HTTP response code: #{response.code}") unless
|
85
|
+
@logger.info("HTTP response code: #{response.code}") unless @logger.debug?
|
63
86
|
KineticHttpResponse.new(response)
|
64
87
|
end
|
88
|
+
rescue Net::HTTPBadResponse => e
|
89
|
+
@logger.info("HTTP bad response: #{e.inspect}") unless @logger.debug?
|
90
|
+
KineticHttpResponse.new(e)
|
65
91
|
rescue StandardError => e
|
66
|
-
info("HTTP
|
92
|
+
@logger.info("HTTP error: #{e.inspect}") unless @logger.debug?
|
67
93
|
KineticHttpResponse.new(e)
|
68
94
|
end
|
69
95
|
end
|
@@ -73,15 +99,23 @@ module KineticSdk
|
|
73
99
|
# @param url [String] url to send the request to
|
74
100
|
# @param params [Hash] Query parameters that are added to the URL, such as +include+
|
75
101
|
# @param headers [Hash] hash of headers to send
|
76
|
-
# @param
|
102
|
+
# @param http_options [Hash] hash of http options
|
103
|
+
# @option http_options [Fixnum] :max_redirects optional - max number of times to redirect
|
104
|
+
# @option http_options [Fixnum] :gateway_retry_limit optional - max number of times to retry a bad gateway
|
105
|
+
# @option http_options [Float] :gateway_retry_delay optional - number of seconds to delay before retrying a bad gateway
|
77
106
|
# @return [KineticSdk::Utils::KineticHttpResponse] response
|
78
|
-
def get(url, params={}, headers={},
|
107
|
+
def get(url, params={}, headers={}, http_options=@options)
|
108
|
+
# determine the http options
|
109
|
+
redirect_limit = http_options[:max_redirects] || max_redirects
|
110
|
+
gateway_retries = http_options[:gateway_retry_limit] || gateway_retry_limit
|
111
|
+
gateway_delay = http_options[:gateway_retry_delay] || gateway_retry_delay
|
112
|
+
|
79
113
|
# parse the URL
|
80
114
|
uri = URI.parse(url)
|
81
115
|
# add URL parameters
|
82
116
|
uri.query = URI.encode_www_form(params)
|
83
117
|
|
84
|
-
debug("GET #{uri} #{headers.inspect}")
|
118
|
+
@logger.debug("GET #{uri} #{headers.inspect}")
|
85
119
|
|
86
120
|
# build the http object
|
87
121
|
http = build_http(uri)
|
@@ -93,24 +127,45 @@ module KineticSdk
|
|
93
127
|
response = http.request(request)
|
94
128
|
# handle the response
|
95
129
|
case response
|
130
|
+
# handle 302
|
96
131
|
when Net::HTTPRedirection then
|
97
132
|
if redirect_limit == -1
|
98
|
-
info("HTTP response code: #{response.code}") unless
|
133
|
+
@logger.info("HTTP response code: #{response.code}") unless @logger.debug?
|
99
134
|
KineticHttpResponse.new(response)
|
100
135
|
elsif redirect_limit == 0
|
101
136
|
raise Net::HTTPFatalError.new("Too many redirects", response)
|
102
137
|
else
|
103
|
-
|
138
|
+
get(response['location'], params, headers, http_options.merge({
|
139
|
+
:max_redirects => redirect_limit - 1
|
140
|
+
}))
|
141
|
+
end
|
142
|
+
# handle 502, 503, 504
|
143
|
+
when Net::HTTPBadGateway, Net::HTTPServiceUnavailable, Net::HTTPGatewayTimeOut then
|
144
|
+
if gateway_retries == -1
|
145
|
+
KineticHttpResponse.new(response)
|
146
|
+
elsif gateway_retries == 0
|
147
|
+
@logger.info("HTTP response: #{response.code} #{response.message}") unless @logger.debug?
|
148
|
+
raise Net::HTTPFatalError.new("#{response.code} #{response.message}", response)
|
149
|
+
else
|
150
|
+
@logger.info("#{response.code} #{response.message}, retrying in #{gateway_delay} seconds")
|
151
|
+
sleep(gateway_delay)
|
152
|
+
get(url, params, headers, http_options.merge({
|
153
|
+
:gateway_retry_limit => gateway_retries - 1
|
154
|
+
}))
|
104
155
|
end
|
105
|
-
when NilClass then
|
106
|
-
info("HTTP response code: 0") unless
|
107
|
-
|
156
|
+
when Net::HTTPUnknownResponse, NilClass then
|
157
|
+
@logger.info("HTTP response code: 0") unless @logger.debug?
|
158
|
+
e = Net::HTTPFatalError.new("Unknown response from server", response)
|
159
|
+
KineticHttpResponse.new(e)
|
108
160
|
else
|
109
|
-
info("HTTP response code: #{response.code}") unless
|
161
|
+
@logger.info("HTTP response code: #{response.code}") unless @logger.debug?
|
110
162
|
KineticHttpResponse.new(response)
|
111
163
|
end
|
164
|
+
rescue Net::HTTPBadResponse => e
|
165
|
+
@logger.info("HTTP bad response: #{e.inspect}") unless @logger.debug?
|
166
|
+
KineticHttpResponse.new(e)
|
112
167
|
rescue StandardError => e
|
113
|
-
info("HTTP
|
168
|
+
@logger.info("HTTP error: #{e.inspect}") unless @logger.debug?
|
114
169
|
KineticHttpResponse.new(e)
|
115
170
|
end
|
116
171
|
end
|
@@ -120,15 +175,23 @@ module KineticSdk
|
|
120
175
|
# @param url [String] url to send the request to
|
121
176
|
# @param params [Hash] Query parameters that are added to the URL, such as +include+
|
122
177
|
# @param headers [Hash] hash of headers to send
|
123
|
-
# @param
|
178
|
+
# @param http_options [Hash] hash of http options
|
179
|
+
# @option http_options [Fixnum] :max_redirects optional - max number of times to redirect
|
180
|
+
# @option http_options [Fixnum] :gateway_retry_limit optional - max number of times to retry a bad gateway
|
181
|
+
# @option http_options [Float] :gateway_retry_delay optional - number of seconds to delay before retrying a bad gateway
|
124
182
|
# @return [KineticSdk::Utils::KineticHttpResponse] response
|
125
|
-
def head(url, params={}, headers={},
|
183
|
+
def head(url, params={}, headers={}, http_options=@options)
|
184
|
+
# determine the http options
|
185
|
+
redirect_limit = http_options[:max_redirects] || max_redirects
|
186
|
+
gateway_retries = http_options[:gateway_retry_limit] || gateway_retry_limit
|
187
|
+
gateway_delay = http_options[:gateway_retry_delay] || gateway_retry_delay
|
188
|
+
|
126
189
|
# parse the URL
|
127
190
|
uri = URI.parse(url)
|
128
191
|
# add URL parameters
|
129
192
|
uri.query = URI.encode_www_form(params)
|
130
193
|
|
131
|
-
debug("HEAD #{uri} #{headers.inspect}")
|
194
|
+
@logger.debug("HEAD #{uri} #{headers.inspect}")
|
132
195
|
|
133
196
|
# build the http object
|
134
197
|
http = build_http(uri)
|
@@ -142,22 +205,42 @@ module KineticSdk
|
|
142
205
|
case response
|
143
206
|
when Net::HTTPRedirection then
|
144
207
|
if redirect_limit == -1
|
145
|
-
info("HTTP response code: #{response.code}") unless
|
208
|
+
@logger.info("HTTP response code: #{response.code}") unless @logger.debug?
|
146
209
|
KineticHttpResponse.new(response)
|
147
210
|
elsif redirect_limit == 0
|
148
211
|
raise Net::HTTPFatalError.new("Too many redirects", response)
|
149
212
|
else
|
150
|
-
|
213
|
+
head(response['location'], params, headers, http_options.merge({
|
214
|
+
:max_redirects => redirect_limit - 1
|
215
|
+
}))
|
151
216
|
end
|
152
|
-
|
153
|
-
|
154
|
-
|
217
|
+
# handle 502, 503, 504
|
218
|
+
when Net::HTTPBadGateway, Net::HTTPServiceUnavailable, Net::HTTPGatewayTimeOut then
|
219
|
+
if gateway_retries == -1
|
220
|
+
KineticHttpResponse.new(response)
|
221
|
+
elsif gateway_retries == 0
|
222
|
+
@logger.info("HTTP response: #{response.code} #{response.message}") unless @logger.debug?
|
223
|
+
raise Net::HTTPFatalError.new("#{response.code} #{response.message}", response)
|
224
|
+
else
|
225
|
+
@logger.info("#{response.code} #{response.message}, retrying in #{gateway_delay} seconds")
|
226
|
+
sleep(gateway_delay)
|
227
|
+
head(url, params, headers, http_options.merge({
|
228
|
+
:gateway_retry_limit => gateway_retries - 1
|
229
|
+
}))
|
230
|
+
end
|
231
|
+
when Net::HTTPUnknownResponse, NilClass then
|
232
|
+
@logger.info("HTTP response code: 0") unless @logger.debug?
|
233
|
+
e = Net::HTTPFatalError.new("Unknown response from server", response)
|
234
|
+
KineticHttpResponse.new(e)
|
155
235
|
else
|
156
|
-
info("HTTP response code: #{response.code}") unless
|
236
|
+
@logger.info("HTTP response code: #{response.code}") unless @logger.debug?
|
157
237
|
KineticHttpResponse.new(response)
|
158
238
|
end
|
239
|
+
rescue Net::HTTPBadResponse => e
|
240
|
+
@logger.info("HTTP bad response: #{e.inspect}") unless @logger.debug?
|
241
|
+
KineticHttpResponse.new(e)
|
159
242
|
rescue StandardError => e
|
160
|
-
info("HTTP
|
243
|
+
@logger.info("HTTP error: #{e.inspect}") unless @logger.debug?
|
161
244
|
KineticHttpResponse.new(e)
|
162
245
|
end
|
163
246
|
end
|
@@ -167,13 +250,21 @@ module KineticSdk
|
|
167
250
|
# @param url [String] url to send the request to
|
168
251
|
# @param data [Hash] the payload to send with the request
|
169
252
|
# @param headers [Hash] hash of headers to send
|
170
|
-
# @param
|
253
|
+
# @param http_options [Hash] hash of http options
|
254
|
+
# @option http_options [Fixnum] :max_redirects optional - max number of times to redirect
|
255
|
+
# @option http_options [Fixnum] :gateway_retry_limit optional - max number of times to retry a bad gateway
|
256
|
+
# @option http_options [Float] :gateway_retry_delay optional - number of seconds to delay before retrying a bad gateway
|
171
257
|
# @return [KineticSdk::Utils::KineticHttpResponse] response
|
172
|
-
def patch(url, data={}, headers={},
|
258
|
+
def patch(url, data={}, headers={}, http_options=@options)
|
259
|
+
# determine the http options
|
260
|
+
redirect_limit = http_options[:max_redirects] || max_redirects
|
261
|
+
gateway_retries = http_options[:gateway_retry_limit] || gateway_retry_limit
|
262
|
+
gateway_delay = http_options[:gateway_retry_delay] || gateway_retry_delay
|
263
|
+
|
173
264
|
# parse the URL
|
174
265
|
uri = URI.parse(url)
|
175
266
|
|
176
|
-
debug("PATCH #{uri} #{headers.inspect}")
|
267
|
+
@logger.debug("PATCH #{uri} #{headers.inspect}")
|
177
268
|
|
178
269
|
# unless the data is already a string, assume JSON and convert to string
|
179
270
|
data = data.to_json unless data.is_a? String
|
@@ -190,22 +281,42 @@ module KineticSdk
|
|
190
281
|
case response
|
191
282
|
when Net::HTTPRedirection then
|
192
283
|
if redirect_limit == -1
|
193
|
-
info("HTTP response code: #{response.code}") unless
|
284
|
+
@logger.info("HTTP response code: #{response.code}") unless @logger.debug?
|
194
285
|
KineticHttpResponse.new(response)
|
195
286
|
elsif redirect_limit == 0
|
196
287
|
raise Net::HTTPFatalError.new("Too many redirects", response)
|
197
288
|
else
|
198
|
-
|
289
|
+
patch(response['location'], data, headers, http_options.merge({
|
290
|
+
:max_redirects => redirect_limit - 1
|
291
|
+
}))
|
292
|
+
end
|
293
|
+
# handle 502, 503, 504
|
294
|
+
when Net::HTTPBadGateway, Net::HTTPServiceUnavailable, Net::HTTPGatewayTimeOut then
|
295
|
+
if gateway_retries == -1
|
296
|
+
KineticHttpResponse.new(response)
|
297
|
+
elsif gateway_retries == 0
|
298
|
+
@logger.info("HTTP response: #{response.code} #{response.message}") unless @logger.debug?
|
299
|
+
raise Net::HTTPFatalError.new("#{response.code} #{response.message}", response)
|
300
|
+
else
|
301
|
+
@logger.info("#{response.code} #{response.message}, retrying in #{gateway_delay} seconds")
|
302
|
+
sleep(gateway_delay)
|
303
|
+
patch(url, data, headers, http_options.merge({
|
304
|
+
:gateway_retry_limit => gateway_retries - 1
|
305
|
+
}))
|
199
306
|
end
|
200
|
-
when NilClass then
|
201
|
-
info("HTTP response code: 0") unless
|
202
|
-
|
307
|
+
when Net::HTTPUnknownResponse, NilClass then
|
308
|
+
@logger.info("HTTP response code: 0") unless @logger.debug?
|
309
|
+
e = Net::HTTPFatalError.new("Unknown response from server", response)
|
310
|
+
KineticHttpResponse.new(e)
|
203
311
|
else
|
204
|
-
info("HTTP response code: #{response.code}") unless
|
312
|
+
@logger.info("HTTP response code: #{response.code}") unless @logger.debug?
|
205
313
|
KineticHttpResponse.new(response)
|
206
314
|
end
|
315
|
+
rescue Net::HTTPBadResponse => e
|
316
|
+
@logger.info("HTTP bad response: #{e.inspect}") unless @logger.debug?
|
317
|
+
KineticHttpResponse.new(e)
|
207
318
|
rescue StandardError => e
|
208
|
-
info("HTTP
|
319
|
+
@logger.info("HTTP error: #{e.inspect}") unless @logger.debug?
|
209
320
|
KineticHttpResponse.new(e)
|
210
321
|
end
|
211
322
|
end
|
@@ -215,13 +326,21 @@ module KineticSdk
|
|
215
326
|
# @param url [String] url to send the request to
|
216
327
|
# @param data [Hash] the payload to send with the request
|
217
328
|
# @param headers [Hash] hash of headers to send
|
218
|
-
# @param
|
329
|
+
# @param http_options [Hash] hash of http options
|
330
|
+
# @option http_options [Fixnum] :max_redirects optional - max number of times to redirect
|
331
|
+
# @option http_options [Fixnum] :gateway_retry_limit optional - max number of times to retry a bad gateway
|
332
|
+
# @option http_options [Float] :gateway_retry_delay optional - number of seconds to delay before retrying a bad gateway
|
219
333
|
# @return [KineticSdk::Utils::KineticHttpResponse] response
|
220
|
-
def post(url, data={}, headers={},
|
334
|
+
def post(url, data={}, headers={}, http_options=@options)
|
335
|
+
# determine the http options
|
336
|
+
redirect_limit = http_options[:max_redirects] || max_redirects
|
337
|
+
gateway_retries = http_options[:gateway_retry_limit] || gateway_retry_limit
|
338
|
+
gateway_delay = http_options[:gateway_retry_delay] || gateway_retry_delay
|
339
|
+
|
221
340
|
# parse the URL
|
222
341
|
uri = URI.parse(url)
|
223
342
|
|
224
|
-
debug("POST #{uri} #{headers.inspect}")
|
343
|
+
@logger.debug("POST #{uri} #{headers.inspect}")
|
225
344
|
|
226
345
|
# unless the data is already a string, assume JSON and convert to string
|
227
346
|
data = data.to_json unless data.is_a? String
|
@@ -238,22 +357,42 @@ module KineticSdk
|
|
238
357
|
case response
|
239
358
|
when Net::HTTPRedirection then
|
240
359
|
if redirect_limit == -1
|
241
|
-
info("HTTP response code: #{response.code}") unless
|
360
|
+
@logger.info("HTTP response code: #{response.code}") unless @logger.debug?
|
242
361
|
KineticHttpResponse.new(response)
|
243
362
|
elsif redirect_limit == 0
|
244
363
|
raise Net::HTTPFatalError.new("Too many redirects", response)
|
245
364
|
else
|
246
|
-
|
365
|
+
post(response['location'], data, headers, http_options.merge({
|
366
|
+
:max_redirects => redirect_limit - 1
|
367
|
+
}))
|
247
368
|
end
|
248
|
-
|
249
|
-
|
250
|
-
|
369
|
+
# handle 502, 503, 504
|
370
|
+
when Net::HTTPBadGateway, Net::HTTPServiceUnavailable, Net::HTTPGatewayTimeOut then
|
371
|
+
if gateway_retries == -1
|
372
|
+
KineticHttpResponse.new(response)
|
373
|
+
elsif gateway_retries == 0
|
374
|
+
@logger.info("HTTP response: #{response.code} #{response.message}") unless @logger.debug?
|
375
|
+
raise Net::HTTPFatalError.new("#{response.code} #{response.message}", response)
|
376
|
+
else
|
377
|
+
@logger.info("#{response.code} #{response.message}, retrying in #{gateway_delay} seconds")
|
378
|
+
sleep(gateway_delay)
|
379
|
+
post(url, data, headers, http_options.merge({
|
380
|
+
:gateway_retry_limit => gateway_retries - 1
|
381
|
+
}))
|
382
|
+
end
|
383
|
+
when Net::HTTPUnknownResponse, NilClass then
|
384
|
+
@logger.info("HTTP response code: 0") unless @logger.debug?
|
385
|
+
e = Net::HTTPFatalError.new("Unknown response from server", response)
|
386
|
+
KineticHttpResponse.new(e)
|
251
387
|
else
|
252
|
-
info("HTTP response code: #{response.code}") unless
|
388
|
+
@logger.info("HTTP response code: #{response.code}") unless @logger.debug?
|
253
389
|
KineticHttpResponse.new(response)
|
254
390
|
end
|
391
|
+
rescue Net::HTTPBadResponse => e
|
392
|
+
@logger.info("HTTP bad response: #{e.inspect}") unless @logger.debug?
|
393
|
+
KineticHttpResponse.new(e)
|
255
394
|
rescue StandardError => e
|
256
|
-
info("HTTP
|
395
|
+
@logger.info("HTTP error: #{e.inspect}") unless @logger.debug?
|
257
396
|
KineticHttpResponse.new(e)
|
258
397
|
end
|
259
398
|
end
|
@@ -263,13 +402,21 @@ module KineticSdk
|
|
263
402
|
# @param url [String] url to send the request to
|
264
403
|
# @param data [Hash] payload to send with the request
|
265
404
|
# @param headers [Hash] hash of headers to send
|
266
|
-
# @param
|
405
|
+
# @param http_options [Hash] hash of http options
|
406
|
+
# @option http_options [Fixnum] :max_redirects optional - max number of times to redirect
|
407
|
+
# @option http_options [Fixnum] :gateway_retry_limit optional - max number of times to retry a bad gateway
|
408
|
+
# @option http_options [Float] :gateway_retry_delay optional - number of seconds to delay before retrying a bad gateway
|
267
409
|
# @return [KineticSdk::Utils::KineticHttpResponse] response
|
268
|
-
def post_multipart(url, data={}, headers={},
|
410
|
+
def post_multipart(url, data={}, headers={}, http_options=@options)
|
411
|
+
# determine the http options
|
412
|
+
redirect_limit = http_options[:max_redirects] || max_redirects
|
413
|
+
gateway_retries = http_options[:gateway_retry_limit] || gateway_retry_limit
|
414
|
+
gateway_delay = http_options[:gateway_retry_delay] || gateway_retry_delay
|
415
|
+
|
269
416
|
# the Content-Type header is handled automoatically by Net::HTTP::Post::Multipart
|
270
417
|
headers.delete_if { |k,v| k.to_s.downcase == "content-type" }
|
271
418
|
|
272
|
-
debug("POST #{url} #{headers.inspect} multi-part form content")
|
419
|
+
@logger.debug("POST #{url} #{headers.inspect} multi-part form content")
|
273
420
|
|
274
421
|
# parse the URL
|
275
422
|
uri = URI.parse(url)
|
@@ -304,22 +451,42 @@ module KineticSdk
|
|
304
451
|
case response
|
305
452
|
when Net::HTTPRedirection then
|
306
453
|
if redirect_limit == -1
|
307
|
-
info("HTTP response code: #{response.code}") unless
|
454
|
+
@logger.info("HTTP response code: #{response.code}") unless @logger.debug?
|
308
455
|
KineticHttpResponse.new(response)
|
309
456
|
elsif redirect_limit == 0
|
310
457
|
raise Net::HTTPFatalError.new("Too many redirects", response)
|
311
458
|
else
|
312
|
-
|
459
|
+
post_multipart(response['location'], data, headers, http_options.merge({
|
460
|
+
:max_redirects => redirect_limit - 1
|
461
|
+
}))
|
313
462
|
end
|
314
|
-
|
315
|
-
|
316
|
-
|
463
|
+
# handle 502, 503, 504
|
464
|
+
when Net::HTTPBadGateway, Net::HTTPServiceUnavailable, Net::HTTPGatewayTimeOut then
|
465
|
+
if gateway_retries == -1
|
466
|
+
KineticHttpResponse.new(response)
|
467
|
+
elsif gateway_retries == 0
|
468
|
+
@logger.info("HTTP response: #{response.code} #{response.message}") unless @logger.debug?
|
469
|
+
raise Net::HTTPFatalError.new("#{response.code} #{response.message}", response)
|
470
|
+
else
|
471
|
+
@logger.info("#{response.code} #{response.message}, retrying in #{gateway_delay} seconds")
|
472
|
+
sleep(gateway_delay)
|
473
|
+
post_multipart(url, data, headers, http_options.merge({
|
474
|
+
:gateway_retry_limit => gateway_retries - 1
|
475
|
+
}))
|
476
|
+
end
|
477
|
+
when Net::HTTPUnknownResponse, NilClass then
|
478
|
+
@logger.info("HTTP response code: 0") unless @logger.debug?
|
479
|
+
e = Net::HTTPFatalError.new("Unknown response from server", response)
|
480
|
+
KineticHttpResponse.new(e)
|
317
481
|
else
|
318
|
-
info("HTTP response code: #{response.code}") unless
|
482
|
+
@logger.info("HTTP response code: #{response.code}") unless @logger.debug?
|
319
483
|
KineticHttpResponse.new(response)
|
320
484
|
end
|
485
|
+
rescue Net::HTTPBadResponse => e
|
486
|
+
@logger.info("HTTP bad response: #{e.inspect}") unless @logger.debug?
|
487
|
+
KineticHttpResponse.new(e)
|
321
488
|
rescue StandardError => e
|
322
|
-
info("HTTP
|
489
|
+
@logger.info("HTTP error: #{e.inspect}") unless @logger.debug?
|
323
490
|
KineticHttpResponse.new(e)
|
324
491
|
end
|
325
492
|
end
|
@@ -329,13 +496,21 @@ module KineticSdk
|
|
329
496
|
# @param url [String] url to send the request to
|
330
497
|
# @param data [Hash] payload to send with the request
|
331
498
|
# @param headers [Hash] hash of headers to send
|
332
|
-
# @param
|
499
|
+
# @param http_options [Hash] hash of http options
|
500
|
+
# @option http_options [Fixnum] :max_redirects optional - max number of times to redirect
|
501
|
+
# @option http_options [Fixnum] :gateway_retry_limit optional - max number of times to retry a bad gateway
|
502
|
+
# @option http_options [Float] :gateway_retry_delay optional - number of seconds to delay before retrying a bad gateway
|
333
503
|
# @return [KineticSdk::Utils::KineticHttpResponse] response
|
334
|
-
def put(url, data={}, headers={},
|
504
|
+
def put(url, data={}, headers={}, http_options=@options)
|
505
|
+
# determine the http options
|
506
|
+
redirect_limit = http_options[:max_redirects] || max_redirects
|
507
|
+
gateway_retries = http_options[:gateway_retry_limit] || gateway_retry_limit
|
508
|
+
gateway_delay = http_options[:gateway_retry_delay] || gateway_retry_delay
|
509
|
+
|
335
510
|
# parse the URL
|
336
511
|
uri = URI.parse(url)
|
337
512
|
|
338
|
-
debug("PUT #{uri} #{headers.inspect}")
|
513
|
+
@logger.debug("PUT #{uri} #{headers.inspect}")
|
339
514
|
|
340
515
|
# unless the data is already a string, assume JSON and convert to string
|
341
516
|
data = data.to_json unless data.is_a? String
|
@@ -352,22 +527,42 @@ module KineticSdk
|
|
352
527
|
case response
|
353
528
|
when Net::HTTPRedirection then
|
354
529
|
if redirect_limit == -1
|
355
|
-
info("HTTP response code: #{response.code}") unless
|
530
|
+
@logger.info("HTTP response code: #{response.code}") unless @logger.debug?
|
356
531
|
KineticHttpResponse.new(response)
|
357
532
|
elsif redirect_limit == 0
|
358
533
|
raise Net::HTTPFatalError.new("Too many redirects", response)
|
359
534
|
else
|
360
|
-
|
535
|
+
put(response['location'], data, headers, http_options.merge({
|
536
|
+
:max_redirects => redirect_limit - 1
|
537
|
+
}))
|
538
|
+
end
|
539
|
+
# handle 502, 503, 504
|
540
|
+
when Net::HTTPBadGateway, Net::HTTPServiceUnavailable, Net::HTTPGatewayTimeOut then
|
541
|
+
if gateway_retries == -1
|
542
|
+
KineticHttpResponse.new(response)
|
543
|
+
elsif gateway_retries == 0
|
544
|
+
@logger.info("HTTP response: #{response.code} #{response.message}") unless @logger.debug?
|
545
|
+
raise Net::HTTPFatalError.new("#{response.code} #{response.message}", response)
|
546
|
+
else
|
547
|
+
@logger.info("#{response.code} #{response.message}, retrying in #{gateway_delay} seconds")
|
548
|
+
sleep(gateway_delay)
|
549
|
+
put(url, data, headers, http_options.merge({
|
550
|
+
:gateway_retry_limit => gateway_retries - 1
|
551
|
+
}))
|
361
552
|
end
|
362
|
-
when NilClass then
|
363
|
-
info("HTTP response code: 0") unless
|
364
|
-
|
553
|
+
when Net::HTTPUnknownResponse, NilClass then
|
554
|
+
@logger.info("HTTP response code: 0") unless @logger.debug?
|
555
|
+
e = Net::HTTPFatalError.new("Unknown response from server", response)
|
556
|
+
KineticHttpResponse.new(e)
|
365
557
|
else
|
366
|
-
info("HTTP response code: #{response.code}") unless
|
558
|
+
@logger.info("HTTP response code: #{response.code}") unless @logger.debug?
|
367
559
|
KineticHttpResponse.new(response)
|
368
560
|
end
|
561
|
+
rescue Net::HTTPBadResponse => e
|
562
|
+
@logger.info("HTTP bad response: #{e.inspect}") unless @logger.debug?
|
563
|
+
KineticHttpResponse.new(e)
|
369
564
|
rescue StandardError => e
|
370
|
-
info("HTTP
|
565
|
+
@logger.info("HTTP error: #{e.inspect}") unless @logger.debug?
|
371
566
|
KineticHttpResponse.new(e)
|
372
567
|
end
|
373
568
|
end
|
@@ -377,9 +572,17 @@ module KineticSdk
|
|
377
572
|
# @param url [String] url to send the request to
|
378
573
|
# @param params [Hash] Query parameters that are added to the URL, such as +include+
|
379
574
|
# @param headers [Hash] hash of headers to send
|
380
|
-
# @param
|
575
|
+
# @param http_options [Hash] hash of http options
|
576
|
+
# @option http_options [Fixnum] :max_redirects optional - max number of times to redirect
|
577
|
+
# @option http_options [Fixnum] :gateway_retry_limit optional - max number of times to retry a bad gateway
|
578
|
+
# @option http_options [Float] :gateway_retry_delay optional - number of seconds to delay before retrying a bad gateway
|
381
579
|
# @return [String] redirection url, or url if there is no redirection
|
382
|
-
def redirect_url(url, params={}, headers={},
|
580
|
+
def redirect_url(url, params={}, headers={}, http_options=@options)
|
581
|
+
# determine the http options
|
582
|
+
redirect_limit = http_options[:max_redirects] || max_redirects
|
583
|
+
gateway_retries = http_options[:gateway_retry_limit] || gateway_retry_limit
|
584
|
+
gateway_delay = http_options[:gateway_retry_delay] || gateway_retry_delay
|
585
|
+
|
383
586
|
# parse the URL
|
384
587
|
uri = URI.parse(url)
|
385
588
|
# add URL parameters
|
@@ -397,7 +600,23 @@ module KineticSdk
|
|
397
600
|
when Net::HTTPRedirection then
|
398
601
|
if redirect_limit > 0
|
399
602
|
url = response['location']
|
400
|
-
|
603
|
+
head(response['location'], params, headers, http_options.merge({
|
604
|
+
:max_redirects => redirect_limit - 1
|
605
|
+
}))
|
606
|
+
end
|
607
|
+
# handle 502, 503, 504
|
608
|
+
when Net::HTTPBadGateway, Net::HTTPServiceUnavailable, Net::HTTPGatewayTimeOut then
|
609
|
+
if gateway_retries == -1
|
610
|
+
KineticHttpResponse.new(response)
|
611
|
+
elsif gateway_retries == 0
|
612
|
+
@logger.info("HTTP response: #{response.code} #{response.message}") unless @logger.debug?
|
613
|
+
raise Net::HTTPFatalError.new("#{response.code} #{response.message}", response)
|
614
|
+
else
|
615
|
+
@logger.info("#{response.code} #{response.message}, retrying in #{gateway_delay} seconds")
|
616
|
+
sleep(gateway_delay)
|
617
|
+
redirect_url(url, params, headers, http_options.merge({
|
618
|
+
:gateway_retry_limit => gateway_retries - 1
|
619
|
+
}))
|
401
620
|
end
|
402
621
|
end
|
403
622
|
url
|
@@ -411,14 +630,17 @@ module KineticSdk
|
|
411
630
|
# @param url [String] url to send the request to
|
412
631
|
# @param params [Hash] Query parameters that are added to the URL, such as +include+
|
413
632
|
# @param headers [Hash] hash of headers to send
|
414
|
-
# @param
|
415
|
-
|
633
|
+
# @param http_options [Hash] hash of http options
|
634
|
+
# @option http_options [Fixnum] :max_redirects optional - max number of times to redirect
|
635
|
+
# @option http_options [Fixnum] :gateway_retry_limit optional - max number of times to retry a bad gateway
|
636
|
+
# @option http_options [Float] :gateway_retry_delay optional - number of seconds to delay before retrying a bad gateway
|
637
|
+
def stream_download_to_file(file_path, url, params={}, headers={}, http_options=@http_options)
|
416
638
|
# Determine if redirection is involved
|
417
639
|
url = redirect_url(url, params, headers, max_redirects)
|
418
640
|
# parse the URL
|
419
641
|
uri = URI.parse(url)
|
420
642
|
|
421
|
-
debug("Streaming Download #{uri} #{headers.inspect}")
|
643
|
+
@logger.debug("Streaming Download #{uri} #{headers.inspect}")
|
422
644
|
|
423
645
|
# build the http object
|
424
646
|
http = build_http(uri)
|
@@ -439,26 +661,16 @@ module KineticSdk
|
|
439
661
|
end
|
440
662
|
end
|
441
663
|
if response_code == "200"
|
442
|
-
info("Exported file attachment: #{file_name} to #{file_path}")
|
664
|
+
@logger.info("Exported file attachment: #{file_name} to #{file_path}")
|
443
665
|
else
|
444
|
-
|
666
|
+
@logger.error("Failed to export file attachment \"#{file_name}\": #{message}")
|
445
667
|
end
|
446
668
|
rescue StandardError => e
|
447
|
-
|
669
|
+
@logger.error("Failed to export file attachment \"#{file_name}\": (#{e})")
|
448
670
|
ensure
|
449
671
|
file.close()
|
450
672
|
end
|
451
673
|
end
|
452
|
-
|
453
|
-
# alias methods to allow wrapper modules to handle the
|
454
|
-
# response object.
|
455
|
-
alias_method :delete_raw, :delete
|
456
|
-
alias_method :get_raw, :get
|
457
|
-
alias_method :head_raw, :head
|
458
|
-
alias_method :patch_raw, :patch
|
459
|
-
alias_method :post_raw, :post
|
460
|
-
alias_method :post_multipart_raw, :post_multipart
|
461
|
-
alias_method :put_raw, :put
|
462
674
|
|
463
675
|
|
464
676
|
# Encode URI components
|
@@ -499,6 +711,45 @@ module KineticSdk
|
|
499
711
|
limit.nil? ? 5 : limit.to_i
|
500
712
|
end
|
501
713
|
|
714
|
+
# The maximum number of times to retry on a bad gateway response.
|
715
|
+
#
|
716
|
+
# Can be passed in as an option when initializing the SDK
|
717
|
+
# with either the @options[:gateway_retry_limit] or
|
718
|
+
# @options['gateway_retry_limit'] key.
|
719
|
+
#
|
720
|
+
# Expects an integer [Fixnum] value. Setting to -1 will disable retries on
|
721
|
+
# a bad gateway response.
|
722
|
+
#
|
723
|
+
# @return [Fixnum] default -1
|
724
|
+
def gateway_retry_limit
|
725
|
+
limit = @options &&
|
726
|
+
(
|
727
|
+
@options[:gateway_retry_limit] ||
|
728
|
+
@options['gateway_retry_limit']
|
729
|
+
)
|
730
|
+
limit.nil? ? -1 : limit.to_i
|
731
|
+
end
|
732
|
+
|
733
|
+
# The amount of time in seconds to delay before retrying the request when
|
734
|
+
# a bad gateway response is encountered.
|
735
|
+
#
|
736
|
+
# Can be passed in as an option when initializing the SDK
|
737
|
+
# with either the @options[:gateway_retry_delay] or
|
738
|
+
# @options['gateway_retry_delay'] key.
|
739
|
+
#
|
740
|
+
# Expects a double [Float] value.
|
741
|
+
#
|
742
|
+
# @return [Float] default 1.0
|
743
|
+
def gateway_retry_delay
|
744
|
+
delay = @options &&
|
745
|
+
(
|
746
|
+
@options[:gateway_retry_delay] ||
|
747
|
+
@options['gateway_retry_delay']
|
748
|
+
)
|
749
|
+
delay.nil? ? 1.0 : delay.to_f
|
750
|
+
end
|
751
|
+
|
752
|
+
|
502
753
|
private
|
503
754
|
|
504
755
|
# Build the Net::HTTP object.
|
@@ -507,9 +758,10 @@ module KineticSdk
|
|
507
758
|
# @return [Net::HTTP]
|
508
759
|
def build_http(uri)
|
509
760
|
http = Net::HTTP.new(uri.host, uri.port)
|
510
|
-
http.set_debug_output($stdout) if
|
761
|
+
http.set_debug_output($stdout) if @logger.debug?
|
511
762
|
if (uri.scheme == 'https')
|
512
763
|
http.use_ssl = true
|
764
|
+
OpenSSL.debug = @logger.debug?
|
513
765
|
if (@options[:ssl_verify_mode].to_s.strip.downcase == 'peer')
|
514
766
|
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
515
767
|
http.ca_file = @options[:ssl_ca_file] if @options[:ssl_ca_file]
|
@@ -522,7 +774,7 @@ module KineticSdk
|
|
522
774
|
http
|
523
775
|
end
|
524
776
|
|
525
|
-
end
|
777
|
+
end # KineticSdk::Utils::KineticHttpUtils module
|
526
778
|
|
527
779
|
|
528
780
|
# The KineticHttp class provides functionality to make generic HTTP requests.
|
@@ -539,14 +791,52 @@ module KineticSdk
|
|
539
791
|
#
|
540
792
|
# @param username [String] username for Basic Authentication
|
541
793
|
# @param password [String] password for Basic Authentication
|
542
|
-
|
794
|
+
# @param http_options [Hash] hash of http options
|
795
|
+
# @option http_options [String] :log_level (off) log_level
|
796
|
+
# @option http_options [Fixnum] :max_redirects (5) max number of times to redirect
|
797
|
+
# @option http_options [Fixnum] :gateway_retry_limit (-1) max number of times to retry a bad gateway
|
798
|
+
# @option http_options [Float] :gateway_retry_delay (1.0) number of seconds to delay before retrying a bad gateway
|
799
|
+
# @option http_options [String] :ssl_ca_file (/etc/ca.crt certificate) location of the ca certificate
|
800
|
+
# @option http_options [String] :ssl_verify_mode (none) use `peer` to enable verification
|
801
|
+
def initialize(username=nil, password=nil, http_options={})
|
543
802
|
@username = username
|
544
803
|
@password = password
|
545
|
-
@options =
|
804
|
+
@options = http_options
|
546
805
|
end
|
547
806
|
|
807
|
+
end # KineticSdk::Utils::KineticHttp class
|
808
|
+
|
809
|
+
end # KineticSdk::Utils module
|
810
|
+
|
811
|
+
# The CustomHttp class provides functionality to make generic HTTP requests
|
812
|
+
# utilizing the functionality of the KineticSdk.
|
813
|
+
class CustomHttp
|
814
|
+
include KineticSdk::Utils::KineticHttpUtils
|
815
|
+
attr_accessor :username, :password, :options, :logger
|
816
|
+
|
817
|
+
# Constructor
|
818
|
+
#
|
819
|
+
# @param opts [Hash] options for HTTP requests
|
820
|
+
# @option opts [String] :username (nil) for Basic Authentication
|
821
|
+
# @option opts [String] :password (nil) for Basic Authentication
|
822
|
+
# @option opts [Hash] :options ({}) http options
|
823
|
+
# @option options [String] :log_level (off) log_level
|
824
|
+
# @option options [String] :log_output (STDOUT) log_output
|
825
|
+
# @option options [Fixnum] :max_redirects (5) max number of times to redirect
|
826
|
+
# @option options [Fixnum] :gateway_retry_limit (-1) max number of times to retry a bad gateway
|
827
|
+
# @option options [Float] :gateway_retry_delay (1.0) number of seconds to delay before retrying a bad gateway
|
828
|
+
# @option options [String] :ssl_ca_file (/etc/ca.crt certificate) location of the ca certificate
|
829
|
+
# @option options [String] :ssl_verify_mode (none) use `peer` to enable verification
|
830
|
+
def initialize(opts={})
|
831
|
+
@username = opts[:username]
|
832
|
+
@password = opts[:password]
|
833
|
+
@options = opts.delete(:options) || {}
|
834
|
+
log_level = @options[:log_level] || @options["log_level"]
|
835
|
+
log_output = @options[:log_output] || @options["log_output"]
|
836
|
+
@logger = KineticSdk::Utils::KLogger.new(log_level, log_output)
|
548
837
|
end
|
549
|
-
|
550
838
|
|
551
839
|
end
|
552
|
-
|
840
|
+
|
841
|
+
|
842
|
+
end # KineticSdk module
|