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.
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