onlinepayments-sdk-ruby 4.23.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (408) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +0 -0
  3. data/LICENSE.txt +0 -0
  4. data/README.md +5 -6
  5. data/Rakefile +0 -0
  6. data/lib/onlinepayments/sdk/api_exception.rb +47 -35
  7. data/lib/onlinepayments/sdk/api_resource.rb +49 -97
  8. data/lib/onlinepayments/sdk/authentication/authenticator.rb +19 -0
  9. data/lib/onlinepayments/sdk/authentication/authorization_type.rb +15 -0
  10. data/lib/onlinepayments/sdk/authentication/v1hmac_authenticator.rb +109 -0
  11. data/lib/onlinepayments/sdk/authentication.rb +1 -0
  12. data/lib/onlinepayments/sdk/authorization_exception.rb +14 -8
  13. data/lib/onlinepayments/sdk/call_context.rb +30 -21
  14. data/lib/onlinepayments/sdk/client.rb +36 -18
  15. data/lib/onlinepayments/sdk/communication/communication_exception.rb +19 -0
  16. data/lib/onlinepayments/sdk/communication/connection.rb +48 -0
  17. data/lib/onlinepayments/sdk/communication/default_connection.rb +427 -0
  18. data/lib/onlinepayments/sdk/communication/metadata_provider.rb +160 -0
  19. data/lib/onlinepayments/sdk/communication/multipart_form_data_object.rb +52 -0
  20. data/lib/onlinepayments/sdk/communication/multipart_form_data_request.rb +13 -0
  21. data/lib/onlinepayments/sdk/communication/not_found_exception.rb +19 -0
  22. data/lib/onlinepayments/sdk/communication/param_request.rb +14 -0
  23. data/lib/onlinepayments/sdk/communication/pooled_connection.rb +26 -0
  24. data/lib/onlinepayments/sdk/communication/request_header.rb +62 -0
  25. data/lib/onlinepayments/sdk/communication/request_param.rb +28 -0
  26. data/lib/onlinepayments/sdk/communication/response_exception.rb +56 -0
  27. data/lib/onlinepayments/sdk/communication/response_header.rb +78 -0
  28. data/lib/onlinepayments/sdk/communication.rb +1 -0
  29. data/lib/onlinepayments/sdk/communicator.rb +475 -268
  30. data/lib/onlinepayments/sdk/communicator_configuration.rb +162 -53
  31. data/lib/onlinepayments/sdk/declined_payment_exception.rb +28 -21
  32. data/lib/onlinepayments/sdk/declined_payout_exception.rb +28 -23
  33. data/lib/onlinepayments/sdk/declined_refund_exception.rb +28 -23
  34. data/lib/onlinepayments/sdk/declined_transaction_exception.rb +16 -10
  35. data/lib/onlinepayments/sdk/domain/account_on_file.rb +44 -35
  36. data/lib/onlinepayments/sdk/domain/account_on_file_attribute.rb +42 -28
  37. data/lib/onlinepayments/sdk/domain/account_on_file_display_hints.rb +29 -24
  38. data/lib/onlinepayments/sdk/domain/acquirer_information.rb +27 -22
  39. data/lib/onlinepayments/sdk/domain/acquirer_selection_information.rb +34 -24
  40. data/lib/onlinepayments/sdk/domain/additional_order_input.rb +43 -38
  41. data/lib/onlinepayments/sdk/domain/address.rb +65 -43
  42. data/lib/onlinepayments/sdk/domain/address_personal.rb +78 -52
  43. data/lib/onlinepayments/sdk/domain/airline_data.rb +204 -123
  44. data/lib/onlinepayments/sdk/domain/airline_flight_leg.rb +158 -95
  45. data/lib/onlinepayments/sdk/domain/airline_passenger.rb +59 -39
  46. data/lib/onlinepayments/sdk/domain/amount_breakdown.rb +27 -20
  47. data/lib/onlinepayments/sdk/domain/amount_of_money.rb +27 -20
  48. data/lib/onlinepayments/sdk/domain/api_error.rb +73 -47
  49. data/lib/onlinepayments/sdk/domain/apple_pay_line_item.rb +72 -0
  50. data/lib/onlinepayments/sdk/domain/apple_pay_recurring_payment_request.rb +61 -0
  51. data/lib/onlinepayments/sdk/domain/bank_account_iban.rb +20 -16
  52. data/lib/onlinepayments/sdk/domain/browser_data.rb +51 -35
  53. data/lib/onlinepayments/sdk/domain/calculate_surcharge_request.rb +27 -24
  54. data/lib/onlinepayments/sdk/domain/calculate_surcharge_response.rb +22 -20
  55. data/lib/onlinepayments/sdk/domain/cancel_payment_request.rb +27 -22
  56. data/lib/onlinepayments/sdk/domain/cancel_payment_response.rb +20 -18
  57. data/lib/onlinepayments/sdk/domain/capture.rb +41 -32
  58. data/lib/onlinepayments/sdk/domain/capture_output.rb +106 -78
  59. data/lib/onlinepayments/sdk/domain/capture_payment_request.rb +43 -26
  60. data/lib/onlinepayments/sdk/domain/capture_response.rb +41 -32
  61. data/lib/onlinepayments/sdk/domain/capture_status_output.rb +20 -16
  62. data/lib/onlinepayments/sdk/domain/captures_response.rb +22 -20
  63. data/lib/onlinepayments/sdk/domain/card.rb +41 -28
  64. data/lib/onlinepayments/sdk/domain/card_essentials.rb +41 -28
  65. data/lib/onlinepayments/sdk/domain/card_fraud_results.rb +34 -24
  66. data/lib/onlinepayments/sdk/domain/card_info.rb +27 -20
  67. data/lib/onlinepayments/sdk/domain/card_payment_method_specific_input.rb +199 -128
  68. data/lib/onlinepayments/sdk/domain/card_payment_method_specific_input_base.rb +149 -104
  69. data/lib/onlinepayments/sdk/domain/card_payment_method_specific_input_for_hosted_checkout.rb +36 -28
  70. data/lib/onlinepayments/sdk/domain/card_payment_method_specific_output.rb +133 -100
  71. data/lib/onlinepayments/sdk/domain/card_payout_method_specific_input.rb +41 -30
  72. data/lib/onlinepayments/sdk/domain/card_recurrence_details.rb +20 -16
  73. data/lib/onlinepayments/sdk/domain/card_source.rb +41 -30
  74. data/lib/onlinepayments/sdk/domain/card_without_cvv.rb +34 -24
  75. data/lib/onlinepayments/sdk/domain/company_information.rb +20 -16
  76. data/lib/onlinepayments/sdk/domain/complete_payment_card_payment_method_specific_input.rb +20 -18
  77. data/lib/onlinepayments/sdk/domain/complete_payment_request.rb +27 -24
  78. data/lib/onlinepayments/sdk/domain/complete_payment_response.rb +35 -31
  79. data/lib/onlinepayments/sdk/domain/contact_details.rb +51 -35
  80. data/lib/onlinepayments/sdk/domain/create_hosted_checkout_request.rb +76 -59
  81. data/lib/onlinepayments/sdk/domain/create_hosted_checkout_response.rb +60 -43
  82. data/lib/onlinepayments/sdk/domain/create_hosted_tokenization_request.rb +57 -42
  83. data/lib/onlinepayments/sdk/domain/create_hosted_tokenization_response.rb +57 -44
  84. data/lib/onlinepayments/sdk/domain/create_mandate_request.rb +71 -48
  85. data/lib/onlinepayments/sdk/domain/create_mandate_response.rb +27 -24
  86. data/lib/onlinepayments/sdk/domain/create_mandate_with_return_url.rb +71 -48
  87. data/lib/onlinepayments/sdk/domain/create_payment_link_request.rb +120 -87
  88. data/lib/onlinepayments/sdk/domain/create_payment_request.rb +82 -60
  89. data/lib/onlinepayments/sdk/domain/create_payment_response.rb +35 -31
  90. data/lib/onlinepayments/sdk/domain/create_payout_request.rb +61 -40
  91. data/lib/onlinepayments/sdk/domain/create_token_request.rb +27 -22
  92. data/lib/onlinepayments/sdk/domain/created_payment_output.rb +27 -22
  93. data/lib/onlinepayments/sdk/domain/created_token_response.rb +50 -38
  94. data/lib/onlinepayments/sdk/domain/credit_card_specific_input_hosted_tokenization.rb +29 -26
  95. data/lib/onlinepayments/sdk/domain/credit_card_validation_rules_hosted_tokenization.rb +27 -20
  96. data/lib/onlinepayments/sdk/domain/currency_conversion.rb +27 -22
  97. data/lib/onlinepayments/sdk/domain/currency_conversion_input.rb +27 -20
  98. data/lib/onlinepayments/sdk/domain/currency_conversion_request.rb +27 -24
  99. data/lib/onlinepayments/sdk/domain/currency_conversion_response.rb +34 -28
  100. data/lib/onlinepayments/sdk/domain/currency_conversion_result.rb +27 -20
  101. data/lib/onlinepayments/sdk/domain/currency_conversion_specific_input.rb +20 -16
  102. data/lib/onlinepayments/sdk/domain/customer.rb +87 -68
  103. data/lib/onlinepayments/sdk/domain/customer_account.rb +77 -55
  104. data/lib/onlinepayments/sdk/domain/customer_account_authentication.rb +34 -20
  105. data/lib/onlinepayments/sdk/domain/customer_bank_account.rb +34 -24
  106. data/lib/onlinepayments/sdk/domain/customer_device.rb +64 -44
  107. data/lib/onlinepayments/sdk/domain/customer_device_output.rb +20 -16
  108. data/lib/onlinepayments/sdk/domain/customer_output.rb +20 -18
  109. data/lib/onlinepayments/sdk/domain/customer_payment_activity.rb +34 -24
  110. data/lib/onlinepayments/sdk/domain/customer_token.rb +35 -31
  111. data/lib/onlinepayments/sdk/domain/data_object.rb +32 -0
  112. data/lib/onlinepayments/sdk/domain/dcc_card_source.rb +41 -30
  113. data/lib/onlinepayments/sdk/domain/dcc_proposal.rb +51 -41
  114. data/lib/onlinepayments/sdk/domain/decrypted_payment_data.rb +51 -35
  115. data/lib/onlinepayments/sdk/domain/directory_entry.rb +34 -24
  116. data/lib/onlinepayments/sdk/domain/discount.rb +20 -16
  117. data/lib/onlinepayments/sdk/domain/empty_validator.rb +7 -6
  118. data/lib/onlinepayments/sdk/domain/error_response.rb +29 -24
  119. data/lib/onlinepayments/sdk/domain/external_cardholder_authentication_data.rb +86 -55
  120. data/lib/onlinepayments/sdk/domain/external_token_linked.rb +35 -24
  121. data/lib/onlinepayments/sdk/domain/feedbacks.rb +30 -0
  122. data/lib/onlinepayments/sdk/domain/fixed_list_validator.rb +22 -20
  123. data/lib/onlinepayments/sdk/domain/fraud_fields.rb +37 -28
  124. data/lib/onlinepayments/sdk/domain/fraud_results.rb +20 -16
  125. data/lib/onlinepayments/sdk/domain/g_pay_three_d_secure.rb +50 -36
  126. data/lib/onlinepayments/sdk/domain/get_hosted_checkout_response.rb +27 -22
  127. data/lib/onlinepayments/sdk/domain/get_hosted_tokenization_response.rb +27 -22
  128. data/lib/onlinepayments/sdk/domain/get_iin_details_request.rb +27 -22
  129. data/lib/onlinepayments/sdk/domain/get_iin_details_response.rb +52 -38
  130. data/lib/onlinepayments/sdk/domain/get_mandate_response.rb +20 -18
  131. data/lib/onlinepayments/sdk/domain/get_payment_product_groups_response.rb +22 -20
  132. data/lib/onlinepayments/sdk/domain/get_payment_products_response.rb +22 -20
  133. data/lib/onlinepayments/sdk/domain/get_privacy_policy_response.rb +20 -16
  134. data/lib/onlinepayments/sdk/domain/gift_card_purchase.rb +27 -22
  135. data/lib/onlinepayments/sdk/domain/hosted_checkout_specific_input.rb +83 -56
  136. data/lib/onlinepayments/sdk/domain/hosted_checkout_specific_output.rb +27 -20
  137. data/lib/onlinepayments/sdk/domain/iin_detail.rb +34 -24
  138. data/lib/onlinepayments/sdk/domain/label_template_element.rb +27 -20
  139. data/lib/onlinepayments/sdk/domain/length_validator.rb +27 -20
  140. data/lib/onlinepayments/sdk/domain/line_item.rb +44 -31
  141. data/lib/onlinepayments/sdk/domain/line_item_invoice_data.rb +20 -16
  142. data/lib/onlinepayments/sdk/domain/loan_recipient.rb +51 -35
  143. data/lib/onlinepayments/sdk/domain/lodging_data.rb +20 -16
  144. data/lib/onlinepayments/sdk/domain/mandate_address.rb +51 -35
  145. data/lib/onlinepayments/sdk/domain/mandate_address_response.rb +51 -35
  146. data/lib/onlinepayments/sdk/domain/mandate_contact_details.rb +20 -16
  147. data/lib/onlinepayments/sdk/domain/mandate_customer.rb +52 -44
  148. data/lib/onlinepayments/sdk/domain/mandate_customer_response.rb +52 -44
  149. data/lib/onlinepayments/sdk/domain/mandate_merchant_action.rb +27 -22
  150. data/lib/onlinepayments/sdk/domain/mandate_personal_information.rb +27 -22
  151. data/lib/onlinepayments/sdk/domain/mandate_personal_information_response.rb +27 -22
  152. data/lib/onlinepayments/sdk/domain/mandate_personal_name.rb +27 -20
  153. data/lib/onlinepayments/sdk/domain/mandate_personal_name_response.rb +27 -20
  154. data/lib/onlinepayments/sdk/domain/mandate_redirect_data.rb +27 -20
  155. data/lib/onlinepayments/sdk/domain/mandate_response.rb +64 -44
  156. data/lib/onlinepayments/sdk/domain/merchant_action.rb +43 -28
  157. data/lib/onlinepayments/sdk/domain/mobile_payment_data.rb +27 -20
  158. data/lib/onlinepayments/sdk/domain/mobile_payment_method_hosted_checkout_specific_input.rb +43 -26
  159. data/lib/onlinepayments/sdk/domain/mobile_payment_method_specific_input.rb +71 -50
  160. data/lib/onlinepayments/sdk/domain/mobile_payment_method_specific_output.rb +58 -45
  161. data/lib/onlinepayments/sdk/domain/mobile_payment_product302_specific_input.rb +32 -0
  162. data/lib/onlinepayments/sdk/domain/mobile_payment_product320_specific_input.rb +20 -18
  163. data/lib/onlinepayments/sdk/domain/mobile_three_d_secure_challenge_parameters.rb +51 -0
  164. data/lib/onlinepayments/sdk/domain/multiple_payment_information.rb +27 -20
  165. data/lib/onlinepayments/sdk/domain/omnichannel_payout_specific_input.rb +20 -16
  166. data/lib/onlinepayments/sdk/domain/operation_output.rb +67 -45
  167. data/lib/onlinepayments/sdk/domain/operation_payment_references.rb +30 -0
  168. data/lib/onlinepayments/sdk/domain/order.rb +75 -66
  169. data/lib/onlinepayments/sdk/domain/order_line_details.rb +79 -47
  170. data/lib/onlinepayments/sdk/domain/order_references.rb +34 -24
  171. data/lib/onlinepayments/sdk/domain/order_status_output.rb +52 -38
  172. data/lib/onlinepayments/sdk/domain/order_type_information.rb +27 -20
  173. data/lib/onlinepayments/sdk/domain/other_details.rb +37 -0
  174. data/lib/onlinepayments/sdk/domain/payment_account_on_file.rb +27 -20
  175. data/lib/onlinepayments/sdk/domain/payment_context.rb +34 -26
  176. data/lib/onlinepayments/sdk/domain/payment_creation_output.rb +41 -28
  177. data/lib/onlinepayments/sdk/domain/payment_details_response.rb +60 -49
  178. data/lib/onlinepayments/sdk/domain/payment_error_response.rb +37 -31
  179. data/lib/onlinepayments/sdk/domain/payment_link_event.rb +34 -24
  180. data/lib/onlinepayments/sdk/domain/payment_link_order_input.rb +34 -28
  181. data/lib/onlinepayments/sdk/domain/payment_link_order_output.rb +34 -28
  182. data/lib/onlinepayments/sdk/domain/payment_link_response.rb +74 -51
  183. data/lib/onlinepayments/sdk/domain/payment_link_specific_input.rb +36 -24
  184. data/lib/onlinepayments/sdk/domain/payment_output.rb +115 -94
  185. data/lib/onlinepayments/sdk/domain/payment_product.rb +117 -85
  186. data/lib/onlinepayments/sdk/domain/payment_product130_specific_input.rb +20 -18
  187. data/lib/onlinepayments/sdk/domain/payment_product130_specific_three_d_secure.rb +41 -28
  188. data/lib/onlinepayments/sdk/domain/payment_product3012.rb +27 -20
  189. data/lib/onlinepayments/sdk/domain/payment_product3012_specific_input.rb +51 -0
  190. data/lib/onlinepayments/sdk/domain/payment_product302_specific_data.rb +22 -20
  191. data/lib/onlinepayments/sdk/domain/payment_product3203_specific_output.rb +27 -24
  192. data/lib/onlinepayments/sdk/domain/payment_product3208_specific_input.rb +20 -16
  193. data/lib/onlinepayments/sdk/domain/payment_product3208_specific_output.rb +20 -16
  194. data/lib/onlinepayments/sdk/domain/payment_product3209_specific_input.rb +20 -16
  195. data/lib/onlinepayments/sdk/domain/payment_product3209_specific_output.rb +20 -16
  196. data/lib/onlinepayments/sdk/domain/payment_product320_specific_data.rb +29 -24
  197. data/lib/onlinepayments/sdk/domain/payment_product5001_specific_output.rb +48 -16
  198. data/lib/onlinepayments/sdk/domain/payment_product5100_specific_input.rb +20 -16
  199. data/lib/onlinepayments/sdk/domain/payment_product5402_specific_output.rb +20 -16
  200. data/lib/onlinepayments/sdk/domain/payment_product5404.rb +27 -20
  201. data/lib/onlinepayments/sdk/domain/payment_product5407.rb +27 -20
  202. data/lib/onlinepayments/sdk/domain/payment_product5500_specific_output.rb +41 -24
  203. data/lib/onlinepayments/sdk/domain/payment_product771_specific_output.rb +20 -16
  204. data/lib/onlinepayments/sdk/domain/payment_product840_customer_account.rb +72 -47
  205. data/lib/onlinepayments/sdk/domain/payment_product840_specific_output.rb +43 -38
  206. data/lib/onlinepayments/sdk/domain/payment_product_display_hints.rb +34 -24
  207. data/lib/onlinepayments/sdk/domain/payment_product_field.rb +41 -32
  208. data/lib/onlinepayments/sdk/domain/payment_product_field_data_restrictions.rb +27 -22
  209. data/lib/onlinepayments/sdk/domain/payment_product_field_display_element.rb +41 -28
  210. data/lib/onlinepayments/sdk/domain/payment_product_field_display_hints.rb +84 -56
  211. data/lib/onlinepayments/sdk/domain/payment_product_field_form_element.rb +30 -24
  212. data/lib/onlinepayments/sdk/domain/payment_product_field_tooltip.rb +28 -20
  213. data/lib/onlinepayments/sdk/domain/payment_product_field_validators.rb +83 -73
  214. data/lib/onlinepayments/sdk/domain/payment_product_filter.rb +32 -29
  215. data/lib/onlinepayments/sdk/domain/payment_product_filter_hosted_tokenization.rb +22 -20
  216. data/lib/onlinepayments/sdk/domain/payment_product_filters_hosted_checkout.rb +27 -24
  217. data/lib/onlinepayments/sdk/domain/payment_product_filters_hosted_tokenization.rb +27 -24
  218. data/lib/onlinepayments/sdk/domain/payment_product_group.rb +44 -37
  219. data/lib/onlinepayments/sdk/domain/payment_product_networks_response.rb +22 -20
  220. data/lib/onlinepayments/sdk/domain/payment_references.rb +27 -20
  221. data/lib/onlinepayments/sdk/domain/payment_response.rb +51 -41
  222. data/lib/onlinepayments/sdk/domain/payment_status_output.rb +66 -46
  223. data/lib/onlinepayments/sdk/domain/payout_error_response.rb +37 -31
  224. data/lib/onlinepayments/sdk/domain/payout_output.rb +27 -22
  225. data/lib/onlinepayments/sdk/domain/payout_response.rb +41 -32
  226. data/lib/onlinepayments/sdk/domain/payout_result.rb +41 -32
  227. data/lib/onlinepayments/sdk/domain/payout_status_output.rb +34 -24
  228. data/lib/onlinepayments/sdk/domain/personal_information.rb +34 -26
  229. data/lib/onlinepayments/sdk/domain/personal_information_token.rb +20 -18
  230. data/lib/onlinepayments/sdk/domain/personal_name.rb +34 -24
  231. data/lib/onlinepayments/sdk/domain/personal_name_token.rb +27 -20
  232. data/lib/onlinepayments/sdk/domain/product_directory.rb +22 -20
  233. data/lib/onlinepayments/sdk/domain/protection_eligibility.rb +27 -20
  234. data/lib/onlinepayments/sdk/domain/range_validator.rb +27 -20
  235. data/lib/onlinepayments/sdk/domain/rate_details.rb +51 -35
  236. data/lib/onlinepayments/sdk/domain/redirect_data.rb +27 -20
  237. data/lib/onlinepayments/sdk/domain/redirect_payment_method_specific_input.rb +139 -88
  238. data/lib/onlinepayments/sdk/domain/redirect_payment_method_specific_output.rb +95 -75
  239. data/lib/onlinepayments/sdk/domain/redirect_payment_product3203_specific_input.rb +20 -16
  240. data/lib/onlinepayments/sdk/domain/redirect_payment_product3302_specific_input.rb +44 -0
  241. data/lib/onlinepayments/sdk/domain/redirect_payment_product3306_specific_input.rb +20 -16
  242. data/lib/onlinepayments/sdk/domain/redirect_payment_product5001_specific_input.rb +20 -16
  243. data/lib/onlinepayments/sdk/domain/redirect_payment_product5300_specific_input.rb +74 -0
  244. data/lib/onlinepayments/sdk/domain/redirect_payment_product5406_specific_input.rb +20 -18
  245. data/lib/onlinepayments/sdk/domain/redirect_payment_product5408_specific_input.rb +27 -22
  246. data/lib/onlinepayments/sdk/domain/redirect_payment_product5410_specific_input.rb +32 -0
  247. data/lib/onlinepayments/sdk/domain/redirect_payment_product809_specific_input.rb +20 -16
  248. data/lib/onlinepayments/sdk/domain/redirect_payment_product840_specific_input.rb +41 -20
  249. data/lib/onlinepayments/sdk/domain/redirection_data.rb +20 -16
  250. data/lib/onlinepayments/sdk/domain/refund_card_method_specific_output.rb +34 -26
  251. data/lib/onlinepayments/sdk/domain/refund_e_wallet_method_specific_output.rb +34 -26
  252. data/lib/onlinepayments/sdk/domain/refund_error_response.rb +37 -31
  253. data/lib/onlinepayments/sdk/domain/refund_mobile_method_specific_output.rb +34 -24
  254. data/lib/onlinepayments/sdk/domain/refund_output.rb +89 -64
  255. data/lib/onlinepayments/sdk/domain/refund_payment_product840_customer_account.rb +34 -24
  256. data/lib/onlinepayments/sdk/domain/refund_payment_product840_specific_output.rb +20 -18
  257. data/lib/onlinepayments/sdk/domain/refund_redirect_method_specific_output.rb +27 -20
  258. data/lib/onlinepayments/sdk/domain/refund_request.rb +43 -24
  259. data/lib/onlinepayments/sdk/domain/refund_response.rb +41 -32
  260. data/lib/onlinepayments/sdk/domain/refunds_response.rb +22 -20
  261. data/lib/onlinepayments/sdk/domain/regular_expression_validator.rb +20 -16
  262. data/lib/onlinepayments/sdk/domain/send_test_request.rb +30 -0
  263. data/lib/onlinepayments/sdk/domain/sepa_direct_debit_payment_method_specific_input.rb +27 -22
  264. data/lib/onlinepayments/sdk/domain/sepa_direct_debit_payment_method_specific_input_base.rb +27 -22
  265. data/lib/onlinepayments/sdk/domain/sepa_direct_debit_payment_method_specific_output.rb +34 -28
  266. data/lib/onlinepayments/sdk/domain/sepa_direct_debit_payment_product771_specific_input.rb +27 -22
  267. data/lib/onlinepayments/sdk/domain/sepa_direct_debit_payment_product771_specific_input_base.rb +27 -22
  268. data/lib/onlinepayments/sdk/domain/session_request.rb +22 -20
  269. data/lib/onlinepayments/sdk/domain/session_response.rb +53 -39
  270. data/lib/onlinepayments/sdk/domain/shipping.rb +76 -52
  271. data/lib/onlinepayments/sdk/domain/shipping_method.rb +41 -28
  272. data/lib/onlinepayments/sdk/domain/shopping_cart.rb +62 -48
  273. data/lib/onlinepayments/sdk/domain/shopping_cart_extension.rb +51 -43
  274. data/lib/onlinepayments/sdk/domain/show_form_data.rb +35 -31
  275. data/lib/onlinepayments/sdk/domain/subsequent_card_payment_method_specific_input.rb +60 -39
  276. data/lib/onlinepayments/sdk/domain/subsequent_payment_product5001_specific_input.rb +20 -16
  277. data/lib/onlinepayments/sdk/domain/subsequent_payment_request.rb +35 -31
  278. data/lib/onlinepayments/sdk/domain/subsequent_payment_response.rb +20 -18
  279. data/lib/onlinepayments/sdk/domain/surcharge.rb +59 -48
  280. data/lib/onlinepayments/sdk/domain/surcharge_calculation_card.rb +27 -20
  281. data/lib/onlinepayments/sdk/domain/surcharge_for_payment_link.rb +20 -16
  282. data/lib/onlinepayments/sdk/domain/surcharge_rate.rb +41 -28
  283. data/lib/onlinepayments/sdk/domain/surcharge_specific_input.rb +27 -22
  284. data/lib/onlinepayments/sdk/domain/surcharge_specific_output.rb +34 -28
  285. data/lib/onlinepayments/sdk/domain/test_connection.rb +20 -16
  286. data/lib/onlinepayments/sdk/domain/three_d_secure.rb +98 -63
  287. data/lib/onlinepayments/sdk/domain/three_d_secure_base.rb +78 -52
  288. data/lib/onlinepayments/sdk/domain/three_d_secure_data.rb +34 -24
  289. data/lib/onlinepayments/sdk/domain/three_d_secure_results.rb +107 -67
  290. data/lib/onlinepayments/sdk/domain/token_card.rb +27 -22
  291. data/lib/onlinepayments/sdk/domain/token_card_data.rb +27 -18
  292. data/lib/onlinepayments/sdk/domain/token_card_specific_input.rb +20 -18
  293. data/lib/onlinepayments/sdk/domain/token_data.rb +27 -18
  294. data/lib/onlinepayments/sdk/domain/token_e_wallet.rb +28 -22
  295. data/lib/onlinepayments/sdk/domain/token_response.rb +58 -45
  296. data/lib/onlinepayments/sdk/domain/transaction.rb +20 -18
  297. data/lib/onlinepayments/sdk/domain/uploadable_file.rb +33 -0
  298. data/lib/onlinepayments/sdk/domain/validate_credentials_request.rb +37 -0
  299. data/lib/onlinepayments/sdk/domain/validate_credentials_response.rb +30 -0
  300. data/lib/onlinepayments/sdk/domain/value_mapping_element.rb +29 -24
  301. data/lib/onlinepayments/sdk/domain.rb +4 -0
  302. data/lib/onlinepayments/sdk/exception_factory.rb +76 -0
  303. data/lib/onlinepayments/sdk/factory.rb +163 -118
  304. data/lib/onlinepayments/sdk/idempotence_exception.rb +23 -19
  305. data/lib/onlinepayments/sdk/json/default_marshaller.rb +34 -0
  306. data/lib/onlinepayments/sdk/json/marshaller.rb +27 -0
  307. data/lib/onlinepayments/sdk/json/marshaller_syntax_exception.rb +9 -0
  308. data/lib/onlinepayments/sdk/json.rb +1 -0
  309. data/lib/onlinepayments/sdk/logging/communicator_logger.rb +18 -16
  310. data/lib/onlinepayments/sdk/logging/log_message_builder.rb +80 -47
  311. data/lib/onlinepayments/sdk/logging/logging_capable.rb +1 -1
  312. data/lib/onlinepayments/sdk/logging/obfuscation/body_obfuscator.rb +113 -0
  313. data/lib/onlinepayments/sdk/logging/obfuscation/header_obfuscator.rb +54 -0
  314. data/lib/onlinepayments/sdk/logging/obfuscation/obfuscation_capable.rb +21 -0
  315. data/lib/onlinepayments/sdk/logging/obfuscation/obfuscation_rule.rb +47 -0
  316. data/lib/onlinepayments/sdk/logging/obfuscation.rb +1 -0
  317. data/lib/onlinepayments/sdk/logging/request_log_message_builder.rb +40 -29
  318. data/lib/onlinepayments/sdk/logging/response_log_message_builder.rb +30 -23
  319. data/lib/onlinepayments/sdk/logging/ruby_communicator_logger.rb +49 -45
  320. data/lib/onlinepayments/sdk/logging/stdout_communicator_logger.rb +20 -23
  321. data/lib/onlinepayments/sdk/logging.rb +1 -10
  322. data/lib/onlinepayments/sdk/merchant/captures/captures_client.rb +57 -0
  323. data/lib/onlinepayments/sdk/merchant/captures.rb +4 -0
  324. data/lib/onlinepayments/sdk/merchant/complete/complete_client.rb +60 -0
  325. data/lib/onlinepayments/sdk/merchant/complete.rb +4 -0
  326. data/lib/onlinepayments/sdk/merchant/hostedcheckout/hosted_checkout_client.rb +72 -71
  327. data/lib/onlinepayments/sdk/merchant/hostedcheckout.rb +4 -0
  328. data/lib/onlinepayments/sdk/merchant/hostedtokenization/hosted_tokenization_client.rb +72 -71
  329. data/lib/onlinepayments/sdk/merchant/hostedtokenization.rb +4 -0
  330. data/lib/onlinepayments/sdk/merchant/mandates/mandates_client.rb +165 -164
  331. data/lib/onlinepayments/sdk/merchant/mandates.rb +4 -0
  332. data/lib/onlinepayments/sdk/merchant/merchant_client.rb +116 -64
  333. data/lib/onlinepayments/sdk/merchant/paymentlinks/payment_links_client.rb +102 -101
  334. data/lib/onlinepayments/sdk/merchant/paymentlinks.rb +4 -0
  335. data/lib/onlinepayments/sdk/merchant/payments/payments_client.rb +233 -332
  336. data/lib/onlinepayments/sdk/merchant/payments.rb +4 -0
  337. data/lib/onlinepayments/sdk/merchant/payouts/payouts_client.rb +73 -71
  338. data/lib/onlinepayments/sdk/merchant/payouts.rb +4 -0
  339. data/lib/onlinepayments/sdk/merchant/privacypolicy/get_privacy_policy_params.rb +32 -0
  340. data/lib/onlinepayments/sdk/merchant/privacypolicy/privacy_policy_client.rb +54 -0
  341. data/lib/onlinepayments/sdk/merchant/privacypolicy.rb +4 -0
  342. data/lib/onlinepayments/sdk/merchant/productgroups/get_product_group_params.rb +50 -47
  343. data/lib/onlinepayments/sdk/merchant/productgroups/get_product_groups_params.rb +50 -47
  344. data/lib/onlinepayments/sdk/merchant/productgroups/product_groups_client.rb +72 -72
  345. data/lib/onlinepayments/sdk/merchant/productgroups.rb +4 -0
  346. data/lib/onlinepayments/sdk/merchant/products/get_payment_product_networks_params.rb +27 -25
  347. data/lib/onlinepayments/sdk/merchant/products/get_payment_product_params.rb +50 -47
  348. data/lib/onlinepayments/sdk/merchant/products/get_payment_products_params.rb +50 -47
  349. data/lib/onlinepayments/sdk/merchant/products/get_product_directory_params.rb +21 -19
  350. data/lib/onlinepayments/sdk/merchant/products/products_client.rb +134 -136
  351. data/lib/onlinepayments/sdk/merchant/products.rb +4 -0
  352. data/lib/onlinepayments/sdk/merchant/refunds/refunds_client.rb +57 -0
  353. data/lib/onlinepayments/sdk/merchant/refunds.rb +4 -0
  354. data/lib/onlinepayments/sdk/merchant/services/services_client.rb +124 -155
  355. data/lib/onlinepayments/sdk/merchant/services.rb +4 -0
  356. data/lib/onlinepayments/sdk/merchant/sessions/sessions_client.rb +42 -41
  357. data/lib/onlinepayments/sdk/merchant/sessions.rb +4 -0
  358. data/lib/onlinepayments/sdk/merchant/tokens/tokens_client.rb +101 -100
  359. data/lib/onlinepayments/sdk/merchant/tokens.rb +4 -0
  360. data/lib/onlinepayments/sdk/merchant/webhooks/webhooks_client.rb +83 -0
  361. data/lib/onlinepayments/sdk/merchant/webhooks.rb +4 -0
  362. data/lib/onlinepayments/sdk/merchant.rb +4 -0
  363. data/lib/onlinepayments/sdk/platform_exception.rb +19 -0
  364. data/lib/onlinepayments/sdk/proxy_configuration.rb +60 -60
  365. data/lib/onlinepayments/sdk/reference_exception.rb +14 -9
  366. data/lib/onlinepayments/sdk/validation_exception.rb +14 -9
  367. data/lib/onlinepayments/sdk/webhooks/api_version_mismatch_exception.rb +17 -15
  368. data/lib/onlinepayments/sdk/webhooks/in_memory_secret_key_store.rb +46 -43
  369. data/lib/onlinepayments/sdk/webhooks/secret_key_not_available_exception.rb +16 -12
  370. data/lib/onlinepayments/sdk/webhooks/secret_key_store.rb +13 -11
  371. data/lib/onlinepayments/sdk/webhooks/signature_validation_exception.rb +15 -14
  372. data/lib/onlinepayments/sdk/webhooks/signature_validator.rb +81 -0
  373. data/lib/onlinepayments/sdk/webhooks/webhooks_event.rb +84 -53
  374. data/lib/onlinepayments/sdk/webhooks/webhooks_helper.rb +28 -90
  375. data/lib/onlinepayments/sdk/webhooks.rb +1 -11
  376. data/lib/onlinepayments/sdk.rb +4 -26
  377. data/onlinepayments-sdk-ruby.gemspec +3 -2
  378. metadata +89 -35
  379. data/lib/onlinepayments/sdk/authenticator.rb +0 -16
  380. data/lib/onlinepayments/sdk/communication_exception.rb +0 -16
  381. data/lib/onlinepayments/sdk/connection.rb +0 -41
  382. data/lib/onlinepayments/sdk/data_object.rb +0 -31
  383. data/lib/onlinepayments/sdk/defaultimpl/authorization_type.rb +0 -24
  384. data/lib/onlinepayments/sdk/defaultimpl/default_authenticator.rb +0 -108
  385. data/lib/onlinepayments/sdk/defaultimpl/default_connection.rb +0 -365
  386. data/lib/onlinepayments/sdk/defaultimpl/default_marshaller.rb +0 -32
  387. data/lib/onlinepayments/sdk/defaultimpl.rb +0 -6
  388. data/lib/onlinepayments/sdk/endpoint_configuration.rb +0 -127
  389. data/lib/onlinepayments/sdk/exceptions.rb +0 -8
  390. data/lib/onlinepayments/sdk/logging/logging_util.rb +0 -286
  391. data/lib/onlinepayments/sdk/marshaller.rb +0 -24
  392. data/lib/onlinepayments/sdk/marshaller_syntax_exception.rb +0 -6
  393. data/lib/onlinepayments/sdk/merchant/services/get_privacy_policy_params.rb +0 -30
  394. data/lib/onlinepayments/sdk/meta_data_provider.rb +0 -150
  395. data/lib/onlinepayments/sdk/modules.rb +0 -62
  396. data/lib/onlinepayments/sdk/multipart_form_data_object.rb +0 -44
  397. data/lib/onlinepayments/sdk/multipart_form_data_request.rb +0 -9
  398. data/lib/onlinepayments/sdk/not_found_exception.rb +0 -16
  399. data/lib/onlinepayments/sdk/param_request.rb +0 -11
  400. data/lib/onlinepayments/sdk/payment_platform_exception.rb +0 -15
  401. data/lib/onlinepayments/sdk/pooled_connection.rb +0 -21
  402. data/lib/onlinepayments/sdk/request_header.rb +0 -50
  403. data/lib/onlinepayments/sdk/request_param.rb +0 -23
  404. data/lib/onlinepayments/sdk/response_exception.rb +0 -47
  405. data/lib/onlinepayments/sdk/response_header.rb +0 -42
  406. data/lib/onlinepayments/sdk/uploadable_file.rb +0 -30
  407. data/lib/onlinepayments/sdk/webhooks/webhooks.rb +0 -22
  408. data/lib/onlinepayments/sdk/webhooks/webhooks_helper_builder.rb +0 -25
@@ -0,0 +1,19 @@
1
+ module OnlinePayments
2
+ module SDK
3
+ module Communication
4
+ # This exception is used when an error occurs during network communication with the Online Payments platform.
5
+ # A common cause is a timeout while connecting or when receiving or sending data.
6
+ #
7
+ # @attr [Exception] cause The error that is the cause of this error.
8
+ class CommunicationException < RuntimeError
9
+
10
+ def initialize(cause)
11
+ super()
12
+ @cause = cause
13
+ end
14
+
15
+ attr_accessor :cause
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,48 @@
1
+ require 'onlinepayments/sdk/logging/logging_capable'
2
+ require 'onlinepayments/sdk/logging/obfuscation/obfuscation_capable'
3
+
4
+ module OnlinePayments
5
+ module SDK
6
+ module Communication
7
+ # Class used to communicate using the HTTP (or HTTPS) protocol.
8
+ # Performs GET, DELETE, POST and PUT requests given a target uri and request headers.
9
+ # @see OnlinePayments::SDK::Communication::DefaultConnection
10
+ class Connection
11
+ include OnlinePayments::SDK::Logging::LoggingCapable
12
+ include OnlinePayments::SDK::Logging::Obfuscation::ObfuscationCapable
13
+
14
+ # Performs a GET request to _uri_ using _request_headers_,
15
+ # and yields the response as the status code, headers and body.
16
+ #
17
+ # @yield (Integer, Array<OnlinePayments::SDK::Communication::ResponseHeader>, IO) The status code, headers and body of the response.
18
+ def get(uri, request_headers)
19
+ raise NotImplementedError
20
+ end
21
+
22
+ # Performs a DELETE request to _uri_ using _request_headers_,
23
+ # and yields the response as the status code, headers and body.
24
+ #
25
+ # @yield (Integer, Array<OnlinePayments::SDK::Communication::ResponseHeader>, IO) The status code, headers and body of the response.
26
+ def delete(uri, request_headers)
27
+ raise NotImplementedError
28
+ end
29
+
30
+ # Performs a POST request to _uri_ using _request_headers_ and _body_,
31
+ # and yields the response as the status code, headers and body.
32
+ #
33
+ # @yield (Integer, Array<OnlinePayments::SDK::Communication::ResponseHeader>, IO) The status code, headers and body of the response.
34
+ def post(uri, request_headers, body)
35
+ raise NotImplementedError
36
+ end
37
+
38
+ # Performs a PUT request to _uri_ using _request_headers_ and _body_,
39
+ # and yields the response as the status code, headers and body.
40
+ #
41
+ # @yield (Integer, Array<OnlinePayments::SDK::Communication::ResponseHeader>, IO) The status code, headers and body of the response.
42
+ def put(uri, request_headers, body)
43
+ raise NotImplementedError
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,427 @@
1
+ require 'httpclient'
2
+ require 'securerandom'
3
+ require 'uri'
4
+ require 'onlinepayments/sdk/communication/communication_exception'
5
+ require 'onlinepayments/sdk/communication/multipart_form_data_object'
6
+ require 'onlinepayments/sdk/communication/pooled_connection'
7
+ require 'onlinepayments/sdk/communication/response_header'
8
+ require 'onlinepayments/sdk/logging/obfuscation/body_obfuscator'
9
+ require 'onlinepayments/sdk/logging/obfuscation/header_obfuscator'
10
+ require 'onlinepayments/sdk/logging/request_log_message_builder'
11
+ require 'onlinepayments/sdk/logging/response_log_message_builder'
12
+
13
+ # @private :nodoc: this is not our class
14
+ module RefineHTTPClient
15
+ refine HTTPClient do
16
+ # (monkey) patch to gain access to the session pool size in HTTPClient
17
+ def session_count
18
+ sess_pool = @session_manager.instance_variable_get(:@sess_pool)
19
+ sess_pool.size
20
+ end
21
+ end
22
+ end
23
+
24
+ module OnlinePayments
25
+ module SDK
26
+ module Communication
27
+ class DefaultConnection < PooledConnection
28
+ using RefineHTTPClient
29
+
30
+ private
31
+
32
+ CONTENT_TYPE = 'Content-Type'.freeze
33
+ JSON_CONTENT_TYPE = 'application/json'.freeze
34
+
35
+ public
36
+
37
+ # @param args [Hash] the parameters to initialize the connection with
38
+ # @option args [Integer] :connect_timeout connection timeout in seconds.
39
+ # @option args [Integer] :socket_timeout socket timeout in seconds.
40
+ # @option args [Integer] :max_connections number of connections kept alive in the thread pool.
41
+ # Uses {OnlinePayments::SDK::CommunicatorConfiguration.default_max_connections} if not given.
42
+ # @option args [OnlinePayments::SDK::ProxyConfiguration] :proxy_configuration object that stores the proxy to use.
43
+ # If not given the system default proxy is used;
44
+ # if there is no system default proxy set either, no proxy is used.
45
+ def initialize(args)
46
+ raise ArgumentError unless args.is_a? Hash
47
+
48
+ # Set timeouts to nil if they are negative
49
+ @connect_timeout = args[:connect_timeout]
50
+ @connect_timeout = nil unless @connect_timeout.nil? || @connect_timeout > 0
51
+ @socket_timeout = args[:socket_timeout]
52
+ @socket_timeout = nil unless @socket_timeout.nil? || @socket_timeout > 0
53
+ @max_connections = args[:max_connections] || CommunicatorConfiguration.default_max_connections
54
+ @proxy_configuration = args[:proxy_configuration]
55
+
56
+ # HTTPClient provides the following features:
57
+ # 1) thread safe, an instance can be used by multiple threads without
58
+ # explicit synchronization
59
+ # 2) use persistent connection if HTTP 1.1 is supported. The connection
60
+ # will be left open until explicitly closed or keep_alive_timeout
61
+ # 3) a built-in connection pool with no limit for max connections
62
+ @http_client = create_http_client
63
+ @http_client.connect_timeout = @connect_timeout
64
+ @http_client.send_timeout = @socket_timeout
65
+ @http_client.receive_timeout = @socket_timeout
66
+
67
+ @body_obfuscator = OnlinePayments::SDK::Logging::Obfuscation::BodyObfuscator.default_obfuscator
68
+ @header_obfuscator = OnlinePayments::SDK::Logging::Obfuscation::HeaderObfuscator.default_obfuscator
69
+ end
70
+
71
+ private
72
+
73
+ # Create a HTTPClient instance that uses @proxy_configuration or the system proxy if @proxy_configuration is not set
74
+ def create_http_client
75
+ if @proxy_configuration
76
+ httpclient = HTTPClient.new(@proxy_configuration.proxy_uri)
77
+ httpclient.set_proxy_auth(@proxy_configuration.username, @proxy_configuration.password)
78
+ httpclient.force_basic_auth = true unless @proxy_configuration.username.nil? || @proxy_configuration.password.nil?
79
+ httpclient
80
+ else
81
+ # use system settings
82
+ proxy_string = ENV['https_proxy'] || ENV['http_proxy']
83
+ # proxy string format = 'http://username:password@hostname:port'
84
+ proxy_string =~ %r{https?//(?<username>[^:]):(?<password>[^@])@.*}
85
+ username = Regexp.last_match(1)
86
+ password = Regexp.last_match(2)
87
+ httpclient = HTTPClient.new(proxy_string)
88
+ httpclient.set_proxy_auth(username, password) unless username.nil? || password.nil?
89
+ httpclient.force_basic_auth = true unless username.nil? || password.nil?
90
+ httpclient
91
+ end
92
+ end
93
+
94
+ public
95
+
96
+ # Closes all connections idle for longer than _idle_time_ seconds.
97
+ # In addition, the keep_alive_timeout is set to _idle_time_
98
+ # so any future connections idle for longer than _idle_time_ seconds will also be closed.
99
+ def close_idle_connections(idle_time)
100
+ # in sec
101
+ @http_client.keep_alive_timeout = idle_time # set timeout value
102
+ close_expired_connections
103
+ end
104
+
105
+ # HTTPClient automatically closes expired connections so _close_expired_connections_ is a no-operation.
106
+ def close_expired_connections
107
+ # By default the keep alive timeout is 15 sec, which is the HTTP 1.1
108
+ # standard. To change the value, use keep_alive_timeout= method
109
+ # do nothing, handled by HTTPClient
110
+ end
111
+
112
+ # Frees all networking resources used.
113
+ def close
114
+ @http_client.reset_all
115
+ end
116
+
117
+ # Returns the number of open connections
118
+ def session_count
119
+ @http_client.session_count
120
+ end
121
+
122
+ # Performs a GET request to the Online Payments platform
123
+ # @see request
124
+ def get(uri, request_headers)
125
+ request('get', uri, request_headers) do |response_status_code, response_headers, response_body|
126
+ yield response_status_code, response_headers, response_body
127
+ end
128
+ end
129
+
130
+ # Performs a DELETE request to the Online Payments platform
131
+ # @see request
132
+ def delete(uri, request_headers)
133
+ request('delete', uri, request_headers) do |response_status_code, response_headers, response_body|
134
+ yield response_status_code, response_headers, response_body
135
+ end
136
+ end
137
+
138
+ # Performs a POST request to the Online Payments platform
139
+ # @see request
140
+ def post(uri, request_headers, body)
141
+ request('post', uri, request_headers, body) do |response_status_code, response_headers, response_body|
142
+ yield response_status_code, response_headers, response_body
143
+ end
144
+ end
145
+
146
+ # Performs a PUT request to the Online Payments platform
147
+ # @see request
148
+ def put(uri, request_headers, body)
149
+ request('put', uri, request_headers, body) do |response_status_code, response_headers, response_body|
150
+ yield response_status_code, response_headers, response_body
151
+ end
152
+ end
153
+
154
+ # Performs a HTTP request and yields the response as the status code, headers and body.
155
+ # Also ensures the request is logged when sent and its response is logged when received.
156
+ #
157
+ # @param method [String] 'GET', 'DELETE', 'POST' or 'PUT' depending on the HTTP method being used.
158
+ # @param uri [URI::HTTP] full URI of the location the request is targeted at, including query parameters.
159
+ # @param request_headers [Array<OnlinePayments::SDK::Communication::RequestHeader>] list of headers that should be used as HTTP headers in the request.
160
+ # @param body [String, OnlinePayments::SDK::Communication::MultipartFormDataObject] request body.
161
+ # @yield (Integer, Array<OnlinePayments::SDK::Communication::ResponseHeader>, IO) The status code, headers and body of the response.
162
+ # @raise [OnlinePayments::SDK::Communication::CommunicationException] when communication with the Online Payments platform was not successful.
163
+ def request(method, uri, request_headers, body = nil)
164
+ request_headers = convert_from_sdk_headers(request_headers)
165
+ request_id = SecureRandom.uuid
166
+ content_type = request_headers[CONTENT_TYPE]
167
+
168
+ info = { headers: request_headers, content_type: content_type }
169
+ info[:body] = body unless body.nil?
170
+
171
+ log_request(request_id, method.upcase, uri, info)
172
+
173
+ start_time = Time.now
174
+ begin
175
+ response_headers = nil
176
+ response_status_code = nil
177
+ response_content_type = nil
178
+ response_body = ''
179
+
180
+ if body.is_a? MultipartFormDataObject
181
+ multipart_request(method, uri, request_headers, body) do |status_code, headers, r_content_type, r_body|
182
+ response_headers = headers
183
+ response_status_code = status_code
184
+ response_content_type = r_content_type
185
+ unless binary_content_type? response_content_type
186
+ response_body = r_body.read.force_encoding('UTF-8')
187
+ r_body = StringIO.new(response_body)
188
+ end
189
+
190
+ yield status_code, headers, r_body
191
+ end
192
+ else
193
+ raw_request(method, uri, request_headers, body) do |status_code, headers, r_content_type, r_body|
194
+ response_headers = headers
195
+ response_status_code = status_code
196
+ response_content_type = r_content_type
197
+ unless binary_content_type? response_content_type
198
+ response_body = r_body.read.force_encoding('UTF-8')
199
+ r_body = StringIO.new(response_body)
200
+ end
201
+
202
+ yield status_code, headers, r_body
203
+ end
204
+ end
205
+
206
+ log_response(request_id, response_status_code, start_time,
207
+ headers: response_headers, body: response_body,
208
+ content_type: response_content_type)
209
+ rescue HTTPClient::TimeoutError => e
210
+ log_error(request_id, start_time, e)
211
+ raise CommunicationException, e
212
+ rescue HTTPClient::KeepAliveDisconnected, HTTPClient::RetryableResponse => e # retry these?
213
+ log_error(request_id, start_time, e)
214
+ raise CommunicationException, e
215
+ rescue StandardError => e
216
+ log_error(request_id, start_time, e)
217
+ raise CommunicationException, e
218
+ end
219
+ end
220
+
221
+ # logging code
222
+
223
+ # Sets the current body obfuscator to use.
224
+ # @param body_obfuscator [OnlinePayments::SDK::Logging::Obfuscation::BodyObfuscator]
225
+ def set_body_obfuscator(body_obfuscator)
226
+ raise ArgumentError, 'body_obfuscator is required' unless body_obfuscator
227
+
228
+ @body_obfuscator = body_obfuscator
229
+ end
230
+
231
+ # Sets the current header obfuscator to use.
232
+ # @param header_obfuscator [OnlinePayments::SDK::Logging::Obfuscation::HeaderObfuscator]
233
+ def set_header_obfuscator(header_obfuscator)
234
+ raise ArgumentError, 'header_obfuscator is required' unless header_obfuscator
235
+
236
+ @header_obfuscator = header_obfuscator
237
+ end
238
+
239
+ # Enables logging outgoing requests and incoming responses by registering the _communicator_logger_.
240
+ # Note that only one logger can be registered at a time and calling _enable_logging_
241
+ # a second time will override the old logger instance with the new one.
242
+ #
243
+ # @param communicator_logger [OnlinePayments::SDK::Logging::CommunicatorLogger] the communicator logger the requests and responses are logged to
244
+ def enable_logging(communicator_logger)
245
+ raise ArgumentError, 'communicator_logger is required' unless communicator_logger
246
+
247
+ @communicator_logger = communicator_logger
248
+ end
249
+
250
+ # Disables logging by unregistering any previous logger that might be registered.
251
+ def disable_logging
252
+ @communicator_logger = nil
253
+ end
254
+
255
+ private
256
+
257
+ # Converts a {OnlinePayments::SDK::Communication::RequestHeader} list headers to a hash
258
+ def convert_from_sdk_headers(headers)
259
+ headers.each_with_object({}) { |h, hash| hash[h.name] = h.value }
260
+ end
261
+
262
+ # Converts a hash to a {OnlinePayments::SDK::Communication::ResponseHeader} list
263
+ def convert_to_sdk_response_headers(headers)
264
+ arr ||= []
265
+ headers.each { |k, v| arr << ResponseHeader.new(k, v) }
266
+ arr
267
+ end
268
+
269
+ def log_request(request_id, method, uri, args = {})
270
+ logger = @communicator_logger
271
+ return unless logger
272
+
273
+ headers = args[:headers]
274
+ body = args[:body]
275
+ content_type = args[:content_type]
276
+ log_msg_builder = OnlinePayments::SDK::Logging::RequestLogMessageBuilder.new(request_id, method, uri,
277
+ @body_obfuscator,
278
+ @header_obfuscator)
279
+ headers.each { |k, v| log_msg_builder.add_headers(k, v) } if headers
280
+
281
+ if binary?(headers)
282
+ log_msg_builder.set_body('<binary content>', content_type)
283
+ else
284
+ log_msg_builder.set_body(body, content_type)
285
+ end
286
+
287
+ begin
288
+ logger.log(log_msg_builder.get_message)
289
+ rescue StandardError => e
290
+ logger.log("An error occurred trying to log request #{request_id}", e)
291
+ end
292
+ end
293
+
294
+ # Creates the log_response stream
295
+ # both based on whether or not it is binary and on the rest of the response
296
+ def log_response(request_id, status_code, start_time, args = {})
297
+ logger = @communicator_logger
298
+ return unless logger
299
+
300
+ duration = (Time.now - start_time) * 1000 # in milliseconds
301
+ headers = args[:headers]
302
+ body = args[:body] unless args[:body].nil?
303
+ content_type = args[:content_type]
304
+
305
+ log_msg_builder = OnlinePayments::SDK::Logging::ResponseLogMessageBuilder.new(request_id, status_code, duration,
306
+ @body_obfuscator,
307
+ @header_obfuscator)
308
+ unless headers.nil?
309
+ headers = convert_from_sdk_headers(headers)
310
+ headers.each do |key, value|
311
+ log_msg_builder.add_headers(key, value)
312
+ end
313
+ end
314
+
315
+ if binary_content_type?(content_type)
316
+ log_msg_builder.set_body('<binary content>', content_type)
317
+ else
318
+ log_msg_builder.set_body(body, content_type)
319
+ end
320
+
321
+ begin
322
+ logger.log(log_msg_builder.get_message)
323
+ rescue StandardError => e
324
+ logger.log("An error occurred trying to log response #{request_id}", e)
325
+ end
326
+ end
327
+
328
+ def log_error(request_id, start_time, thrown)
329
+ logger = @communicator_logger
330
+ return unless logger
331
+
332
+ duration = (Time.now - start_time) * 1000 # in millisecs
333
+ logger.log("Error occurred for outgoing request (requestId='#{request_id}', #{duration} ms)", thrown)
334
+ end
335
+
336
+ # @param headers [Hash]
337
+ def binary?(headers)
338
+ unless headers.nil?
339
+ content_type = nil
340
+ headers.each { |k, v| content_type = v if k.casecmp(CONTENT_TYPE).zero? }
341
+
342
+ binary_content_type?(content_type)
343
+ end
344
+ end
345
+
346
+ # @param content_type [String, nil]
347
+ def binary_content_type?(content_type)
348
+ unless content_type.nil?
349
+ content_type = content_type.downcase
350
+ return !content_type.start_with?('text/') &&
351
+ !content_type.include?('json') &&
352
+ !content_type.include?('xml')
353
+ end
354
+ false
355
+ end
356
+
357
+ # Makes a request using the specified method
358
+ #
359
+ # Yields a status code, an array of {OnlinePayments::SDK::Communication::ResponseHeader},
360
+ # the content_type and body
361
+ def raw_request(method, uri, headers, body = nil)
362
+ connection = if body
363
+ @http_client.send(method + '_async', uri, body: body, header: headers)
364
+ else
365
+ @http_client.send(method + '_async', uri, header: headers)
366
+ end
367
+
368
+ response = connection.pop
369
+ pipe = response.content
370
+ response_headers = convert_to_sdk_response_headers(response.headers)
371
+
372
+ begin
373
+ yield response.status_code, response_headers, response.content_type, pipe
374
+ ensure
375
+ pipe.close
376
+ end
377
+ end
378
+
379
+ # Makes a request using the specified method
380
+ #
381
+ # Yields a status code, an array of {OnlinePayments::SDK::Communication::ResponseHeader},
382
+ # the content_type and body
383
+ def multipart_request(method, uri, headers, body = nil)
384
+ unless body.is_a? MultipartFormDataObject
385
+ raise ArgumentError, 'body should be a MultipartFormDataObject'
386
+ end
387
+
388
+ if method != 'post' && method != 'put'
389
+ raise ArgumentError, "method #{method} is not supported"
390
+ end
391
+
392
+ connection = @http_client.send method + '_async',
393
+ uri,
394
+ body: multipart_request_body(body),
395
+ header: headers
396
+
397
+ response = connection.pop
398
+ pipe = response.content
399
+ response_headers = convert_to_sdk_response_headers(response.headers)
400
+
401
+ begin
402
+ yield response.status_code, response_headers, response.content_type, pipe
403
+ ensure
404
+ pipe.close
405
+ end
406
+ end
407
+
408
+ # Creates a request body for the multipart request
409
+ def multipart_request_body(body)
410
+ request_body = []
411
+ body.files.each do |k, v|
412
+ request_body.push :content => v.content,
413
+ 'Content-Type' => v.content_type,
414
+ 'Content-Disposition' => "form-data; name=\"#{k}\"; filename=\"#{v.file_name}\"",
415
+ 'Content-Transfer-Encoding' => 'binary'
416
+ end
417
+
418
+ body.values.each do |k, v|
419
+ request_body << { :content => v,
420
+ 'Content-Disposition' => "form-data; name=\"#{k}\"" }
421
+ end
422
+ request_body
423
+ end
424
+ end
425
+ end
426
+ end
427
+ end
@@ -0,0 +1,160 @@
1
+ require 'base64'
2
+ require 'onlinepayments/sdk/communication/request_header'
3
+ require 'onlinepayments/sdk/domain/data_object'
4
+ require 'onlinepayments/sdk/domain/shopping_cart_extension'
5
+ require 'onlinepayments/sdk/json/default_marshaller'
6
+
7
+ module OnlinePayments
8
+ module SDK
9
+ module Communication
10
+ # Manages metadata about the server using the SDK
11
+ #
12
+ # @attr_reader [Array<OnlinePayments::SDK::Communication::RequestHeader>] metadata_headers List of headers that should be used in all requests.
13
+ class MetadataProvider
14
+ private
15
+
16
+ SDK_VERSION = '5.0.0'.freeze
17
+ SERVER_META_INFO_HEADER = 'X-GCS-ServerMetaInfo'.freeze
18
+ PROHIBITED_HEADERS = [SERVER_META_INFO_HEADER, 'X-GCS-Idempotence-Key', 'Date', 'Content-Type', 'Authorization'].sort!.freeze
19
+ CHARSET = 'utf-8'.freeze
20
+
21
+ public
22
+
23
+ # Stores metadata about the server so it can be sent to the Online Payments platform
24
+ class ServerMetaInfo < OnlinePayments::SDK::Domain::DataObject
25
+ @platform_identifier = nil
26
+ @sdk_identifier = nil
27
+ @sdk_creator = nil
28
+ @integrator = nil
29
+ @shopping_cart_extension = nil
30
+
31
+ # String containing system information (Operating system and Ruby version).
32
+ attr_accessor :platform_identifier
33
+
34
+ # String containing this SDK version.
35
+ attr_accessor :sdk_identifier
36
+
37
+ attr_accessor :sdk_creator
38
+
39
+ attr_accessor :integrator
40
+
41
+ attr_accessor :shopping_cart_extension
42
+
43
+ # Returns the values of all attributes as a hash.
44
+ def to_h
45
+ hash = super
46
+ hash['platformIdentifier'] = @platform_identifier unless @platform_identifier.nil?
47
+ hash['sdkIdentifier'] = @sdk_identifier unless @sdk_identifier.nil?
48
+ hash['sdkCreator'] = @sdk_creator unless @sdk_creator.nil?
49
+ hash['integrator'] = @integrator unless @integrator.nil?
50
+ hash['shoppingCartExtension'] = @shopping_cart_extension.to_h unless @shopping_cart_extension.nil?
51
+ hash
52
+ end
53
+
54
+ # Initializes the ServerMetaInfo object with properties stored in the parameter hash
55
+ def from_hash(hash)
56
+ super
57
+ @platform_identifier = hash['platformIdentifier'] if hash.has_key? 'platformIdentifier'
58
+ @sdk_identifier = hash['sdkIdentifier'] if hash.has_key? 'sdkIdentifier'
59
+ @sdk_creator = hash['sdkCreator'] if hash.has_key? 'sdkCreator'
60
+ @integrator = hash['integrator'] if hash.has_key? 'integrator'
61
+ @shopping_cart_extension = OnlinePayments::SDK::Domain::ShoppingCartExtension.new_from_hash(hash['shoppingCartExtension']) if hash.has_key? 'shoppingCartExtension'
62
+ end
63
+ end
64
+
65
+ # Create a new MetadataProvider instance that can be used to access platform-related information
66
+ #
67
+ # @param integrator [String] Name of the integrator
68
+ # @param shopping_cart_extension [OnlinePayments::SDK::Domain::ShoppingCartExtension] shopping cart-related metadata.
69
+ # @param additional_request_headers [Array<OnlinePayments::SDK::Communication::RequestHeader>] list of additional headers to include in all requests made.
70
+ # The following headers are not allowed due to conflicts with already added headers:
71
+ # 'X-GCS-Idempotence-Key', 'Date', 'Content-Type', 'Authorization' and 'X-GCS-ServerMetaInfo'
72
+ def initialize(integrator, shopping_cart_extension: nil, additional_request_headers: [].freeze)
73
+ raise ArgumentError.new('integrator is required') if integrator.nil? or integrator.strip.empty?
74
+ MetadataProvider.validate_additional_request_headers(additional_request_headers)
75
+ server_meta_info = ServerMetaInfo.new
76
+ server_meta_info.platform_identifier = get_platform_identifier
77
+ server_meta_info.sdk_identifier = get_sdk_identifier
78
+ server_meta_info.sdk_creator = 'OnlinePayments'
79
+ server_meta_info.integrator = integrator
80
+ server_meta_info.shopping_cart_extension = shopping_cart_extension unless shopping_cart_extension.nil?
81
+ server_meta_info_string = OnlinePayments::SDK::JSON::DefaultMarshaller.instance.marshal(server_meta_info)
82
+ server_meta_info_header = RequestHeader.new(
83
+ SERVER_META_INFO_HEADER, Base64.strict_encode64(
84
+ server_meta_info_string.force_encoding('iso-8859-1').encode(CHARSET)))
85
+ if additional_request_headers.nil? || additional_request_headers.empty?
86
+ @metadata_headers = [server_meta_info_header].freeze
87
+ else
88
+ request_headers = [server_meta_info_header]
89
+ request_headers += additional_request_headers
90
+ @metadata_headers = request_headers.freeze
91
+ end
92
+ end
93
+
94
+ # Checks that none of the {OnlinePayments::SDK::Communication::RequestHeaders} in _additional_request_headers_ is equal to any of the forbidden headers.
95
+ # The forbidden headers are:
96
+ # 'X-GCS-Idempotence-Key', 'Date', 'Content-Type', 'Authorization' and 'X-GCS-ServerMetaInfo'
97
+ # If a header is found that is equal to one of the forbidden headers an ArgumentError is raised.
98
+ def self.validate_additional_request_headers(additional_request_headers)
99
+ unless additional_request_headers.nil?
100
+ additional_request_headers.each { |additional_request_header|
101
+ validate_additional_request_header(additional_request_header)
102
+ }
103
+ end
104
+ end
105
+
106
+ # Checks that the {OnlinePayments::SDK::Communication::RequestHeaders} _additional_request_header_ is equal to any of the forbidden headers.
107
+ # The forbidden headers are:
108
+ # 'X-GCS-Idempotence-Key', 'Date', 'Content-Type', 'Authorization' and 'X-GCS-ServerMetaInfo'
109
+ # If the header is equal to one of the forbidden headers an ArgumentError is raised.
110
+ def self.validate_additional_request_header(additional_request_header)
111
+ if prohibited_headers.include? additional_request_header.name
112
+ raise ArgumentError.new('request header not allowed' + additional_request_header.name)
113
+ end
114
+ end
115
+
116
+ protected
117
+
118
+ # String containing information of the system using the SDK.
119
+ # It contains data like Operating System version and Ruby version
120
+ def get_platform_identifier
121
+ config = RbConfig::CONFIG['host_os']
122
+ if config.include? 'mingw'
123
+ s = 'Windows'
124
+ elsif config.include? 'linux'
125
+ s = 'Linux'
126
+ else
127
+ s = 'Mac OS X'
128
+ end
129
+ s + '/' + RUBY_DESCRIPTION
130
+ end
131
+
132
+ # String describing the version of the SDK being used
133
+ def get_sdk_identifier
134
+ 'RubyServerSDK/v' + SDK_VERSION
135
+ end
136
+
137
+ public
138
+
139
+ # Version of this SDK being used
140
+ def self.sdk_version
141
+ SDK_VERSION
142
+ end
143
+
144
+ # A {OnlinePayments::SDK::Communication::RequestHeader} that contains serialized and encoded
145
+ # {OnlinePayments::SDK::Communication::MetadataProvider::ServerMetaInfo}.
146
+ def self.server_meta_info_header
147
+ SERVER_META_INFO_HEADER
148
+ end
149
+
150
+ # A list of header names that should not be used by any added headers.
151
+ # These headers are reserved for specific purposes.
152
+ def self.prohibited_headers
153
+ PROHIBITED_HEADERS
154
+ end
155
+
156
+ attr_reader :metadata_headers
157
+ end
158
+ end
159
+ end
160
+ end