azure 0.1.1 → 0.5.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 (341) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +6 -0
  3. data/ChangeLog.txt +5 -0
  4. data/Gemfile +16 -3
  5. data/README.md +344 -2
  6. data/Rakefile +66 -37
  7. data/azure.gemspec +30 -11
  8. data/lib/azure.rb +35 -4
  9. data/lib/azure/blob/blob.rb +32 -0
  10. data/lib/azure/blob/blob_service.rb +1423 -0
  11. data/lib/azure/blob/block.rb +31 -0
  12. data/lib/azure/blob/container.rb +32 -0
  13. data/lib/azure/blob/serialization.rb +285 -0
  14. data/lib/azure/core.rb +32 -0
  15. data/lib/azure/core/auth/authorizer.rb +36 -0
  16. data/lib/azure/core/auth/shared_key.rb +21 -6
  17. data/lib/azure/core/auth/shared_key_lite.rb +17 -3
  18. data/lib/azure/core/auth/signer.rb +48 -0
  19. data/lib/azure/core/configuration.rb +152 -0
  20. data/lib/azure/core/error.rb +22 -0
  21. data/lib/azure/core/filtered_service.rb +44 -0
  22. data/lib/azure/core/http/debug_filter.rb +36 -0
  23. data/lib/azure/core/http/http_error.rb +84 -0
  24. data/lib/azure/core/http/http_filter.rb +53 -0
  25. data/lib/azure/core/http/http_request.rb +157 -0
  26. data/lib/azure/core/http/http_response.rb +133 -0
  27. data/lib/azure/core/http/retry_policy.rb +68 -0
  28. data/lib/azure/core/http/signer_filter.rb +34 -0
  29. data/lib/azure/core/service.rb +38 -32
  30. data/lib/azure/core/signed_service.rb +43 -0
  31. data/lib/azure/queue/message.rb +30 -0
  32. data/lib/azure/queue/queue.rb +29 -0
  33. data/lib/azure/queue/queue_service.rb +568 -0
  34. data/lib/azure/queue/serialization.rb +103 -0
  35. data/lib/azure/service/access_policy.rb +26 -0
  36. data/lib/azure/service/enumeration_results.rb +21 -0
  37. data/lib/azure/service/logging.rb +32 -0
  38. data/lib/azure/service/metrics.rb +31 -0
  39. data/lib/azure/service/retention_policy.rb +25 -0
  40. data/lib/azure/service/serialization.rb +240 -0
  41. data/lib/azure/service/signed_identifier.rb +30 -0
  42. data/lib/azure/service/storage_service.rb +79 -0
  43. data/lib/azure/service/storage_service_properties.rb +32 -0
  44. data/lib/azure/service_bus/action.rb +21 -0
  45. data/lib/azure/service_bus/auth/wrap_service.rb +59 -46
  46. data/lib/azure/service_bus/auth/wrap_signer.rb +69 -0
  47. data/lib/azure/service_bus/brokered_message.rb +36 -51
  48. data/lib/azure/service_bus/brokered_message_serializer.rb +48 -34
  49. data/lib/azure/service_bus/correlation_filter.rb +45 -0
  50. data/lib/azure/service_bus/empty_rule_action.rb +30 -0
  51. data/lib/azure/service_bus/false_filter.rb +38 -0
  52. data/lib/azure/service_bus/filter.rb +21 -0
  53. data/lib/azure/{core/utils → service_bus}/interval.rb +29 -22
  54. data/lib/azure/service_bus/queue.rb +230 -0
  55. data/lib/azure/service_bus/resource.rb +109 -0
  56. data/lib/azure/service_bus/rule.rb +98 -0
  57. data/lib/azure/service_bus/rule_aspect.rb +34 -0
  58. data/lib/azure/service_bus/serialization.rb +160 -0
  59. data/lib/azure/service_bus/service_bus_service.rb +819 -12
  60. data/lib/azure/service_bus/sql_filter.rb +50 -0
  61. data/lib/azure/service_bus/sql_rule_action.rb +50 -0
  62. data/lib/azure/service_bus/subscription.rb +184 -0
  63. data/lib/azure/service_bus/topic.rb +187 -0
  64. data/lib/azure/service_bus/true_filter.rb +38 -0
  65. data/lib/azure/{tables → table}/auth/shared_key.rb +33 -12
  66. data/lib/azure/table/auth/shared_key_lite.rb +44 -0
  67. data/lib/azure/table/batch.rb +330 -0
  68. data/lib/azure/table/batch_response.rb +117 -0
  69. data/lib/azure/table/edmtype.rb +127 -0
  70. data/lib/azure/table/entity.rb +31 -0
  71. data/lib/azure/table/guid.rb +24 -0
  72. data/lib/azure/table/query.rb +112 -0
  73. data/lib/azure/table/serialization.rb +105 -0
  74. data/lib/azure/table/table_service.rb +557 -0
  75. data/lib/azure/version.rb +31 -0
  76. data/test/fixtures/container_acl.xml +11 -0
  77. data/test/fixtures/{error.xml → http_error.xml} +0 -0
  78. data/test/fixtures/list_blobs.xml +121 -0
  79. data/test/fixtures/list_block_all_with_none_committed.xml +22 -0
  80. data/test/fixtures/list_blocks_all.xml +23 -0
  81. data/test/fixtures/list_blocks_committed.xml +13 -0
  82. data/test/fixtures/list_containers.xml +38 -0
  83. data/test/fixtures/list_page_ranges.xml +11 -0
  84. data/test/fixtures/logging.xml +11 -0
  85. data/test/fixtures/metrics.xml +10 -0
  86. data/test/fixtures/queues.xml +1 -1
  87. data/test/fixtures/retention_policy.xml +5 -0
  88. data/test/fixtures/storage_service_properties.xml +23 -0
  89. data/test/integration/blob/blob_metadata_test.rb +75 -0
  90. data/test/integration/blob/blob_pages_test.rb +119 -0
  91. data/test/integration/blob/blob_properties_test.rb +77 -0
  92. data/test/integration/blob/block_blob_test.rb +254 -0
  93. data/test/integration/blob/container/container_acl_test.rb +69 -0
  94. data/test/integration/blob/container/container_metadata_test.rb +50 -0
  95. data/test/integration/blob/container/create_container_test.rb +60 -0
  96. data/test/integration/blob/container/delete_container_test.rb +39 -0
  97. data/test/integration/blob/container/get_container_properties_test.rb +48 -0
  98. data/test/integration/blob/container/list_containers_test.rb +79 -0
  99. data/test/integration/blob/container/root_container_test.rb +50 -0
  100. data/test/integration/blob/copy_blob_test.rb +113 -0
  101. data/test/integration/blob/create_blob_snapshot_test.rb +80 -0
  102. data/test/integration/blob/create_page_blob_test.rb +83 -0
  103. data/test/integration/blob/delete_blob_test.rb +159 -0
  104. data/test/integration/blob/get_blob_test.rb +65 -0
  105. data/test/integration/blob/informative_errors_test.rb +39 -0
  106. data/test/integration/blob/lease/acquire_lease_test.rb +36 -0
  107. data/test/integration/blob/lease/break_lease_test.rb +40 -0
  108. data/test/integration/blob/lease/release_lease_test.rb +40 -0
  109. data/test/integration/blob/lease/renew_lease_test.rb +42 -0
  110. data/test/integration/blob/list_blobs_test.rb +113 -0
  111. data/test/integration/queue/clear_messages_test.rb +42 -0
  112. data/test/integration/queue/create_message_test.rb +75 -0
  113. data/test/integration/queue/create_queue_test.rb +50 -0
  114. data/test/integration/queue/delete_message_test.rb +67 -0
  115. data/test/integration/queue/delete_queue_test.rb +45 -0
  116. data/test/integration/queue/informative_errors_test.rb +42 -0
  117. data/test/integration/queue/list_messages_encoded_test.rb +79 -0
  118. data/test/integration/queue/list_messages_test.rb +79 -0
  119. data/test/integration/queue/list_queues_test.rb +44 -0
  120. data/test/integration/queue/peek_messages_test.rb +59 -0
  121. data/test/integration/queue/queue_metadata_test.rb +40 -0
  122. data/test/integration/queue/update_message_test.rb +74 -0
  123. data/test/integration/service_bus/informative_errors_test.rb +37 -0
  124. data/test/integration/service_bus/queues_scenario_test.rb +200 -0
  125. data/test/integration/service_bus/queues_test.rb +266 -0
  126. data/test/integration/service_bus/rules_test.rb +145 -0
  127. data/test/integration/service_bus/scenario_test.rb +102 -0
  128. data/test/integration/service_bus/subscriptions_test.rb +211 -0
  129. data/test/integration/service_bus/topics_scenario_test.rb +406 -0
  130. data/test/integration/service_bus/topics_test.rb +129 -0
  131. data/test/integration/table/create_table_test.rb +36 -0
  132. data/test/integration/table/delete_entity_batch_test.rb +107 -0
  133. data/test/integration/table/delete_entity_test.rb +94 -0
  134. data/test/integration/table/delete_table_test.rb +40 -0
  135. data/test/integration/table/get_table_test.rb +37 -0
  136. data/test/integration/table/informative_errors_test.rb +39 -0
  137. data/test/integration/table/insert_entity_batch_test.rb +100 -0
  138. data/test/integration/table/insert_entity_test.rb +88 -0
  139. data/test/integration/table/insert_or_merge_entity_batch_test.rb +159 -0
  140. data/test/integration/table/insert_or_merge_entity_test.rb +143 -0
  141. data/test/integration/table/insert_or_replace_entity_batch_test.rb +152 -0
  142. data/test/integration/table/insert_or_replace_entity_test.rb +137 -0
  143. data/test/integration/table/merge_entity_batch_test.rb +128 -0
  144. data/test/integration/table/merge_entity_test.rb +113 -0
  145. data/test/integration/table/query_entities_test.rb +195 -0
  146. data/test/integration/table/query_tables_test.rb +43 -0
  147. data/test/integration/table/query_test.rb +251 -0
  148. data/test/integration/table/table_acl_test.rb +52 -0
  149. data/test/integration/table/update_entity_batch_test.rb +149 -0
  150. data/test/integration/table/update_entity_test.rb +131 -0
  151. data/test/integration/test_helper.rb +23 -9
  152. data/test/support/env.rb +15 -1
  153. data/test/support/fixtures.rb +14 -0
  154. data/test/support/name_generator.rb +74 -0
  155. data/test/support/stubs.rb +14 -0
  156. data/test/test_helper.rb +43 -3
  157. data/test/unit/blob/blob_service_test.rb +1947 -0
  158. data/test/unit/core/auth/shared_key_lite_test.rb +51 -0
  159. data/test/unit/core/auth/shared_key_test.rb +58 -0
  160. data/test/unit/core/auth/signer_test.rb +30 -0
  161. data/test/unit/core/http/http_error_test.rb +57 -0
  162. data/test/unit/core/http/http_request_test.rb +66 -0
  163. data/test/unit/core/http/http_response_test.rb +45 -0
  164. data/test/unit/service/serialization_test.rb +502 -0
  165. data/test/unit/service/storage_service_test.rb +291 -0
  166. data/test/unit/table/edmtype_test.rb +108 -0
  167. metadata +231 -230
  168. data/Gemfile.lock +0 -36
  169. data/lib/azure/atom.rb +0 -170
  170. data/lib/azure/auth.rb +0 -29
  171. data/lib/azure/blobs.rb +0 -620
  172. data/lib/azure/blobs/blob.rb +0 -360
  173. data/lib/azure/blobs/container.rb +0 -209
  174. data/lib/azure/blobs/service.rb +0 -396
  175. data/lib/azure/blobs/shared_access_signature.rb +0 -84
  176. data/lib/azure/blobs/uri.rb +0 -60
  177. data/lib/azure/configuration.rb +0 -121
  178. data/lib/azure/core/collection.rb +0 -118
  179. data/lib/azure/core/signer.rb +0 -32
  180. data/lib/azure/core/utils/queryable.rb +0 -74
  181. data/lib/azure/core/utils/storage_service_properties.rb +0 -83
  182. data/lib/azure/core/utils/string.rb +0 -59
  183. data/lib/azure/error.rb +0 -72
  184. data/lib/azure/queues.rb +0 -272
  185. data/lib/azure/queues/message.rb +0 -174
  186. data/lib/azure/queues/queue.rb +0 -187
  187. data/lib/azure/queues/service.rb +0 -263
  188. data/lib/azure/queues/service_properties.rb +0 -152
  189. data/lib/azure/queues/uri.rb +0 -78
  190. data/lib/azure/request.rb +0 -102
  191. data/lib/azure/response.rb +0 -93
  192. data/lib/azure/service_bus.rb +0 -4
  193. data/lib/azure/service_bus/auth/authorizer.rb +0 -22
  194. data/lib/azure/service_bus/auth/uri.rb +0 -52
  195. data/lib/azure/service_bus/auth/wrap.rb +0 -37
  196. data/lib/azure/service_bus/auth/wrap_token.rb +0 -45
  197. data/lib/azure/service_bus/auth/wrap_token_manager.rb +0 -46
  198. data/lib/azure/service_bus/queues.rb +0 -194
  199. data/lib/azure/service_bus/queues/queue.rb +0 -100
  200. data/lib/azure/service_bus/queues/queue_serializer.rb +0 -51
  201. data/lib/azure/service_bus/queues/service.rb +0 -154
  202. data/lib/azure/service_bus/queues/uri.rb +0 -80
  203. data/lib/azure/service_bus/rules.rb +0 -110
  204. data/lib/azure/service_bus/rules/rule.rb +0 -97
  205. data/lib/azure/service_bus/rules/service.rb +0 -122
  206. data/lib/azure/service_bus/rules/uri.rb +0 -39
  207. data/lib/azure/service_bus/subscriptions.rb +0 -170
  208. data/lib/azure/service_bus/subscriptions/service.rb +0 -133
  209. data/lib/azure/service_bus/subscriptions/subscription.rb +0 -164
  210. data/lib/azure/service_bus/subscriptions/subscription_serializer.rb +0 -74
  211. data/lib/azure/service_bus/subscriptions/uri.rb +0 -71
  212. data/lib/azure/service_bus/topics.rb +0 -120
  213. data/lib/azure/service_bus/topics/service.rb +0 -98
  214. data/lib/azure/service_bus/topics/topic.rb +0 -122
  215. data/lib/azure/service_bus/topics/topic_serializer.rb +0 -44
  216. data/lib/azure/service_bus/topics/uri.rb +0 -58
  217. data/lib/azure/service_runtime/client/goal_state_pipe_monitor.rb +0 -21
  218. data/lib/azure/service_runtime/client/goal_state_protocol.rb +0 -18
  219. data/lib/azure/service_runtime/client/runtime_client.rb +0 -135
  220. data/lib/azure/service_runtime/deployment.rb +0 -24
  221. data/lib/azure/service_runtime/local_resource.rb +0 -15
  222. data/lib/azure/service_runtime/role.rb +0 -17
  223. data/lib/azure/service_runtime/role_environment.rb +0 -206
  224. data/lib/azure/service_runtime/role_environment_change.rb +0 -32
  225. data/lib/azure/service_runtime/role_instance.rb +0 -35
  226. data/lib/azure/service_runtime/role_instance_endpoint.rb +0 -14
  227. data/lib/azure/tables.rb +0 -215
  228. data/lib/azure/tables/auth/shared_key_lite.rb +0 -30
  229. data/lib/azure/tables/entities_collection.rb +0 -66
  230. data/lib/azure/tables/entity.rb +0 -127
  231. data/lib/azure/tables/service.rb +0 -211
  232. data/lib/azure/tables/table.rb +0 -129
  233. data/lib/azure/tables/tables_collection.rb +0 -62
  234. data/lib/azure/tables/types.rb +0 -65
  235. data/lib/azure/tables/uri.rb +0 -62
  236. data/test/integration/blobs/auth_test.rb +0 -19
  237. data/test/integration/blobs/blob_test.rb +0 -61
  238. data/test/integration/blobs/clear_page_range_test.rb +0 -19
  239. data/test/integration/blobs/copy_test.rb +0 -33
  240. data/test/integration/blobs/create_blobs_test.rb +0 -51
  241. data/test/integration/blobs/create_container_test.rb +0 -13
  242. data/test/integration/blobs/create_snapshot_test.rb +0 -17
  243. data/test/integration/blobs/delete_blob_snapshots_test.rb +0 -19
  244. data/test/integration/blobs/delete_blobs_test.rb +0 -25
  245. data/test/integration/blobs/delete_container_test.rb +0 -24
  246. data/test/integration/blobs/delete_snapshot_test.rb +0 -17
  247. data/test/integration/blobs/get_blob_snapshot_test.rb +0 -18
  248. data/test/integration/blobs/get_blobs_test.rb +0 -31
  249. data/test/integration/blobs/get_page_range_test.rb +0 -19
  250. data/test/integration/blobs/list_blobs_test.rb +0 -39
  251. data/test/integration/blobs/list_containers_test.rb +0 -28
  252. data/test/integration/blobs/manage_blob_leases_test.rb +0 -45
  253. data/test/integration/blobs/manage_blob_metadata_test.rb +0 -51
  254. data/test/integration/blobs/manage_blob_properties_test.rb +0 -25
  255. data/test/integration/blobs/manage_blob_service_properties_test.rb +0 -38
  256. data/test/integration/blobs/manage_container_metadata_test.rb +0 -46
  257. data/test/integration/blobs/manage_container_permissions_test.rb +0 -17
  258. data/test/integration/blobs/update_page_range_test.rb +0 -20
  259. data/test/integration/queues/clear_messages_test.rb +0 -22
  260. data/test/integration/queues/create_queue_test.rb +0 -13
  261. data/test/integration/queues/delete_message_test.rb +0 -42
  262. data/test/integration/queues/delete_queue_test.rb +0 -24
  263. data/test/integration/queues/get_messages_test.rb +0 -39
  264. data/test/integration/queues/list_queues_test.rb +0 -43
  265. data/test/integration/queues/manage_queue_metadata_test.rb +0 -45
  266. data/test/integration/queues/manage_queue_service_properties_test.rb +0 -27
  267. data/test/integration/queues/peek_messages_test.rb +0 -55
  268. data/test/integration/queues/put_message_test.rb +0 -31
  269. data/test/integration/queues/update_message_test.rb +0 -46
  270. data/test/integration/service_bus/auth_test.rb +0 -18
  271. data/test/integration/service_bus/queues/create_queue_test.rb +0 -25
  272. data/test/integration/service_bus/queues/delete_message_from_queue_test.rb +0 -29
  273. data/test/integration/service_bus/queues/delete_queue_test.rb +0 -25
  274. data/test/integration/service_bus/queues/get_queue_test.rb +0 -23
  275. data/test/integration/service_bus/queues/list_queues_test.rb +0 -39
  276. data/test/integration/service_bus/queues/peek_message_from_queue_test.rb +0 -34
  277. data/test/integration/service_bus/queues/read_and_delete_message_from_queue_test.rb +0 -31
  278. data/test/integration/service_bus/queues/send_message_to_queue_test.rb +0 -22
  279. data/test/integration/service_bus/queues/unlock_message_from_queue_test.rb +0 -36
  280. data/test/integration/service_bus/rules/create_rule_test.rb +0 -19
  281. data/test/integration/service_bus/rules/delete_rule_test.rb +0 -17
  282. data/test/integration/service_bus/rules/get_rule_test.rb +0 -21
  283. data/test/integration/service_bus/rules/list_rules_test.rb +0 -24
  284. data/test/integration/service_bus/rules/rule_test.rb +0 -16
  285. data/test/integration/service_bus/subscriptions/create_subscription_test.rb +0 -25
  286. data/test/integration/service_bus/subscriptions/delete_message_from_subscription_test.rb +0 -31
  287. data/test/integration/service_bus/subscriptions/delete_subscription_test.rb +0 -30
  288. data/test/integration/service_bus/subscriptions/fetch_subscription_test.rb +0 -28
  289. data/test/integration/service_bus/subscriptions/list_subscriptions_test.rb +0 -23
  290. data/test/integration/service_bus/subscriptions/peek_lock_message_from_subscription_test.rb +0 -42
  291. data/test/integration/service_bus/subscriptions/read_delete_message_from_subscription_test.rb +0 -36
  292. data/test/integration/service_bus/subscriptions/subscription_test.rb +0 -31
  293. data/test/integration/service_bus/subscriptions/unlock_message_from_subscription_test.rb +0 -43
  294. data/test/integration/service_bus/topics/create_topic_test.rb +0 -25
  295. data/test/integration/service_bus/topics/delete_topic_test.rb +0 -25
  296. data/test/integration/service_bus/topics/get_topic_test.rb +0 -23
  297. data/test/integration/service_bus/topics/list_topics_test.rb +0 -39
  298. data/test/integration/service_bus/topics/send_message_to_topic_test.rb +0 -23
  299. data/test/integration/tables/auth_test.rb +0 -29
  300. data/test/integration/tables/creating_tables_test.rb +0 -16
  301. data/test/integration/tables/delete_entity_test.rb +0 -39
  302. data/test/integration/tables/deleting_table_test.rb +0 -22
  303. data/test/integration/tables/insert_entity_test.rb +0 -23
  304. data/test/integration/tables/merge_entity_test.rb +0 -28
  305. data/test/integration/tables/query_entities_test.rb +0 -131
  306. data/test/integration/tables/query_tables_test.rb +0 -63
  307. data/test/integration/tables/update_entity_test.rb +0 -54
  308. data/test/support/blobs.rb +0 -12
  309. data/test/support/table_names.rb +0 -44
  310. data/test/unit/atom_test.rb +0 -58
  311. data/test/unit/auth_test.rb +0 -24
  312. data/test/unit/blobs/blob_test.rb +0 -5
  313. data/test/unit/blobs/container_test.rb +0 -67
  314. data/test/unit/blobs/service_test.rb +0 -17
  315. data/test/unit/blobs/shared_access_signature_test.rb +0 -66
  316. data/test/unit/blobs_test.rb +0 -156
  317. data/test/unit/core/service_test.rb +0 -57
  318. data/test/unit/core/utils/interval_test.rb +0 -70
  319. data/test/unit/core/utils/queryable_test.rb +0 -69
  320. data/test/unit/core/utils/storage_service_properties_test.rb +0 -66
  321. data/test/unit/error_test.rb +0 -39
  322. data/test/unit/queues/message_test.rb +0 -40
  323. data/test/unit/queues/queue_test.rb +0 -64
  324. data/test/unit/queues/service_properties.rb +0 -35
  325. data/test/unit/request_test.rb +0 -38
  326. data/test/unit/response_test.rb +0 -43
  327. data/test/unit/service_bus/auth/authorizer_test.rb +0 -27
  328. data/test/unit/service_bus/auth/wrap_token_test.rb +0 -28
  329. data/test/unit/service_bus/queues/queue_test.rb +0 -38
  330. data/test/unit/service_bus/topics/topic_test.rb +0 -33
  331. data/test/unit/service_runtime/data/goalstate.xml +0 -9
  332. data/test/unit/service_runtime/data/roleenvironmentdata.xml +0 -29
  333. data/test/unit/service_runtime/data/runtime.xml +0 -6
  334. data/test/unit/service_runtime/role_environment_test.rb +0 -144
  335. data/test/unit/tables/auth/shared_key_lite_test.rb +0 -39
  336. data/test/unit/tables/auth/shared_key_test.rb +0 -45
  337. data/test/unit/tables/entities_collection_test.rb +0 -39
  338. data/test/unit/tables/entity_test.rb +0 -72
  339. data/test/unit/tables/table_test.rb +0 -57
  340. data/test/unit/tables_test.rb +0 -302
  341. data/test/unit/types_test.rb +0 -67
@@ -0,0 +1,157 @@
1
+ #-------------------------------------------------------------------------
2
+ # Copyright (c) Microsoft. All rights reserved.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #--------------------------------------------------------------------------
15
+ require "digest/md5"
16
+ require "base64"
17
+ require "net/http"
18
+ require "time"
19
+
20
+ require "azure/version"
21
+ require "azure/core/http/http_response"
22
+
23
+ module Azure
24
+ module Core
25
+ module Http
26
+ # Represents a HTTP request can perform synchronous queries to a
27
+ # HTTP server, returning a HttpResponse
28
+ class HttpRequest
29
+
30
+ alias_method :_method, :method
31
+
32
+ # The HTTP method to use (:get, :post, :put, :delete, etc...)
33
+ attr_accessor :method
34
+
35
+ # The URI of the HTTP endpoint to query
36
+ attr_accessor :uri
37
+
38
+ # The header values as a Hash
39
+ attr_accessor :headers
40
+
41
+ # The body of the request (IO or String)
42
+ attr_accessor :body
43
+
44
+ # Public: Create the HttpRequest
45
+ #
46
+ # method - Symbol. The HTTP method to use (:get, :post, :put, :del, etc...)
47
+ # uri - URI. The URI of the HTTP endpoint to query
48
+ # body - IO or String. The request body (optional)
49
+ # current_time - String. The current time as a HTTP date string
50
+ def initialize(method, uri, body=nil, current_time=Time.now.httpdate)
51
+ @method = method
52
+ @uri = uri
53
+ @body = body
54
+ @headers = {}
55
+
56
+ default_headers current_time
57
+ end
58
+
59
+ # Public: Applies a HttpFilter to the HTTP Pipeline
60
+ #
61
+ # filter - Any object that responds to .call(req, _next) and
62
+ # returns a HttpResponse eg. HttpFilter, Proc,
63
+ # lambda, etc. (optional)
64
+ #
65
+ # &block - An inline block may be used instead of a filter
66
+ #
67
+ # example:
68
+ #
69
+ # request.with_filter do |req, _next|
70
+ # _next.call
71
+ # end
72
+ #
73
+ # NOTE:
74
+ #
75
+ # The code block provided must call _next or the filter pipeline
76
+ # will not complete and the HTTP request will never execute
77
+ #
78
+ def with_filter(filter=nil, &block)
79
+ filter = filter || block
80
+ if filter
81
+ old_impl = self._method(:call)
82
+
83
+ # support 1.8.7 (define_singleton_method doesn't exist until 1.9.1)
84
+ new_impl = Proc.new do filter.call(self, old_impl) end
85
+ k = class << self; self; end
86
+ if k.method_defined? :define_singleton_method
87
+ self.define_singleton_method(:call, new_impl)
88
+ else
89
+ k.send(:define_method, :call, new_impl)
90
+ end
91
+ end
92
+ end
93
+
94
+ # Build a default headers Hash
95
+ def default_headers(current_time)
96
+ headers["User-Agent"] = "Azure-SDK-for-Ruby/" + Azure::Version.to_s
97
+ headers["x-ms-date"] = current_time
98
+ headers["x-ms-version"] = "2012-02-12"
99
+ headers["DataServiceVersion"] = "1.0;NetFx"
100
+ headers["MaxDataServiceVersion"] = "2.0;NetFx"
101
+
102
+ if body
103
+ headers["Content-Type"] = "application/atom+xml; charset=utf-8"
104
+ headers["Content-Length"] = body.bytesize.to_s
105
+ headers["Content-MD5"] = Base64.strict_encode64(Digest::MD5.digest(body))
106
+ else
107
+ headers["Content-Length"] = "0"
108
+ headers["Content-Type"] = ""
109
+ end
110
+ end
111
+
112
+ # Obtain the Net::HTTP class that will handle this request
113
+ #
114
+ # Returns a subclass of Net::HTTPRequest
115
+ def http_request_class
116
+ Net::HTTP.const_get(method.to_s.capitalize)
117
+ rescue NameError => e
118
+ e.message = "#{method} is an invalid HTTP method"
119
+ raise
120
+ end
121
+
122
+
123
+ # Public: Sends request to HTTP server and returns a HttpResponse
124
+ #
125
+ # Returns a HttpResponse
126
+ def call
127
+ request = http_request_class.new(uri.request_uri, headers)
128
+ request.body = body if body
129
+
130
+ http = nil
131
+ if ENV['HTTP_PROXY'] || ENV['HTTPS_PROXY']
132
+ if ENV['HTTP_PROXY']
133
+ proxy_uri = URI::parse(ENV['HTTP_PROXY'])
134
+ else
135
+ proxy_uri = URI::parse(ENV['HTTPS_PROXY'])
136
+ end
137
+
138
+ http = Net::HTTP::Proxy(proxy_uri.host, proxy_uri.port).new(uri.host, uri.port)
139
+ else
140
+ http = Net::HTTP.new(uri.host, uri.port)
141
+ end
142
+
143
+ if uri.scheme.downcase == 'https'
144
+ # require 'net/https'
145
+ http.use_ssl = true
146
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
147
+ end
148
+
149
+ response = HttpResponse.new(http.request(request))
150
+ response.uri = uri
151
+ raise response.error unless response.success?
152
+ response
153
+ end
154
+ end
155
+ end
156
+ end
157
+ end
@@ -0,0 +1,133 @@
1
+ #-------------------------------------------------------------------------
2
+ # Copyright (c) Microsoft. All rights reserved.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #--------------------------------------------------------------------------
15
+ require "azure/core/http/http_error"
16
+
17
+ module Azure
18
+ module Core
19
+ module Http
20
+ # A small proxy to clean up the API of Net::HTTPResponse.
21
+ class HttpResponse
22
+
23
+ # Public: Initialize a new response.
24
+ #
25
+ # http_response - A Net::HTTPResponse.
26
+ def initialize(http_response, uri="")
27
+ @http_response = http_response
28
+ @uri = uri
29
+ end
30
+
31
+ attr_accessor :uri
32
+
33
+ # Public: Get the response body.
34
+ #
35
+ # Returns a String.
36
+ def body
37
+ @http_response.body
38
+ end
39
+
40
+ # Public: Get the response status code.
41
+ #
42
+ # Returns a Fixnum.
43
+ def status_code
44
+ @http_response.code.to_i
45
+ end
46
+
47
+ # Public: Check if this response was successful. A request is considered
48
+ # successful if the response is in the 200 - 399 range.
49
+ #
50
+ # Returns nil|false.
51
+ def success?
52
+ (200..399).include? status_code
53
+ end
54
+
55
+ # Public: Get all the response headers as a Hash.
56
+ #
57
+ # Returns a Hash.
58
+ def headers
59
+ @headers ||= HeaderHash.new(@http_response.to_hash)
60
+ end
61
+
62
+ # Public: Get an error that wraps this HTTP response, as long as this
63
+ # response was unsuccessful. This method will return nil if the
64
+ # response was successful.
65
+ #
66
+ # Returns an Azure::Core::Http::HTTPError.
67
+ def exception
68
+ HTTPError.new(self) unless success?
69
+ end
70
+
71
+ alias_method :error, :exception
72
+
73
+ # Since HTTP Headers are case insensitive, this class will
74
+ # normalize them to lowercase. This also wraps Net::HTTPResponse
75
+ # headers by returning their values as strings, not arrays, by selecting
76
+ # the first value from the array.
77
+ class HeaderHash < Hash
78
+ # Public: Initialize the header hash.
79
+ #
80
+ # headers - A Hash of headers as returned from Net::HTTPResponse#to_hash.
81
+ def initialize(headers)
82
+ super
83
+ headers = Hash[headers.map { |k,v| [k.downcase.freeze, v.first.freeze] }]
84
+ replace(headers)
85
+ end
86
+
87
+ # Public: Get a header's value or nil if it's not present.
88
+ #
89
+ # header - A string with the header's name.
90
+ #
91
+ # Returns a String or nil.
92
+ def [](header)
93
+ super(header.downcase)
94
+ end
95
+
96
+ # Public: Get a header's value or a specified default.
97
+ #
98
+ # header - A string with the header's name.
99
+ # default - A default value.
100
+ #
101
+ # Yields a block where you can specify the default value.
102
+ #
103
+ # Returns a String, or the specified default.
104
+ def fetch(header, *default, &block)
105
+ if (args = default.size) > 1
106
+ raise ArgumentError, "wrong number of arguments(#{args + 1} for 2)"
107
+ end
108
+
109
+ super(header.downcase, *default, &block)
110
+ end
111
+ end
112
+
113
+ class MockResponse
114
+ def initialize(code, body, headers)
115
+ @code = code.to_s
116
+ @body = body
117
+ @headers = headers
118
+ @headers.each { |k,v|
119
+ @headers[k] = [v] unless v.respond_to? first
120
+ }
121
+ end
122
+ attr_accessor :code
123
+ attr_accessor :body
124
+ attr_accessor :headers
125
+
126
+ def to_hash
127
+ @headers
128
+ end
129
+ end
130
+ end
131
+ end
132
+ end
133
+ end
@@ -0,0 +1,68 @@
1
+ #-------------------------------------------------------------------------
2
+ # Copyright (c) Microsoft. All rights reserved.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #--------------------------------------------------------------------------
15
+ require "/azure/core/http/http_filter"
16
+
17
+ module Azure
18
+ module Core
19
+ module Http
20
+
21
+ # A HttpFilter implementation that handles retrying based on a
22
+ # specific policy when HTTP layer errors occur
23
+ class RetryPolicy < HttpFilter
24
+
25
+ def initialize(&block)
26
+ @block = block
27
+ end
28
+
29
+ attr_accessor :retry_data
30
+
31
+ # Overrides the base class implementation of call to implement
32
+ # a retry loop that uses should_retry? to determine when to
33
+ # break the loop
34
+ #
35
+ # req - HttpRequest. The HTTP request
36
+ # _next - HttpFilter. The next filter in the pipeline
37
+ def call(req, _next)
38
+ retry_data = {}
39
+ response = nil
40
+ begin
41
+ response = _next.call
42
+ end while should_retry?(response, retry_data)
43
+ response
44
+ end
45
+
46
+ # Determines if the HTTP request should continue retrying
47
+ #
48
+ # response - HttpResponse. The response from the active request
49
+ # retry_data - Hash. Stores stateful retry data
50
+ #
51
+ # The retry_data is a Hash which can be used to store
52
+ # stateful data about the request execution context (such as an
53
+ # incrementing counter, timestamp, etc). The retry_data object
54
+ # will be the same instance throughout the lifetime of the request.
55
+ #
56
+ # If an inline block was passed to the constructor, that block
57
+ # will be used here and should return true to retry the job, or
58
+ # false to stop exit. If an inline block was not passed to the
59
+ # constructor the method returns false.
60
+ #
61
+ # Alternatively, a subclass could override this method.
62
+ def should_try?(response, retry_data)
63
+ @block ? @block.call(response, retry_data) : false
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,34 @@
1
+ #-------------------------------------------------------------------------
2
+ # Copyright (c) Microsoft. All rights reserved.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #--------------------------------------------------------------------------
15
+ require "azure/core/http/http_filter"
16
+
17
+ module Azure
18
+ module Core
19
+ module Http
20
+ # A HttpFilter implementation that creates a authorization signature which is added to the request headers
21
+ class SignerFilter < HttpFilter
22
+ def initialize(signer)
23
+ @signer = signer
24
+ end
25
+
26
+ def call(req, _next)
27
+ signature = @signer.sign(req.method, req.uri, req.headers)
28
+ req.headers["Authorization"] = "#{@signer.name} #{signature}"
29
+ _next.call
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -1,43 +1,49 @@
1
- require "azure/request"
2
- require "azure/auth"
1
+ #-------------------------------------------------------------------------
2
+ # Copyright (c) Microsoft. All rights reserved.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #--------------------------------------------------------------------------
15
+ require 'azure/core/http/http_request'
3
16
 
4
17
  module Azure
5
18
  module Core
19
+ # A base class for Service implementations
6
20
  class Service
7
- # Initialize the service.
8
- #
9
- # signer - The strategy to use to sign requests.
10
- # auth - Authorizer object. Defaults to Azure::Auth.new
11
- def initialize(signer, auth=Azure::Auth.new)
12
- @signer = signer
13
- @auth = auth
14
- end
15
21
 
16
- # Sign a request to include the necessary authorization header.
17
- #
18
- # request - An Azure::Request.
19
- # signer - A signer strategy (defaults to Azure::Tables::Auth::SharedKey)
20
- #
21
- # Returns the signed request.
22
- def sign_request(request)
23
- @auth.sign(request, @signer)
22
+ # Create a new instance of the Service
23
+ #
24
+ # host - String. The hostname. (optional, Default empty)
25
+ def initialize(host='')
26
+ @host = host
24
27
  end
25
28
 
26
- # Invoke the service.
27
- #
28
- # method - The HTTP method.
29
- # uri - The URI path for this service call.
30
- # body - The request body, if any (defaults to nil).
31
- #
32
- # Yields the request before signing it.
33
- #
34
- # Returns the Response object.
35
- def call(method, uri, body=nil, request_factory=Request)
36
- request = request_factory.new(method, uri, body)
29
+ attr_accessor :host
30
+
31
+ def call(method, uri, body=nil, headers=nil)
32
+ request = Core::Http::HttpRequest.new(method, uri, body)
33
+ request.headers.merge!(headers) if headers
34
+
35
+ request.headers['connection'] = 'keep-alive' if request.respond_to? :headers
36
+
37
37
  yield request if block_given?
38
- sign_request(request)
39
- request.request!
38
+
39
+ request.call
40
+ end
41
+
42
+ def generate_uri(path='', query={})
43
+ uri = URI.parse(File.join(host, path))
44
+ uri.query = URI.encode_www_form(query) unless query == nil or query.empty?
45
+ uri
40
46
  end
41
47
  end
42
48
  end
43
- end
49
+ end