kinetic_sdk 0.1.1

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 (245) hide show
  1. checksums.yaml +7 -0
  2. data/GettingStarted.md +64 -0
  3. data/README.md +383 -0
  4. data/bin/console +12 -0
  5. data/bin/setup +8 -0
  6. data/gems/kontena-websocket-client-0.1.1/Gemfile +4 -0
  7. data/gems/kontena-websocket-client-0.1.1/LICENSE +190 -0
  8. data/gems/kontena-websocket-client-0.1.1/README.md +138 -0
  9. data/gems/kontena-websocket-client-0.1.1/Rakefile +6 -0
  10. data/gems/kontena-websocket-client-0.1.1/benchmark/benchmark-client.rb +45 -0
  11. data/gems/kontena-websocket-client-0.1.1/benchmark/benchmark-em.rb +66 -0
  12. data/gems/kontena-websocket-client-0.1.1/benchmark/benchmark.rb +161 -0
  13. data/gems/kontena-websocket-client-0.1.1/benchmark/benchmark.sh +17 -0
  14. data/gems/kontena-websocket-client-0.1.1/benchmark/websocket-echo-server.go +207 -0
  15. data/gems/kontena-websocket-client-0.1.1/examples/websocket-echo-client.rb +80 -0
  16. data/gems/kontena-websocket-client-0.1.1/kontena-websocket-client.gemspec +24 -0
  17. data/gems/kontena-websocket-client-0.1.1/lib/kontena/websocket/client/connection.rb +119 -0
  18. data/gems/kontena-websocket-client-0.1.1/lib/kontena/websocket/client/version.rb +13 -0
  19. data/gems/kontena-websocket-client-0.1.1/lib/kontena/websocket/client.rb +848 -0
  20. data/gems/kontena-websocket-client-0.1.1/lib/kontena/websocket/error.rb +81 -0
  21. data/gems/kontena-websocket-client-0.1.1/lib/kontena/websocket/logging.rb +55 -0
  22. data/gems/kontena-websocket-client-0.1.1/lib/kontena/websocket/openssl_patch.rb +10 -0
  23. data/gems/kontena-websocket-client-0.1.1/lib/kontena-websocket-client.rb +15 -0
  24. data/gems/mime-types-3.1/Code-of-Conduct.rdoc +74 -0
  25. data/gems/mime-types-3.1/Contributing.rdoc +130 -0
  26. data/gems/mime-types-3.1/History.rdoc +658 -0
  27. data/gems/mime-types-3.1/Licence.rdoc +25 -0
  28. data/gems/mime-types-3.1/Manifest.txt +31 -0
  29. data/gems/mime-types-3.1/README.rdoc +202 -0
  30. data/gems/mime-types-3.1/Rakefile +254 -0
  31. data/gems/mime-types-3.1/lib/mime/type/columnar.rb +55 -0
  32. data/gems/mime-types-3.1/lib/mime/type.rb +573 -0
  33. data/gems/mime-types-3.1/lib/mime/types/_columnar.rb +135 -0
  34. data/gems/mime-types-3.1/lib/mime/types/cache.rb +56 -0
  35. data/gems/mime-types-3.1/lib/mime/types/columnar.rb +1 -0
  36. data/gems/mime-types-3.1/lib/mime/types/container.rb +30 -0
  37. data/gems/mime-types-3.1/lib/mime/types/deprecations.rb +32 -0
  38. data/gems/mime-types-3.1/lib/mime/types/full.rb +17 -0
  39. data/gems/mime-types-3.1/lib/mime/types/loader.rb +148 -0
  40. data/gems/mime-types-3.1/lib/mime/types/logger.rb +37 -0
  41. data/gems/mime-types-3.1/lib/mime/types/registry.rb +81 -0
  42. data/gems/mime-types-3.1/lib/mime/types.rb +228 -0
  43. data/gems/mime-types-3.1/lib/mime-types.rb +1 -0
  44. data/gems/mime-types-3.1/test/bad-fixtures/malformed +9 -0
  45. data/gems/mime-types-3.1/test/fixture/json.json +1 -0
  46. data/gems/mime-types-3.1/test/fixture/old-data +9 -0
  47. data/gems/mime-types-3.1/test/fixture/yaml.yaml +55 -0
  48. data/gems/mime-types-3.1/test/minitest_helper.rb +13 -0
  49. data/gems/mime-types-3.1/test/test_mime_type.rb +603 -0
  50. data/gems/mime-types-3.1/test/test_mime_types.rb +161 -0
  51. data/gems/mime-types-3.1/test/test_mime_types_cache.rb +109 -0
  52. data/gems/mime-types-3.1/test/test_mime_types_class.rb +155 -0
  53. data/gems/mime-types-3.1/test/test_mime_types_lazy.rb +43 -0
  54. data/gems/mime-types-3.1/test/test_mime_types_loader.rb +32 -0
  55. data/gems/mime-types-data-3.2016.0521/Code-of-Conduct.md +75 -0
  56. data/gems/mime-types-data-3.2016.0521/Contributing.md +157 -0
  57. data/gems/mime-types-data-3.2016.0521/History.md +351 -0
  58. data/gems/mime-types-data-3.2016.0521/Licence.md +25 -0
  59. data/gems/mime-types-data-3.2016.0521/Manifest.txt +18 -0
  60. data/gems/mime-types-data-3.2016.0521/README.md +61 -0
  61. data/gems/mime-types-data-3.2016.0521/Rakefile +80 -0
  62. data/gems/mime-types-data-3.2016.0521/data/mime-types.json +1 -0
  63. data/gems/mime-types-data-3.2016.0521/data/mime.content_type.column +1964 -0
  64. data/gems/mime-types-data-3.2016.0521/data/mime.docs.column +1964 -0
  65. data/gems/mime-types-data-3.2016.0521/data/mime.encoding.column +1964 -0
  66. data/gems/mime-types-data-3.2016.0521/data/mime.flags.column +1964 -0
  67. data/gems/mime-types-data-3.2016.0521/data/mime.friendly.column +1964 -0
  68. data/gems/mime-types-data-3.2016.0521/data/mime.pext.column +1964 -0
  69. data/gems/mime-types-data-3.2016.0521/data/mime.use_instead.column +1964 -0
  70. data/gems/mime-types-data-3.2016.0521/data/mime.xrefs.column +1964 -0
  71. data/gems/mime-types-data-3.2016.0521/lib/mime/types/data.rb +21 -0
  72. data/gems/mime-types-data-3.2016.0521/lib/mime-types-data.rb +3 -0
  73. data/gems/multipart-post-2.0.0/Gemfile +14 -0
  74. data/gems/multipart-post-2.0.0/History.txt +60 -0
  75. data/gems/multipart-post-2.0.0/Manifest.txt +9 -0
  76. data/gems/multipart-post-2.0.0/README.md +77 -0
  77. data/gems/multipart-post-2.0.0/Rakefile +9 -0
  78. data/gems/multipart-post-2.0.0/lib/composite_io.rb +108 -0
  79. data/gems/multipart-post-2.0.0/lib/multipart_post.rb +9 -0
  80. data/gems/multipart-post-2.0.0/lib/multipartable.rb +29 -0
  81. data/gems/multipart-post-2.0.0/lib/net/http/post/multipart.rb +27 -0
  82. data/gems/multipart-post-2.0.0/lib/parts.rb +96 -0
  83. data/gems/multipart-post-2.0.0/multipart-post.gemspec +22 -0
  84. data/gems/multipart-post-2.0.0/test/multibyte.txt +1 -0
  85. data/gems/multipart-post-2.0.0/test/net/http/post/test_multipart.rb +110 -0
  86. data/gems/multipart-post-2.0.0/test/test_composite_io.rb +115 -0
  87. data/gems/multipart-post-2.0.0/test/test_parts.rb +86 -0
  88. data/gems/parallel-1.12.1/MIT-LICENSE.txt +20 -0
  89. data/gems/parallel-1.12.1/lib/parallel/processor_count.rb +93 -0
  90. data/gems/parallel-1.12.1/lib/parallel/version.rb +3 -0
  91. data/gems/parallel-1.12.1/lib/parallel.rb +500 -0
  92. data/gems/ruby-progressbar-1.9.0/LICENSE.txt +19 -0
  93. data/gems/ruby-progressbar-1.9.0/README.md +38 -0
  94. data/gems/ruby-progressbar-1.9.0/Rakefile +2 -0
  95. data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/base.rb +183 -0
  96. data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/calculators/length.rb +99 -0
  97. data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/calculators/running_average.rb +9 -0
  98. data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/components/bar.rb +96 -0
  99. data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/components/percentage.rb +29 -0
  100. data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/components/rate.rb +43 -0
  101. data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/components/time.rb +107 -0
  102. data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/components/title.rb +13 -0
  103. data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/components.rb +5 -0
  104. data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/errors/invalid_progress_error.rb +4 -0
  105. data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/format/formatter.rb +27 -0
  106. data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/format/molecule.rb +59 -0
  107. data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/format/string.rb +36 -0
  108. data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/format.rb +3 -0
  109. data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/output.rb +68 -0
  110. data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/outputs/non_tty.rb +47 -0
  111. data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/outputs/null.rb +33 -0
  112. data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/outputs/tty.rb +32 -0
  113. data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/progress.rb +118 -0
  114. data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/refinements/enumerator.rb +25 -0
  115. data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/refinements.rb +1 -0
  116. data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/throttle.rb +25 -0
  117. data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/time.rb +30 -0
  118. data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/timer.rb +72 -0
  119. data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar/version.rb +3 -0
  120. data/gems/ruby-progressbar-1.9.0/lib/ruby-progressbar.rb +18 -0
  121. data/gems/slugify-1.0.7/README +18 -0
  122. data/gems/slugify-1.0.7/lib/slugify.rb +1012 -0
  123. data/gems/slugify-1.0.7/lib/slugify_string.rb +11 -0
  124. data/gems/slugify-1.0.7/tests/slugify_test.rb +116 -0
  125. data/gems/slugify-1.0.7/tests/string_slugify_test.rb +23 -0
  126. data/gems/websocket-driver-0.6.5/CHANGELOG.md +123 -0
  127. data/gems/websocket-driver-0.6.5/LICENSE.md +22 -0
  128. data/gems/websocket-driver-0.6.5/README.md +369 -0
  129. data/gems/websocket-driver-0.6.5/examples/tcp_server.rb +28 -0
  130. data/gems/websocket-driver-0.6.5/ext/websocket-driver/Makefile +264 -0
  131. data/gems/websocket-driver-0.6.5/ext/websocket-driver/WebsocketMaskService.java +55 -0
  132. data/gems/websocket-driver-0.6.5/ext/websocket-driver/extconf.rb +4 -0
  133. data/gems/websocket-driver-0.6.5/ext/websocket-driver/websocket_mask.bundle +0 -0
  134. data/gems/websocket-driver-0.6.5/ext/websocket-driver/websocket_mask.c +41 -0
  135. data/gems/websocket-driver-0.6.5/ext/websocket-driver/websocket_mask.o +0 -0
  136. data/gems/websocket-driver-0.6.5/lib/websocket/driver/client.rb +140 -0
  137. data/gems/websocket-driver-0.6.5/lib/websocket/driver/draft75.rb +102 -0
  138. data/gems/websocket-driver-0.6.5/lib/websocket/driver/draft76.rb +96 -0
  139. data/gems/websocket-driver-0.6.5/lib/websocket/driver/event_emitter.rb +54 -0
  140. data/gems/websocket-driver-0.6.5/lib/websocket/driver/headers.rb +45 -0
  141. data/gems/websocket-driver-0.6.5/lib/websocket/driver/hybi/frame.rb +20 -0
  142. data/gems/websocket-driver-0.6.5/lib/websocket/driver/hybi/message.rb +31 -0
  143. data/gems/websocket-driver-0.6.5/lib/websocket/driver/hybi.rb +406 -0
  144. data/gems/websocket-driver-0.6.5/lib/websocket/driver/proxy.rb +68 -0
  145. data/gems/websocket-driver-0.6.5/lib/websocket/driver/server.rb +80 -0
  146. data/gems/websocket-driver-0.6.5/lib/websocket/driver/stream_reader.rb +55 -0
  147. data/gems/websocket-driver-0.6.5/lib/websocket/driver.rb +199 -0
  148. data/gems/websocket-driver-0.6.5/lib/websocket/http/headers.rb +112 -0
  149. data/gems/websocket-driver-0.6.5/lib/websocket/http/request.rb +45 -0
  150. data/gems/websocket-driver-0.6.5/lib/websocket/http/response.rb +29 -0
  151. data/gems/websocket-driver-0.6.5/lib/websocket/http.rb +15 -0
  152. data/gems/websocket-driver-0.6.5/lib/websocket/mask.rb +14 -0
  153. data/gems/websocket-driver-0.6.5/lib/websocket/websocket_mask.rb +2 -0
  154. data/gems/websocket-driver-0.6.5/lib/websocket_mask.bundle +0 -0
  155. data/gems/websocket-driver-0.6.5-java/CHANGELOG.md +123 -0
  156. data/gems/websocket-driver-0.6.5-java/LICENSE.md +22 -0
  157. data/gems/websocket-driver-0.6.5-java/README.md +369 -0
  158. data/gems/websocket-driver-0.6.5-java/examples/tcp_server.rb +28 -0
  159. data/gems/websocket-driver-0.6.5-java/ext/websocket-driver/WebsocketMaskService.java +55 -0
  160. data/gems/websocket-driver-0.6.5-java/ext/websocket-driver/extconf.rb +4 -0
  161. data/gems/websocket-driver-0.6.5-java/ext/websocket-driver/websocket_mask.c +41 -0
  162. data/gems/websocket-driver-0.6.5-java/lib/websocket/driver/client.rb +140 -0
  163. data/gems/websocket-driver-0.6.5-java/lib/websocket/driver/draft75.rb +102 -0
  164. data/gems/websocket-driver-0.6.5-java/lib/websocket/driver/draft76.rb +96 -0
  165. data/gems/websocket-driver-0.6.5-java/lib/websocket/driver/event_emitter.rb +54 -0
  166. data/gems/websocket-driver-0.6.5-java/lib/websocket/driver/headers.rb +45 -0
  167. data/gems/websocket-driver-0.6.5-java/lib/websocket/driver/hybi/frame.rb +20 -0
  168. data/gems/websocket-driver-0.6.5-java/lib/websocket/driver/hybi/message.rb +31 -0
  169. data/gems/websocket-driver-0.6.5-java/lib/websocket/driver/hybi.rb +406 -0
  170. data/gems/websocket-driver-0.6.5-java/lib/websocket/driver/proxy.rb +68 -0
  171. data/gems/websocket-driver-0.6.5-java/lib/websocket/driver/server.rb +80 -0
  172. data/gems/websocket-driver-0.6.5-java/lib/websocket/driver/stream_reader.rb +55 -0
  173. data/gems/websocket-driver-0.6.5-java/lib/websocket/driver.rb +199 -0
  174. data/gems/websocket-driver-0.6.5-java/lib/websocket/http/headers.rb +112 -0
  175. data/gems/websocket-driver-0.6.5-java/lib/websocket/http/request.rb +45 -0
  176. data/gems/websocket-driver-0.6.5-java/lib/websocket/http/response.rb +29 -0
  177. data/gems/websocket-driver-0.6.5-java/lib/websocket/http.rb +15 -0
  178. data/gems/websocket-driver-0.6.5-java/lib/websocket/mask.rb +14 -0
  179. data/gems/websocket-driver-0.6.5-java/lib/websocket/websocket_mask.rb +2 -0
  180. data/gems/websocket-driver-0.6.5-java/lib/websocket_mask.jar +0 -0
  181. data/gems/websocket-extensions-0.1.3/CHANGELOG.md +15 -0
  182. data/gems/websocket-extensions-0.1.3/LICENSE.md +20 -0
  183. data/gems/websocket-extensions-0.1.3/README.md +313 -0
  184. data/gems/websocket-extensions-0.1.3/lib/websocket/extensions/parser.rb +111 -0
  185. data/gems/websocket-extensions-0.1.3/lib/websocket/extensions.rb +181 -0
  186. data/lib/kinetic-sdk.rb +1 -0
  187. data/lib/kinetic_sdk/bridgehub/bridgehub-sdk.rb +80 -0
  188. data/lib/kinetic_sdk/bridgehub/lib/access_keys.rb +67 -0
  189. data/lib/kinetic_sdk/bridgehub/lib/bridge.rb +69 -0
  190. data/lib/kinetic_sdk/discussions/discussions-sdk.rb +165 -0
  191. data/lib/kinetic_sdk/discussions/lib/discussions.rb +107 -0
  192. data/lib/kinetic_sdk/discussions/lib/invitations.rb +120 -0
  193. data/lib/kinetic_sdk/discussions/lib/messages.rb +190 -0
  194. data/lib/kinetic_sdk/discussions/lib/meta.rb +14 -0
  195. data/lib/kinetic_sdk/discussions/lib/participants.rb +64 -0
  196. data/lib/kinetic_sdk/discussions/lib/related_items.rb +54 -0
  197. data/lib/kinetic_sdk/discussions/lib/websockets.rb +96 -0
  198. data/lib/kinetic_sdk/filehub/filehub-sdk.rb +80 -0
  199. data/lib/kinetic_sdk/filehub/lib/access_keys.rb +67 -0
  200. data/lib/kinetic_sdk/filehub/lib/filestores.rb +67 -0
  201. data/lib/kinetic_sdk/request_ce/lib/attribute_definitions.rb +153 -0
  202. data/lib/kinetic_sdk/request_ce/lib/bridges.rb +66 -0
  203. data/lib/kinetic_sdk/request_ce/lib/categories.rb +34 -0
  204. data/lib/kinetic_sdk/request_ce/lib/datastore_form.rb +110 -0
  205. data/lib/kinetic_sdk/request_ce/lib/datastore_submissions.rb +157 -0
  206. data/lib/kinetic_sdk/request_ce/lib/form.rb +99 -0
  207. data/lib/kinetic_sdk/request_ce/lib/form_types.rb +51 -0
  208. data/lib/kinetic_sdk/request_ce/lib/jwt.rb +55 -0
  209. data/lib/kinetic_sdk/request_ce/lib/kapp.rb +93 -0
  210. data/lib/kinetic_sdk/request_ce/lib/meta.rb +14 -0
  211. data/lib/kinetic_sdk/request_ce/lib/oauth.rb +37 -0
  212. data/lib/kinetic_sdk/request_ce/lib/security_policy_definitions.rb +157 -0
  213. data/lib/kinetic_sdk/request_ce/lib/space.rb +89 -0
  214. data/lib/kinetic_sdk/request_ce/lib/submissions.rb +215 -0
  215. data/lib/kinetic_sdk/request_ce/lib/system_api.rb +69 -0
  216. data/lib/kinetic_sdk/request_ce/lib/teams.rb +113 -0
  217. data/lib/kinetic_sdk/request_ce/lib/users.rb +245 -0
  218. data/lib/kinetic_sdk/request_ce/lib/webhook_jobs.rb +142 -0
  219. data/lib/kinetic_sdk/request_ce/lib/webhooks.rb +192 -0
  220. data/lib/kinetic_sdk/request_ce/request-ce-sdk.rb +153 -0
  221. data/lib/kinetic_sdk/task/lib/access_keys.rb +94 -0
  222. data/lib/kinetic_sdk/task/lib/categories.rb +190 -0
  223. data/lib/kinetic_sdk/task/lib/config.rb +202 -0
  224. data/lib/kinetic_sdk/task/lib/engine.rb +42 -0
  225. data/lib/kinetic_sdk/task/lib/environment.rb +14 -0
  226. data/lib/kinetic_sdk/task/lib/errors.rb +165 -0
  227. data/lib/kinetic_sdk/task/lib/groups.rb +112 -0
  228. data/lib/kinetic_sdk/task/lib/handlers.rb +105 -0
  229. data/lib/kinetic_sdk/task/lib/health.rb +28 -0
  230. data/lib/kinetic_sdk/task/lib/license.rb +52 -0
  231. data/lib/kinetic_sdk/task/lib/policy_rules.rb +166 -0
  232. data/lib/kinetic_sdk/task/lib/setup.rb +56 -0
  233. data/lib/kinetic_sdk/task/lib/sources.rb +134 -0
  234. data/lib/kinetic_sdk/task/lib/tasks.rb +17 -0
  235. data/lib/kinetic_sdk/task/lib/trees.rb +274 -0
  236. data/lib/kinetic_sdk/task/lib/users.rb +75 -0
  237. data/lib/kinetic_sdk/task/task-sdk.rb +92 -0
  238. data/lib/kinetic_sdk/utils/kinetic-http-headers.rb +150 -0
  239. data/lib/kinetic_sdk/utils/kinetic-http-response.rb +75 -0
  240. data/lib/kinetic_sdk/utils/kinetic-http.rb +552 -0
  241. data/lib/kinetic_sdk/utils/logger.rb +70 -0
  242. data/lib/kinetic_sdk/utils/random.rb +30 -0
  243. data/lib/kinetic_sdk/version.rb +7 -0
  244. data/lib/kinetic_sdk.rb +57 -0
  245. metadata +414 -0
@@ -0,0 +1,552 @@
1
+ require 'base64'
2
+ require 'erb'
3
+ require 'mime/types'
4
+ require 'net/http'
5
+ require 'net/http/post/multipart'
6
+ require 'openssl'
7
+
8
+ require File.join(File.dirname(File.expand_path(__FILE__)), "kinetic-http-headers.rb")
9
+ require File.join(File.dirname(File.expand_path(__FILE__)), "kinetic-http-response.rb")
10
+
11
+ # The KineticSdk module contains functionality to interact with Kinetic Data applications
12
+ # using their built-in REST APIs.
13
+ module KineticSdk
14
+
15
+ # A utilities module that can be used by multiple libraries.
16
+ module Utils
17
+
18
+ # The KineticHttpUtils module provides common HTTP methods, and returns a
19
+ # {KineticSdk::Utils::KineticHttpResponse} object with all methods. The raw
20
+ # Net::HTTPResponse is available by calling the
21
+ # {KineticSdk::Utils::KineticHttpResponse#response} method.
22
+ module KineticHttpUtils
23
+
24
+ # Include the Logger module
25
+ include KineticSdk::Utils::Logger
26
+
27
+ # Send an HTTP DELETE request
28
+ #
29
+ # @param url [String] url to send the request to
30
+ # @param headers [Hash] hash of headers to send
31
+ # @param redirect_limit [Fixnum] max number of times to redirect
32
+ # @return [KineticSdk::Utils::KineticHttpResponse] response
33
+ def delete(url, headers={}, redirect_limit=max_redirects)
34
+ # parse the URL
35
+ uri = URI.parse(url)
36
+
37
+ debug("DELETE #{uri} #{headers.inspect}")
38
+
39
+ # build the http object
40
+ http = build_http(uri)
41
+ # build the request
42
+ request = Net::HTTP::Delete.new(uri.request_uri, headers)
43
+
44
+ # send the request
45
+ begin
46
+ response = http.request(request)
47
+ # handle the response
48
+ case response
49
+ when Net::HTTPRedirection then
50
+ if redirect_limit == -1
51
+ info("HTTP response code: #{response.code}") unless trace?
52
+ KineticHttpResponse.new(response)
53
+ elsif redirect_limit == 0
54
+ raise Net::HTTPFatalError.new("Too many redirects", response)
55
+ else
56
+ delete_raw(response['location'], headers, redirect_limit - 1)
57
+ end
58
+ when NilClass then
59
+ info("HTTP response code: 0") unless trace?
60
+ raise Net::HTTPFatalError.new("No response from server", response)
61
+ else
62
+ info("HTTP response code: #{response.code}") unless trace?
63
+ KineticHttpResponse.new(response)
64
+ end
65
+ rescue StandardError => e
66
+ info("HTTP response: #{response.inspect}") unless trace?
67
+ KineticHttpResponse.new(e)
68
+ end
69
+ end
70
+
71
+ # Send an HTTP GET request
72
+ #
73
+ # @param url [String] url to send the request to
74
+ # @param params [Hash] Query parameters that are added to the URL, such as +include+
75
+ # @param headers [Hash] hash of headers to send
76
+ # @param redirect_limit [Fixnum] max number of times to redirect
77
+ # @return [KineticSdk::Utils::KineticHttpResponse] response
78
+ def get(url, params={}, headers={}, redirect_limit=max_redirects)
79
+ # parse the URL
80
+ uri = URI.parse(url)
81
+ # add URL parameters
82
+ uri.query = URI.encode_www_form(params)
83
+
84
+ debug("GET #{uri} #{headers.inspect}")
85
+
86
+ # build the http object
87
+ http = build_http(uri)
88
+ # build the request
89
+ request = Net::HTTP::Get.new(uri.request_uri, headers)
90
+
91
+ # send the request
92
+ begin
93
+ response = http.request(request)
94
+ # handle the response
95
+ case response
96
+ when Net::HTTPRedirection then
97
+ if redirect_limit == -1
98
+ info("HTTP response code: #{response.code}") unless trace?
99
+ KineticHttpResponse.new(response)
100
+ elsif redirect_limit == 0
101
+ raise Net::HTTPFatalError.new("Too many redirects", response)
102
+ else
103
+ get_raw(response['location'], params, headers, redirect_limit - 1)
104
+ end
105
+ when NilClass then
106
+ info("HTTP response code: 0") unless trace?
107
+ raise Net::HTTPFatalError.new("No response from server", response)
108
+ else
109
+ info("HTTP response code: #{response.code}") unless trace?
110
+ KineticHttpResponse.new(response)
111
+ end
112
+ rescue StandardError => e
113
+ info("HTTP response: #{response.inspect}") unless trace?
114
+ KineticHttpResponse.new(e)
115
+ end
116
+ end
117
+
118
+ # Send an HTTP HEAD request
119
+ #
120
+ # @param url [String] url to send the request to
121
+ # @param params [Hash] Query parameters that are added to the URL, such as +include+
122
+ # @param headers [Hash] hash of headers to send
123
+ # @param redirect_limit [Fixnum] max number of times to redirect
124
+ # @return [KineticSdk::Utils::KineticHttpResponse] response
125
+ def head(url, params={}, headers={}, redirect_limit=max_redirects)
126
+ # parse the URL
127
+ uri = URI.parse(url)
128
+ # add URL parameters
129
+ uri.query = URI.encode_www_form(params)
130
+
131
+ debug("HEAD #{uri} #{headers.inspect}")
132
+
133
+ # build the http object
134
+ http = build_http(uri)
135
+ # build the request
136
+ request = Net::HTTP::Head.new(uri.request_uri, headers)
137
+
138
+ # send the request
139
+ begin
140
+ response = http.request(request)
141
+ # handle the response
142
+ case response
143
+ when Net::HTTPRedirection then
144
+ if redirect_limit == -1
145
+ info("HTTP response code: #{response.code}") unless trace?
146
+ KineticHttpResponse.new(response)
147
+ elsif redirect_limit == 0
148
+ raise Net::HTTPFatalError.new("Too many redirects", response)
149
+ else
150
+ head_raw(response['location'], params, headers, redirect_limit - 1)
151
+ end
152
+ when NilClass then
153
+ info("HTTP response code: 0") unless trace?
154
+ raise Net::HTTPFatalError.new("No response from server", response)
155
+ else
156
+ info("HTTP response code: #{response.code}") unless trace?
157
+ KineticHttpResponse.new(response)
158
+ end
159
+ rescue StandardError => e
160
+ info("HTTP response: #{response.inspect}") unless trace?
161
+ KineticHttpResponse.new(e)
162
+ end
163
+ end
164
+
165
+ # Send an HTTP PATCH request
166
+ #
167
+ # @param url [String] url to send the request to
168
+ # @param data [Hash] the payload to send with the request
169
+ # @param headers [Hash] hash of headers to send
170
+ # @param redirect_limit [Fixnum] max number of times to redirect
171
+ # @return [KineticSdk::Utils::KineticHttpResponse] response
172
+ def patch(url, data={}, headers={}, redirect_limit=max_redirects)
173
+ # parse the URL
174
+ uri = URI.parse(url)
175
+
176
+ debug("PATCH #{uri} #{headers.inspect}")
177
+
178
+ # unless the data is already a string, assume JSON and convert to string
179
+ data = data.to_json unless data.is_a? String
180
+ # build the http object
181
+ http = build_http(uri)
182
+ # build the request
183
+ request = Net::HTTP::Patch.new(uri.request_uri, headers)
184
+ request.body = data
185
+
186
+ # send the request
187
+ begin
188
+ response = http.request(request)
189
+ # handle the response
190
+ case response
191
+ when Net::HTTPRedirection then
192
+ if redirect_limit == -1
193
+ info("HTTP response code: #{response.code}") unless trace?
194
+ KineticHttpResponse.new(response)
195
+ elsif redirect_limit == 0
196
+ raise Net::HTTPFatalError.new("Too many redirects", response)
197
+ else
198
+ patch_raw(response['location'], data, headers, redirect_limit - 1)
199
+ end
200
+ when NilClass then
201
+ info("HTTP response code: 0") unless trace?
202
+ raise Net::HTTPFatalError.new("No response from server", response)
203
+ else
204
+ info("HTTP response code: #{response.code}") unless trace?
205
+ KineticHttpResponse.new(response)
206
+ end
207
+ rescue StandardError => e
208
+ info("HTTP response: #{response.inspect}") unless trace?
209
+ KineticHttpResponse.new(e)
210
+ end
211
+ end
212
+
213
+ # Send an HTTP POST request
214
+ #
215
+ # @param url [String] url to send the request to
216
+ # @param data [Hash] the payload to send with the request
217
+ # @param headers [Hash] hash of headers to send
218
+ # @param redirect_limit [Fixnum] max number of times to redirect
219
+ # @return [KineticSdk::Utils::KineticHttpResponse] response
220
+ def post(url, data={}, headers={}, redirect_limit=max_redirects)
221
+ # parse the URL
222
+ uri = URI.parse(url)
223
+
224
+ debug("POST #{uri} #{headers.inspect}")
225
+
226
+ # unless the data is already a string, assume JSON and convert to string
227
+ data = data.to_json unless data.is_a? String
228
+ # build the http object
229
+ http = build_http(uri)
230
+ # build the request
231
+ request = Net::HTTP::Post.new(uri.request_uri, headers)
232
+ request.body = data
233
+
234
+ # send the request
235
+ begin
236
+ response = http.request(request)
237
+ # handle the response
238
+ case response
239
+ when Net::HTTPRedirection then
240
+ if redirect_limit == -1
241
+ info("HTTP response code: #{response.code}") unless trace?
242
+ KineticHttpResponse.new(response)
243
+ elsif redirect_limit == 0
244
+ raise Net::HTTPFatalError.new("Too many redirects", response)
245
+ else
246
+ post_raw(response['location'], data, headers, redirect_limit - 1)
247
+ end
248
+ when NilClass then
249
+ info("HTTP response code: 0") unless trace?
250
+ raise Net::HTTPFatalError.new("No response from server", response)
251
+ else
252
+ info("HTTP response code: #{response.code}") unless trace?
253
+ KineticHttpResponse.new(response)
254
+ end
255
+ rescue StandardError => e
256
+ info("HTTP response: #{response.inspect}") unless trace?
257
+ KineticHttpResponse.new(e)
258
+ end
259
+ end
260
+
261
+ # Send a Multipart HTTP POST request
262
+ #
263
+ # @param url [String] url to send the request to
264
+ # @param data [Hash] payload to send with the request
265
+ # @param headers [Hash] hash of headers to send
266
+ # @param redirect_limit [Fixnum] max number of times to redirect
267
+ # @return [KineticSdk::Utils::KineticHttpResponse] response
268
+ def post_multipart(url, data={}, headers={}, redirect_limit=max_redirects)
269
+ # the Content-Type header is handled automoatically by Net::HTTP::Post::Multipart
270
+ headers.delete_if { |k,v| k.to_s.downcase == "content-type" }
271
+
272
+ debug("POST #{url} #{headers.inspect} multi-part form content")
273
+
274
+ # parse the URL
275
+ uri = URI.parse(url)
276
+
277
+ # prepare the payload
278
+ payload = data.inject({}) do |h,(k,v)|
279
+ if v.class == File
280
+ h[k] = UploadIO.new(v, mimetype(v), File.basename(v))
281
+ elsif v.class == Array
282
+ # f = v.first
283
+ # h[k] = UploadIO.new(f, mimetype(f), File.basename(f)) unless f.nil?
284
+ h[k] = v.inject([]) do |files, part|
285
+ if part.class == File
286
+ files << UploadIO.new(part, mimetype(part), File.basename(part))
287
+ end
288
+ end
289
+ else
290
+ h[k] = v
291
+ end
292
+ h
293
+ end
294
+
295
+ # build the http object
296
+ http = build_http(uri)
297
+ # build the request
298
+ request = Net::HTTP::Post::Multipart.new(uri.request_uri, payload)
299
+ headers.each { |k,v| request.add_field(k, v) }
300
+ # send the request
301
+ begin
302
+ response = http.request(request)
303
+ # handle the response
304
+ case response
305
+ when Net::HTTPRedirection then
306
+ if redirect_limit == -1
307
+ info("HTTP response code: #{response.code}") unless trace?
308
+ KineticHttpResponse.new(response)
309
+ elsif redirect_limit == 0
310
+ raise Net::HTTPFatalError.new("Too many redirects", response)
311
+ else
312
+ post_multipart_raw(response['location'], data, headers, redirect_limit - 1)
313
+ end
314
+ when NilClass then
315
+ info("HTTP response code: 0") unless trace?
316
+ raise Net::HTTPFatalError.new("No response from server", response)
317
+ else
318
+ info("HTTP response code: #{response.code}") unless trace?
319
+ KineticHttpResponse.new(response)
320
+ end
321
+ rescue StandardError => e
322
+ info("HTTP response: #{response.inspect}") unless trace?
323
+ KineticHttpResponse.new(e)
324
+ end
325
+ end
326
+
327
+ # Send an HTTP PUT request
328
+ #
329
+ # @param url [String] url to send the request to
330
+ # @param data [Hash] payload to send with the request
331
+ # @param headers [Hash] hash of headers to send
332
+ # @param redirect_limit [Fixnum] max number of times to redirect
333
+ # @return [KineticSdk::Utils::KineticHttpResponse] response
334
+ def put(url, data={}, headers={}, redirect_limit=max_redirects)
335
+ # parse the URL
336
+ uri = URI.parse(url)
337
+
338
+ debug("PUT #{uri} #{headers.inspect}")
339
+
340
+ # unless the data is already a string, assume JSON and convert to string
341
+ data = data.to_json unless data.is_a? String
342
+ # build the http object
343
+ http = build_http(uri)
344
+ # build the request
345
+ request = Net::HTTP::Put.new(uri.request_uri, headers)
346
+ request.body = data
347
+
348
+ # send the request
349
+ begin
350
+ response = http.request(request)
351
+ # handle the response
352
+ case response
353
+ when Net::HTTPRedirection then
354
+ if redirect_limit == -1
355
+ info("HTTP response code: #{response.code}") unless trace?
356
+ KineticHttpResponse.new(response)
357
+ elsif redirect_limit == 0
358
+ raise Net::HTTPFatalError.new("Too many redirects", response)
359
+ else
360
+ put_raw(response['location'], data, headers, redirect_limit - 1)
361
+ end
362
+ when NilClass then
363
+ info("HTTP response code: 0") unless trace?
364
+ raise Net::HTTPFatalError.new("No response from server", response)
365
+ else
366
+ info("HTTP response code: #{response.code}") unless trace?
367
+ KineticHttpResponse.new(response)
368
+ end
369
+ rescue StandardError => e
370
+ info("HTTP response: #{response.inspect}") unless trace?
371
+ KineticHttpResponse.new(e)
372
+ end
373
+ end
374
+
375
+ # Determine the final redirect location
376
+ #
377
+ # @param url [String] url to send the request to
378
+ # @param params [Hash] Query parameters that are added to the URL, such as +include+
379
+ # @param headers [Hash] hash of headers to send
380
+ # @param redirect_limit [Fixnum] max number of times to redirect
381
+ # @return [String] redirection url, or url if there is no redirection
382
+ def redirect_url(url, params={}, headers={}, redirect_limit=max_redirects)
383
+ # parse the URL
384
+ uri = URI.parse(url)
385
+ # add URL parameters
386
+ uri.query = URI.encode_www_form(params)
387
+
388
+ # build the http object
389
+ http = build_http(uri)
390
+ # build the request
391
+ request = Net::HTTP::Head.new(uri.request_uri, headers)
392
+
393
+ # send the request
394
+ response = http.request(request)
395
+ # handle the response
396
+ case response
397
+ when Net::HTTPRedirection then
398
+ if redirect_limit > 0
399
+ url = response['location']
400
+ head_raw(response['location'], params, headers, redirect_limit - 1)
401
+ end
402
+ end
403
+ url
404
+ end
405
+
406
+ # Download attachment from a URL and save to file.
407
+ #
408
+ # Streams the download to limit memory consumption. The user account
409
+ # utilizing the SDK must have write access to the file path.
410
+ #
411
+ # @param url [String] url to send the request to
412
+ # @param params [Hash] Query parameters that are added to the URL, such as +include+
413
+ # @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)
416
+ # Determine if redirection is involved
417
+ url = redirect_url(url, params, headers, max_redirects)
418
+ # parse the URL
419
+ uri = URI.parse(url)
420
+
421
+ debug("Streaming Download #{uri} #{headers.inspect}")
422
+
423
+ # build the http object
424
+ http = build_http(uri)
425
+
426
+ # stream the attachment
427
+ file = File.open(file_path, "wb")
428
+ file_name = File.basename(file_path)
429
+ response_code = nil
430
+ message = nil
431
+ begin
432
+ http.request_get(uri.request_uri, headers) do |response|
433
+ response_code = response.code
434
+ if response_code == "200"
435
+ response.read_body { |chunk| file.write(chunk) }
436
+ else
437
+ message = response.body
438
+ break
439
+ end
440
+ end
441
+ if response_code == "200"
442
+ info("Exported file attachment: #{file_name} to #{file_path}")
443
+ else
444
+ warn("Failed to export file attachment \"#{file_name}\": #{message}")
445
+ end
446
+ rescue StandardError => e
447
+ warn("Failed to export file attachment \"#{file_name}\": (#{e})")
448
+ ensure
449
+ file.close()
450
+ end
451
+ 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
+
463
+
464
+ # Encode URI components
465
+ #
466
+ # @param parameter [String] parameter value to encode
467
+ # @return [String] URL encoded parameter value
468
+ def encode(parameter)
469
+ ERB::Util.url_encode parameter
470
+ end
471
+
472
+ # Determines the mime-type of a file
473
+ #
474
+ # @param file [File | String] file or filename to detect
475
+ # @return [Array] MIME::Type of the file
476
+ def mimetype(file)
477
+ mime_type = MIME::Types.type_for(file.class == File ? File.basename(file) : file)
478
+ if mime_type.size == 0
479
+ mime_type = MIME::Types['text/plain']
480
+ end
481
+ mime_type
482
+ end
483
+
484
+ # The maximum number of times to follow redirects.
485
+ #
486
+ # Can be passed in as an option when initializing the SDK
487
+ # with either the @options[:max_redirects] or @options['max_redirects']
488
+ # key.
489
+ #
490
+ # Expects an integer [Fixnum] value. Setting to 0 will disable redirects.
491
+ #
492
+ # @return [Fixnum] default 5
493
+ def max_redirects
494
+ limit = @options &&
495
+ (
496
+ @options[:max_redirects] ||
497
+ @options['max_redirects']
498
+ )
499
+ limit.nil? ? 5 : limit.to_i
500
+ end
501
+
502
+ private
503
+
504
+ # Build the Net::HTTP object.
505
+ #
506
+ # @param uri [URI] the URI for the HTTP request
507
+ # @return [Net::HTTP]
508
+ def build_http(uri)
509
+ http = Net::HTTP.new(uri.host, uri.port)
510
+ http.set_debug_output($stdout) if trace?
511
+ if (uri.scheme == 'https')
512
+ http.use_ssl = true
513
+ if (@options[:ssl_verify_mode].to_s.strip.downcase == 'peer')
514
+ http.verify_mode = OpenSSL::SSL::VERIFY_PEER
515
+ http.ca_file = @options[:ssl_ca_file] if @options[:ssl_ca_file]
516
+ else
517
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
518
+ end
519
+ end
520
+ http.read_timeout=60
521
+ http.open_timeout=60
522
+ http
523
+ end
524
+
525
+ end
526
+
527
+
528
+ # The KineticHttp class provides functionality to make generic HTTP requests.
529
+ class KineticHttp
530
+
531
+ include KineticSdk::Utils::KineticHttpUtils
532
+
533
+ # The username used in the Basic Authentication header
534
+ attr_reader :username
535
+ # The password used in the Basic Authentication header
536
+ attr_reader :password
537
+
538
+ # Constructor
539
+ #
540
+ # @param username [String] username for Basic Authentication
541
+ # @param password [String] password for Basic Authentication
542
+ def initialize(username=nil, password=nil)
543
+ @username = username
544
+ @password = password
545
+ @options = {}
546
+ end
547
+
548
+ end
549
+
550
+
551
+ end
552
+ end
@@ -0,0 +1,70 @@
1
+ module KineticSdk
2
+ module Utils
3
+
4
+ # The Logger module provides methods to output at different levels based on
5
+ # a configuration property. The default log level is `off`, but can be
6
+ # turned on by passing in the `log_level` option.
7
+ #
8
+ # Available Levels: `trace`, `debug`, `info`, `off`
9
+ #
10
+ module Logger
11
+
12
+ # Logs the message if the log level is set to debug or lower.
13
+ #
14
+ # @param message [String] The message to log at debug level
15
+ def debug(message)
16
+ puts message if debug?
17
+ end
18
+
19
+ # Indicates if the log level is set to debug or lower.
20
+ #
21
+ # @return [Boolean] true if debug or trace, else false
22
+ def debug?
23
+ @options &&
24
+ (
25
+ @options[:log_level].to_s.downcase == "debug" ||
26
+ @options['log_level'].to_s.downcase == "debug" ||
27
+ trace?
28
+ )
29
+ end
30
+
31
+ # Logs the message if the log level is set to info or lower.
32
+ #
33
+ # @param message [String] The message to log at info level
34
+ def info(message)
35
+ puts message if info?
36
+ end
37
+
38
+ # Indicates if the log level is set to info or lower.
39
+ #
40
+ # @return [Boolean] true if info, debug or trace, else false
41
+ def info?
42
+ @options &&
43
+ (
44
+ @options[:log_level].to_s.downcase == "info" ||
45
+ @options['log_level'].to_s.downcase == "info" ||
46
+ debug?
47
+ )
48
+ end
49
+
50
+ # Logs the message if the log level is set to trace.
51
+ #
52
+ # @param message [String] The message to log at trace level
53
+ def trace(message)
54
+ puts message if trace?
55
+ end
56
+
57
+ # Indicates if the log level is set to trace.
58
+ #
59
+ # @return [Boolean] true if trace, else false
60
+ def trace?
61
+ @options &&
62
+ (
63
+ @options[:log_level].to_s.downcase == "trace" ||
64
+ @options['log_level'].to_s.downcase == "trace"
65
+ )
66
+ end
67
+
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,30 @@
1
+ module KineticSdk
2
+ module Utils
3
+
4
+ # The Random module provides methods to generate random secrets of varying
5
+ # complexity.
6
+ module Random
7
+
8
+ # Symbols that are allowed by default
9
+ DEFAULT_SYMBOLS = %w( ! @ % * ( ) { } [ ] )
10
+ # Symbols that are represented as 7-bit ASCII
11
+ SEVEN_BIT_ASCII_SYMBOLS = %w(! " # $ % & ' ( ) * + - . / : ; < = > ? @ [ \ ] & _ ` { | } ~)
12
+ # Alpha-numeric characters that are respresented as 7-bit ASCII
13
+ SEVEN_BIT_ASCII_ALPHANUM =
14
+ ('A'..'Z').to_a.concat(
15
+ ('a'..'z').to_a).concat(
16
+ ('0'..'9').to_a)
17
+
18
+ # Generates a simple secret based on ASCII alpha-numeric characters,
19
+ # and a few standard symbol characters.
20
+ #
21
+ # @param size [Fixnum] The length of the generated secret
22
+ # @param allowed_symbols [Array] symbols to allow
23
+ def self.simple(size = 20, allowed_symbols = DEFAULT_SYMBOLS)
24
+ chars = (allowed_symbols || Array.new).concat(SEVEN_BIT_ASCII_ALPHANUM)
25
+ (0...size).map { chars[rand(chars.size)] }.join
26
+ end
27
+
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,7 @@
1
+ module KineticSdk
2
+
3
+ # Version of Kinetic SDK
4
+ #
5
+ # @return [String] Version of the SDK
6
+ VERSION = "0.1.1"
7
+ end