kinetic_sdk 0.1.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. checksums.yaml +5 -5
  2. data/.yardoc-includes/yard-helpers.rb +14 -0
  3. data/.yardopts +7 -0
  4. data/CHANGELOG.md +41 -0
  5. data/GettingStarted.md +6 -12
  6. data/README.md +85 -37
  7. data/Rakefile +13 -0
  8. data/kinetic_sdk.gemspec +33 -0
  9. data/lib/kinetic_sdk/agent/agent-sdk.rb +90 -0
  10. data/lib/kinetic_sdk/agent/lib/bridges.rb +92 -0
  11. data/lib/kinetic_sdk/agent/lib/filestores.rb +91 -0
  12. data/lib/kinetic_sdk/agent/lib/handler.rb +91 -0
  13. data/lib/kinetic_sdk/bridgehub/bridgehub-sdk.rb +11 -3
  14. data/lib/kinetic_sdk/bridgehub/lib/access_keys.rb +5 -5
  15. data/lib/kinetic_sdk/bridgehub/lib/bridge.rb +5 -5
  16. data/lib/kinetic_sdk/{request_ce/request-ce-sdk.rb → core/core-sdk.rb} +30 -16
  17. data/lib/kinetic_sdk/core/lib/attribute_definitions.rb +500 -0
  18. data/lib/kinetic_sdk/core/lib/bridges.rb +141 -0
  19. data/lib/kinetic_sdk/{request_ce → core}/lib/categories.rb +3 -3
  20. data/lib/kinetic_sdk/{request_ce → core}/lib/datastore_form.rb +8 -8
  21. data/lib/kinetic_sdk/{request_ce → core}/lib/datastore_submissions.rb +20 -9
  22. data/lib/kinetic_sdk/{request_ce → core}/lib/form.rb +7 -7
  23. data/lib/kinetic_sdk/{request_ce → core}/lib/form_types.rb +4 -4
  24. data/lib/kinetic_sdk/{request_ce → core}/lib/jwt.rb +4 -4
  25. data/lib/kinetic_sdk/{request_ce → core}/lib/kapp.rb +7 -7
  26. data/lib/kinetic_sdk/{request_ce → core}/lib/meta.rb +3 -3
  27. data/lib/kinetic_sdk/{request_ce → core}/lib/oauth.rb +4 -4
  28. data/lib/kinetic_sdk/{request_ce → core}/lib/security_policy_definitions.rb +11 -11
  29. data/lib/kinetic_sdk/core/lib/space.rb +156 -0
  30. data/lib/kinetic_sdk/{request_ce → core}/lib/submissions.rb +11 -11
  31. data/lib/kinetic_sdk/{request_ce → core}/lib/system_api.rb +19 -7
  32. data/lib/kinetic_sdk/{request_ce → core}/lib/teams.rb +9 -9
  33. data/lib/kinetic_sdk/{request_ce → core}/lib/users.rb +15 -15
  34. data/lib/kinetic_sdk/{request_ce → core}/lib/webhook_jobs.rb +5 -5
  35. data/lib/kinetic_sdk/{request_ce → core}/lib/webhooks.rb +9 -9
  36. data/lib/kinetic_sdk/discussions/discussions-sdk.rb +12 -4
  37. data/lib/kinetic_sdk/discussions/lib/discussions.rb +8 -8
  38. data/lib/kinetic_sdk/discussions/lib/invitations.rb +9 -9
  39. data/lib/kinetic_sdk/discussions/lib/messages.rb +8 -8
  40. data/lib/kinetic_sdk/discussions/lib/meta.rb +1 -1
  41. data/lib/kinetic_sdk/discussions/lib/participants.rb +5 -5
  42. data/lib/kinetic_sdk/discussions/lib/related_items.rb +4 -4
  43. data/lib/kinetic_sdk/discussions/lib/websockets.rb +9 -9
  44. data/lib/kinetic_sdk/filehub/filehub-sdk.rb +11 -3
  45. data/lib/kinetic_sdk/filehub/lib/access_keys.rb +5 -5
  46. data/lib/kinetic_sdk/filehub/lib/filestores.rb +5 -5
  47. data/lib/kinetic_sdk/task/lib/access_keys.rb +35 -7
  48. data/lib/kinetic_sdk/task/lib/categories.rb +30 -17
  49. data/lib/kinetic_sdk/task/lib/config.rb +14 -14
  50. data/lib/kinetic_sdk/task/lib/engine.rb +1 -1
  51. data/lib/kinetic_sdk/task/lib/errors.rb +10 -10
  52. data/lib/kinetic_sdk/task/lib/export.rb +32 -0
  53. data/lib/kinetic_sdk/task/lib/groups.rb +23 -10
  54. data/lib/kinetic_sdk/task/lib/handlers.rb +27 -11
  55. data/lib/kinetic_sdk/task/lib/health.rb +11 -3
  56. data/lib/kinetic_sdk/task/lib/license.rb +4 -4
  57. data/lib/kinetic_sdk/task/lib/policy_rules.rb +25 -12
  58. data/lib/kinetic_sdk/task/lib/runs.rb +43 -0
  59. data/lib/kinetic_sdk/task/lib/setup.rb +2 -2
  60. data/lib/kinetic_sdk/task/lib/sources.rb +39 -8
  61. data/lib/kinetic_sdk/task/lib/tasks.rb +1 -1
  62. data/lib/kinetic_sdk/task/lib/trees.rb +84 -28
  63. data/lib/kinetic_sdk/task/lib/users.rb +6 -6
  64. data/lib/kinetic_sdk/task/task-sdk.rb +16 -4
  65. data/lib/kinetic_sdk/utils/kinetic-export-utils.rb +157 -0
  66. data/lib/kinetic_sdk/utils/kinetic-http.rb +388 -98
  67. data/lib/kinetic_sdk/utils/logger.rb +82 -46
  68. data/lib/kinetic_sdk/utils/prettier-xml-formatter.rb +60 -0
  69. data/lib/kinetic_sdk/version.rb +1 -1
  70. data/lib/kinetic_sdk.rb +5 -2
  71. metadata +41 -27
  72. data/lib/kinetic_sdk/request_ce/lib/attribute_definitions.rb +0 -153
  73. data/lib/kinetic_sdk/request_ce/lib/bridges.rb +0 -66
  74. 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 redirect_limit [Fixnum] max number of times to redirect
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={}, redirect_limit=max_redirects)
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 trace?
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
- delete_raw(response['location'], headers, redirect_limit - 1)
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 trace?
60
- raise Net::HTTPFatalError.new("No response from server", response)
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 trace?
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 response: #{response.inspect}") unless trace?
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 redirect_limit [Fixnum] max number of times to redirect
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={}, redirect_limit=max_redirects)
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 trace?
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
- get_raw(response['location'], params, headers, redirect_limit - 1)
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 trace?
107
- raise Net::HTTPFatalError.new("No response from server", response)
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 trace?
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 response: #{response.inspect}") unless trace?
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 redirect_limit [Fixnum] max number of times to redirect
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={}, redirect_limit=max_redirects)
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 trace?
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
- head_raw(response['location'], params, headers, redirect_limit - 1)
213
+ head(response['location'], params, headers, http_options.merge({
214
+ :max_redirects => redirect_limit - 1
215
+ }))
151
216
  end
152
- when NilClass then
153
- info("HTTP response code: 0") unless trace?
154
- raise Net::HTTPFatalError.new("No response from server", response)
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 trace?
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 response: #{response.inspect}") unless trace?
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 redirect_limit [Fixnum] max number of times to redirect
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={}, redirect_limit=max_redirects)
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 trace?
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
- patch_raw(response['location'], data, headers, redirect_limit - 1)
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 trace?
202
- raise Net::HTTPFatalError.new("No response from server", response)
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 trace?
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 response: #{response.inspect}") unless trace?
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 redirect_limit [Fixnum] max number of times to redirect
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={}, redirect_limit=max_redirects)
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 trace?
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
- post_raw(response['location'], data, headers, redirect_limit - 1)
365
+ post(response['location'], data, headers, http_options.merge({
366
+ :max_redirects => redirect_limit - 1
367
+ }))
247
368
  end
248
- when NilClass then
249
- info("HTTP response code: 0") unless trace?
250
- raise Net::HTTPFatalError.new("No response from server", response)
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 trace?
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 response: #{response.inspect}") unless trace?
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 redirect_limit [Fixnum] max number of times to redirect
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={}, redirect_limit=max_redirects)
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 trace?
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
- post_multipart_raw(response['location'], data, headers, redirect_limit - 1)
459
+ post_multipart(response['location'], data, headers, http_options.merge({
460
+ :max_redirects => redirect_limit - 1
461
+ }))
313
462
  end
314
- when NilClass then
315
- info("HTTP response code: 0") unless trace?
316
- raise Net::HTTPFatalError.new("No response from server", response)
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 trace?
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 response: #{response.inspect}") unless trace?
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 redirect_limit [Fixnum] max number of times to redirect
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={}, redirect_limit=max_redirects)
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 trace?
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
- put_raw(response['location'], data, headers, redirect_limit - 1)
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 trace?
364
- raise Net::HTTPFatalError.new("No response from server", response)
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 trace?
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 response: #{response.inspect}") unless trace?
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 redirect_limit [Fixnum] max number of times to redirect
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={}, redirect_limit=max_redirects)
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
- head_raw(response['location'], params, headers, redirect_limit - 1)
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 redirect_limit [Fixnum] max number of times to redirect
415
- def stream_download_to_file(file_path, url, params={}, headers={}, redirect_limit=max_redirects)
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
- warn("Failed to export file attachment \"#{file_name}\": #{message}")
666
+ @logger.error("Failed to export file attachment \"#{file_name}\": #{message}")
445
667
  end
446
668
  rescue StandardError => e
447
- warn("Failed to export file attachment \"#{file_name}\": (#{e})")
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 trace?
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
- def initialize(username=nil, password=nil)
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
- end
840
+
841
+
842
+ end # KineticSdk module