onlinepayments-sdk-python3 7.4.1__py3-none-any.whl

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 (475) hide show
  1. onlinepayments/__init__.py +0 -0
  2. onlinepayments/sdk/__init__.py +4 -0
  3. onlinepayments/sdk/api_exception.py +60 -0
  4. onlinepayments/sdk/api_resource.py +57 -0
  5. onlinepayments/sdk/authentication/__init__.py +0 -0
  6. onlinepayments/sdk/authentication/authenticator.py +24 -0
  7. onlinepayments/sdk/authentication/authorization_type.py +10 -0
  8. onlinepayments/sdk/authentication/v1hmac_authenticator.py +122 -0
  9. onlinepayments/sdk/authorization_exception.py +19 -0
  10. onlinepayments/sdk/call_context.py +72 -0
  11. onlinepayments/sdk/client.py +107 -0
  12. onlinepayments/sdk/communication/__init__.py +0 -0
  13. onlinepayments/sdk/communication/communication_exception.py +8 -0
  14. onlinepayments/sdk/communication/connection.py +84 -0
  15. onlinepayments/sdk/communication/default_connection.py +313 -0
  16. onlinepayments/sdk/communication/i_metadata_provider.py +19 -0
  17. onlinepayments/sdk/communication/metadata_provider.py +132 -0
  18. onlinepayments/sdk/communication/multipart_form_data_object.py +51 -0
  19. onlinepayments/sdk/communication/multipart_form_data_request.py +16 -0
  20. onlinepayments/sdk/communication/not_found_exception.py +10 -0
  21. onlinepayments/sdk/communication/param_request.py +17 -0
  22. onlinepayments/sdk/communication/pooled_connection.py +29 -0
  23. onlinepayments/sdk/communication/request_header.py +60 -0
  24. onlinepayments/sdk/communication/request_param.py +30 -0
  25. onlinepayments/sdk/communication/response_exception.py +58 -0
  26. onlinepayments/sdk/communication/response_header.py +50 -0
  27. onlinepayments/sdk/communicator.py +465 -0
  28. onlinepayments/sdk/communicator_configuration.py +264 -0
  29. onlinepayments/sdk/declined_payment_exception.py +46 -0
  30. onlinepayments/sdk/declined_payout_exception.py +46 -0
  31. onlinepayments/sdk/declined_refund_exception.py +46 -0
  32. onlinepayments/sdk/declined_transaction_exception.py +22 -0
  33. onlinepayments/sdk/domain/__init__.py +4 -0
  34. onlinepayments/sdk/domain/acceptance.py +56 -0
  35. onlinepayments/sdk/domain/account_on_file.py +102 -0
  36. onlinepayments/sdk/domain/account_on_file_attribute.py +97 -0
  37. onlinepayments/sdk/domain/account_on_file_display_hints.py +64 -0
  38. onlinepayments/sdk/domain/acquirer_information.py +59 -0
  39. onlinepayments/sdk/domain/acquirer_selection_information.py +73 -0
  40. onlinepayments/sdk/domain/additional_order_input.py +107 -0
  41. onlinepayments/sdk/domain/address.py +145 -0
  42. onlinepayments/sdk/domain/address_personal.py +185 -0
  43. onlinepayments/sdk/domain/airline_data.py +519 -0
  44. onlinepayments/sdk/domain/airline_flight_leg.py +386 -0
  45. onlinepayments/sdk/domain/airline_passenger.py +129 -0
  46. onlinepayments/sdk/domain/amount_breakdown.py +63 -0
  47. onlinepayments/sdk/domain/amount_of_money.py +59 -0
  48. onlinepayments/sdk/domain/api_error.py +177 -0
  49. onlinepayments/sdk/domain/apple_pay_line_item.py +145 -0
  50. onlinepayments/sdk/domain/apple_pay_recurring_payment_request.py +116 -0
  51. onlinepayments/sdk/domain/bank_account_iban.py +37 -0
  52. onlinepayments/sdk/domain/batch_metadata.py +73 -0
  53. onlinepayments/sdk/domain/browser_data.py +130 -0
  54. onlinepayments/sdk/domain/calculate_surcharge_request.py +63 -0
  55. onlinepayments/sdk/domain/calculate_surcharge_response.py +44 -0
  56. onlinepayments/sdk/domain/cancel_payment_batch_request.py +57 -0
  57. onlinepayments/sdk/domain/cancel_payment_request.py +130 -0
  58. onlinepayments/sdk/domain/cancel_payment_response.py +41 -0
  59. onlinepayments/sdk/domain/capture.py +97 -0
  60. onlinepayments/sdk/domain/capture_output.py +272 -0
  61. onlinepayments/sdk/domain/capture_payment_batch_request.py +57 -0
  62. onlinepayments/sdk/domain/capture_payment_request.py +148 -0
  63. onlinepayments/sdk/domain/capture_response.py +99 -0
  64. onlinepayments/sdk/domain/capture_status_output.py +37 -0
  65. onlinepayments/sdk/domain/captures_response.py +46 -0
  66. onlinepayments/sdk/domain/card.py +91 -0
  67. onlinepayments/sdk/domain/card_bin_details.py +384 -0
  68. onlinepayments/sdk/domain/card_data_without_cvv.py +73 -0
  69. onlinepayments/sdk/domain/card_essentials.py +438 -0
  70. onlinepayments/sdk/domain/card_fraud_results.py +112 -0
  71. onlinepayments/sdk/domain/card_info.py +55 -0
  72. onlinepayments/sdk/domain/card_payment_method_specific_input.py +608 -0
  73. onlinepayments/sdk/domain/card_payment_method_specific_input_base.py +441 -0
  74. onlinepayments/sdk/domain/card_payment_method_specific_input_for_hosted_checkout.py +105 -0
  75. onlinepayments/sdk/domain/card_payment_method_specific_output.py +467 -0
  76. onlinepayments/sdk/domain/card_payout_method_specific_input.py +99 -0
  77. onlinepayments/sdk/domain/card_recurrence_details.py +40 -0
  78. onlinepayments/sdk/domain/card_source.py +95 -0
  79. onlinepayments/sdk/domain/card_without_cvv.py +73 -0
  80. onlinepayments/sdk/domain/click_to_pay.py +37 -0
  81. onlinepayments/sdk/domain/company_information.py +37 -0
  82. onlinepayments/sdk/domain/complete_payment_card_payment_method_specific_input.py +39 -0
  83. onlinepayments/sdk/domain/complete_payment_request.py +61 -0
  84. onlinepayments/sdk/domain/complete_payment_response.py +85 -0
  85. onlinepayments/sdk/domain/contact_details.py +109 -0
  86. onlinepayments/sdk/domain/create_certificate_response.py +55 -0
  87. onlinepayments/sdk/domain/create_hosted_checkout_request.py +195 -0
  88. onlinepayments/sdk/domain/create_hosted_checkout_response.py +132 -0
  89. onlinepayments/sdk/domain/create_hosted_fields_session_request.py +37 -0
  90. onlinepayments/sdk/domain/create_hosted_fields_session_response.py +102 -0
  91. onlinepayments/sdk/domain/create_hosted_tokenization_request.py +133 -0
  92. onlinepayments/sdk/domain/create_hosted_tokenization_response.py +127 -0
  93. onlinepayments/sdk/domain/create_mandate_request.py +187 -0
  94. onlinepayments/sdk/domain/create_mandate_response.py +63 -0
  95. onlinepayments/sdk/domain/create_mandate_with_return_url.py +187 -0
  96. onlinepayments/sdk/domain/create_payment_link_request.py +344 -0
  97. onlinepayments/sdk/domain/create_payment_request.py +249 -0
  98. onlinepayments/sdk/domain/create_payment_response.py +85 -0
  99. onlinepayments/sdk/domain/create_payout_request.py +176 -0
  100. onlinepayments/sdk/domain/create_token_request.py +77 -0
  101. onlinepayments/sdk/domain/created_payment_output.py +57 -0
  102. onlinepayments/sdk/domain/created_token_response.py +142 -0
  103. onlinepayments/sdk/domain/credit_card_specific_input_hosted_tokenization.py +66 -0
  104. onlinepayments/sdk/domain/credit_card_validation_rules.py +55 -0
  105. onlinepayments/sdk/domain/credit_card_validation_rules_hosted_tokenization.py +55 -0
  106. onlinepayments/sdk/domain/crm_token.py +55 -0
  107. onlinepayments/sdk/domain/csr_request.py +37 -0
  108. onlinepayments/sdk/domain/currency_conversion.py +59 -0
  109. onlinepayments/sdk/domain/currency_conversion_input.py +55 -0
  110. onlinepayments/sdk/domain/currency_conversion_request.py +59 -0
  111. onlinepayments/sdk/domain/currency_conversion_response.py +81 -0
  112. onlinepayments/sdk/domain/currency_conversion_result.py +61 -0
  113. onlinepayments/sdk/domain/currency_conversion_specific_input.py +40 -0
  114. onlinepayments/sdk/domain/customer.py +234 -0
  115. onlinepayments/sdk/domain/customer_account.py +204 -0
  116. onlinepayments/sdk/domain/customer_account_authentication.py +81 -0
  117. onlinepayments/sdk/domain/customer_bank_account.py +73 -0
  118. onlinepayments/sdk/domain/customer_device.py +155 -0
  119. onlinepayments/sdk/domain/customer_device_output.py +37 -0
  120. onlinepayments/sdk/domain/customer_output.py +41 -0
  121. onlinepayments/sdk/domain/customer_payment_activity.py +73 -0
  122. onlinepayments/sdk/domain/customer_token.py +83 -0
  123. onlinepayments/sdk/domain/data_object.py +47 -0
  124. onlinepayments/sdk/domain/dcc_card_source.py +93 -0
  125. onlinepayments/sdk/domain/dcc_proposal.py +118 -0
  126. onlinepayments/sdk/domain/decrypted_payment_data.py +120 -0
  127. onlinepayments/sdk/domain/detokenization_response.py +46 -0
  128. onlinepayments/sdk/domain/detokenized_token_response.py +145 -0
  129. onlinepayments/sdk/domain/directory_entry.py +73 -0
  130. onlinepayments/sdk/domain/discount.py +41 -0
  131. onlinepayments/sdk/domain/empty_validator.py +16 -0
  132. onlinepayments/sdk/domain/error_response.py +64 -0
  133. onlinepayments/sdk/domain/external_cardholder_authentication_data.py +216 -0
  134. onlinepayments/sdk/domain/external_token_linked.py +75 -0
  135. onlinepayments/sdk/domain/feedbacks.py +64 -0
  136. onlinepayments/sdk/domain/fixed_list_validator.py +42 -0
  137. onlinepayments/sdk/domain/fraud_fields.py +84 -0
  138. onlinepayments/sdk/domain/fraud_results.py +43 -0
  139. onlinepayments/sdk/domain/g_pay_three_d_secure.py +159 -0
  140. onlinepayments/sdk/domain/get_batch_status_response.py +91 -0
  141. onlinepayments/sdk/domain/get_hosted_checkout_response.py +63 -0
  142. onlinepayments/sdk/domain/get_hosted_tokenization_response.py +61 -0
  143. onlinepayments/sdk/domain/get_iin_details_request.py +57 -0
  144. onlinepayments/sdk/domain/get_iin_details_response.py +450 -0
  145. onlinepayments/sdk/domain/get_mandate_response.py +41 -0
  146. onlinepayments/sdk/domain/get_payment_product_groups_response.py +44 -0
  147. onlinepayments/sdk/domain/get_payment_products_response.py +44 -0
  148. onlinepayments/sdk/domain/get_privacy_policy_response.py +37 -0
  149. onlinepayments/sdk/domain/gift_card_purchase.py +59 -0
  150. onlinepayments/sdk/domain/hosted_checkout_specific_input.py +250 -0
  151. onlinepayments/sdk/domain/hosted_checkout_specific_output.py +55 -0
  152. onlinepayments/sdk/domain/iin_detail.py +423 -0
  153. onlinepayments/sdk/domain/import_cof_series_request.py +113 -0
  154. onlinepayments/sdk/domain/import_cof_series_response.py +37 -0
  155. onlinepayments/sdk/domain/label_template_element.py +55 -0
  156. onlinepayments/sdk/domain/length_validator.py +51 -0
  157. onlinepayments/sdk/domain/line_item.py +107 -0
  158. onlinepayments/sdk/domain/line_item_detail.py +99 -0
  159. onlinepayments/sdk/domain/line_item_invoice_data.py +37 -0
  160. onlinepayments/sdk/domain/loan_recipient.py +109 -0
  161. onlinepayments/sdk/domain/lodging_data.py +37 -0
  162. onlinepayments/sdk/domain/mandate_address.py +109 -0
  163. onlinepayments/sdk/domain/mandate_address_response.py +109 -0
  164. onlinepayments/sdk/domain/mandate_contact_details.py +37 -0
  165. onlinepayments/sdk/domain/mandate_customer.py +125 -0
  166. onlinepayments/sdk/domain/mandate_customer_response.py +125 -0
  167. onlinepayments/sdk/domain/mandate_merchant_action.py +61 -0
  168. onlinepayments/sdk/domain/mandate_personal_information.py +59 -0
  169. onlinepayments/sdk/domain/mandate_personal_information_response.py +59 -0
  170. onlinepayments/sdk/domain/mandate_personal_name.py +55 -0
  171. onlinepayments/sdk/domain/mandate_personal_name_response.py +55 -0
  172. onlinepayments/sdk/domain/mandate_redirect_data.py +55 -0
  173. onlinepayments/sdk/domain/mandate_response.py +150 -0
  174. onlinepayments/sdk/domain/market_place.py +55 -0
  175. onlinepayments/sdk/domain/merchant_action.py +132 -0
  176. onlinepayments/sdk/domain/mobile_payment_data.py +55 -0
  177. onlinepayments/sdk/domain/mobile_payment_method_hosted_checkout_specific_input.py +105 -0
  178. onlinepayments/sdk/domain/mobile_payment_method_specific_input.py +202 -0
  179. onlinepayments/sdk/domain/mobile_payment_method_specific_output.py +139 -0
  180. onlinepayments/sdk/domain/mobile_payment_product302_specific_input.py +103 -0
  181. onlinepayments/sdk/domain/mobile_payment_product320_specific_input.py +103 -0
  182. onlinepayments/sdk/domain/mobile_three_d_secure_challenge_parameters.py +91 -0
  183. onlinepayments/sdk/domain/multiple_payment_information.py +57 -0
  184. onlinepayments/sdk/domain/network_token_data.py +127 -0
  185. onlinepayments/sdk/domain/network_token_essentials.py +134 -0
  186. onlinepayments/sdk/domain/network_token_linked.py +80 -0
  187. onlinepayments/sdk/domain/omnichannel_payment_specific_input.py +37 -0
  188. onlinepayments/sdk/domain/omnichannel_payout_specific_input.py +55 -0
  189. onlinepayments/sdk/domain/omnichannel_refund_specific_input.py +37 -0
  190. onlinepayments/sdk/domain/omnichannel_subsequent_specific_input.py +37 -0
  191. onlinepayments/sdk/domain/operation_output.py +161 -0
  192. onlinepayments/sdk/domain/operation_payment_references.py +55 -0
  193. onlinepayments/sdk/domain/order.py +213 -0
  194. onlinepayments/sdk/domain/order_line_details.py +189 -0
  195. onlinepayments/sdk/domain/order_references.py +120 -0
  196. onlinepayments/sdk/domain/order_status_output.py +119 -0
  197. onlinepayments/sdk/domain/order_type_information.py +64 -0
  198. onlinepayments/sdk/domain/other_details.py +55 -0
  199. onlinepayments/sdk/domain/payment_account_on_file.py +57 -0
  200. onlinepayments/sdk/domain/payment_context.py +77 -0
  201. onlinepayments/sdk/domain/payment_creation_output.py +94 -0
  202. onlinepayments/sdk/domain/payment_details_response.py +148 -0
  203. onlinepayments/sdk/domain/payment_error_response.py +84 -0
  204. onlinepayments/sdk/domain/payment_link_event.py +73 -0
  205. onlinepayments/sdk/domain/payment_link_order_input.py +84 -0
  206. onlinepayments/sdk/domain/payment_link_order_output.py +81 -0
  207. onlinepayments/sdk/domain/payment_link_response.py +216 -0
  208. onlinepayments/sdk/domain/payment_link_specific_input.py +74 -0
  209. onlinepayments/sdk/domain/payment_links_response.py +44 -0
  210. onlinepayments/sdk/domain/payment_output.py +335 -0
  211. onlinepayments/sdk/domain/payment_product.py +296 -0
  212. onlinepayments/sdk/domain/payment_product130_specific_input.py +41 -0
  213. onlinepayments/sdk/domain/payment_product130_specific_three_d_secure.py +91 -0
  214. onlinepayments/sdk/domain/payment_product3012.py +55 -0
  215. onlinepayments/sdk/domain/payment_product3012_specific_input.py +100 -0
  216. onlinepayments/sdk/domain/payment_product3013_specific_input.py +73 -0
  217. onlinepayments/sdk/domain/payment_product302_specific_data.py +44 -0
  218. onlinepayments/sdk/domain/payment_product3203_specific_output.py +62 -0
  219. onlinepayments/sdk/domain/payment_product3204_specific_output.py +37 -0
  220. onlinepayments/sdk/domain/payment_product3208_specific_input.py +37 -0
  221. onlinepayments/sdk/domain/payment_product3208_specific_output.py +37 -0
  222. onlinepayments/sdk/domain/payment_product3209_specific_input.py +37 -0
  223. onlinepayments/sdk/domain/payment_product3209_specific_output.py +37 -0
  224. onlinepayments/sdk/domain/payment_product320_specific_data.py +62 -0
  225. onlinepayments/sdk/domain/payment_product350.py +55 -0
  226. onlinepayments/sdk/domain/payment_product5001.py +58 -0
  227. onlinepayments/sdk/domain/payment_product5001_specific_output.py +112 -0
  228. onlinepayments/sdk/domain/payment_product5100_specific_input.py +37 -0
  229. onlinepayments/sdk/domain/payment_product5402_specific_output.py +37 -0
  230. onlinepayments/sdk/domain/payment_product5404.py +55 -0
  231. onlinepayments/sdk/domain/payment_product5407.py +55 -0
  232. onlinepayments/sdk/domain/payment_product5500_specific_output.py +91 -0
  233. onlinepayments/sdk/domain/payment_product771_specific_output.py +37 -0
  234. onlinepayments/sdk/domain/payment_product840.py +37 -0
  235. onlinepayments/sdk/domain/payment_product840_customer_account.py +170 -0
  236. onlinepayments/sdk/domain/payment_product840_specific_output.py +167 -0
  237. onlinepayments/sdk/domain/payment_product_display_hints.py +73 -0
  238. onlinepayments/sdk/domain/payment_product_field.py +95 -0
  239. onlinepayments/sdk/domain/payment_product_field_data_restrictions.py +60 -0
  240. onlinepayments/sdk/domain/payment_product_field_display_element.py +97 -0
  241. onlinepayments/sdk/domain/payment_product_field_display_hints.py +218 -0
  242. onlinepayments/sdk/domain/payment_product_field_form_element.py +72 -0
  243. onlinepayments/sdk/domain/payment_product_field_tooltip.py +57 -0
  244. onlinepayments/sdk/domain/payment_product_field_validators.py +195 -0
  245. onlinepayments/sdk/domain/payment_product_filter.py +67 -0
  246. onlinepayments/sdk/domain/payment_product_filter_hosted_tokenization.py +42 -0
  247. onlinepayments/sdk/domain/payment_product_filters_hosted_checkout.py +62 -0
  248. onlinepayments/sdk/domain/payment_product_filters_hosted_tokenization.py +62 -0
  249. onlinepayments/sdk/domain/payment_product_group.py +103 -0
  250. onlinepayments/sdk/domain/payment_product_networks_response.py +42 -0
  251. onlinepayments/sdk/domain/payment_references.py +73 -0
  252. onlinepayments/sdk/domain/payment_response.py +143 -0
  253. onlinepayments/sdk/domain/payment_status_output.py +152 -0
  254. onlinepayments/sdk/domain/payout_error_response.py +80 -0
  255. onlinepayments/sdk/domain/payout_output.py +63 -0
  256. onlinepayments/sdk/domain/payout_response.py +93 -0
  257. onlinepayments/sdk/domain/payout_result.py +93 -0
  258. onlinepayments/sdk/domain/payout_status_output.py +76 -0
  259. onlinepayments/sdk/domain/pending_authentication.py +37 -0
  260. onlinepayments/sdk/domain/personal_information.py +77 -0
  261. onlinepayments/sdk/domain/personal_information_token.py +39 -0
  262. onlinepayments/sdk/domain/personal_name.py +73 -0
  263. onlinepayments/sdk/domain/personal_name_token.py +51 -0
  264. onlinepayments/sdk/domain/product302_recurring.py +37 -0
  265. onlinepayments/sdk/domain/product320_recurring.py +37 -0
  266. onlinepayments/sdk/domain/product_directory.py +46 -0
  267. onlinepayments/sdk/domain/protection_eligibility.py +59 -0
  268. onlinepayments/sdk/domain/range_validator.py +51 -0
  269. onlinepayments/sdk/domain/rate_details.py +109 -0
  270. onlinepayments/sdk/domain/reattempt_instructions.py +82 -0
  271. onlinepayments/sdk/domain/reattempt_instructions_conditions.py +55 -0
  272. onlinepayments/sdk/domain/redirect_data.py +55 -0
  273. onlinepayments/sdk/domain/redirect_payment_method_specific_input.py +575 -0
  274. onlinepayments/sdk/domain/redirect_payment_method_specific_output.py +267 -0
  275. onlinepayments/sdk/domain/redirect_payment_product11_specific_input.py +38 -0
  276. onlinepayments/sdk/domain/redirect_payment_product3103_specific_input.py +40 -0
  277. onlinepayments/sdk/domain/redirect_payment_product3112_specific_input.py +40 -0
  278. onlinepayments/sdk/domain/redirect_payment_product3116_specific_input.py +40 -0
  279. onlinepayments/sdk/domain/redirect_payment_product3203_specific_input.py +40 -0
  280. onlinepayments/sdk/domain/redirect_payment_product3204_specific_input.py +55 -0
  281. onlinepayments/sdk/domain/redirect_payment_product3302_specific_input.py +73 -0
  282. onlinepayments/sdk/domain/redirect_payment_product3306_specific_input.py +37 -0
  283. onlinepayments/sdk/domain/redirect_payment_product3307_specific_input.py +16 -0
  284. onlinepayments/sdk/domain/redirect_payment_product5001_specific_input.py +62 -0
  285. onlinepayments/sdk/domain/redirect_payment_product5300_specific_input.py +163 -0
  286. onlinepayments/sdk/domain/redirect_payment_product5402_specific_input.py +40 -0
  287. onlinepayments/sdk/domain/redirect_payment_product5403_specific_input.py +40 -0
  288. onlinepayments/sdk/domain/redirect_payment_product5406_specific_input.py +41 -0
  289. onlinepayments/sdk/domain/redirect_payment_product5408_specific_input.py +60 -0
  290. onlinepayments/sdk/domain/redirect_payment_product5410_specific_input.py +38 -0
  291. onlinepayments/sdk/domain/redirect_payment_product5412_specific_input.py +55 -0
  292. onlinepayments/sdk/domain/redirect_payment_product5601_specific_input.py +40 -0
  293. onlinepayments/sdk/domain/redirect_payment_product809_specific_input.py +40 -0
  294. onlinepayments/sdk/domain/redirect_payment_product840_specific_input.py +100 -0
  295. onlinepayments/sdk/domain/redirection_data.py +37 -0
  296. onlinepayments/sdk/domain/refund_card_method_specific_output.py +71 -0
  297. onlinepayments/sdk/domain/refund_e_wallet_method_specific_output.py +71 -0
  298. onlinepayments/sdk/domain/refund_error_response.py +82 -0
  299. onlinepayments/sdk/domain/refund_mobile_method_specific_output.py +69 -0
  300. onlinepayments/sdk/domain/refund_output.py +217 -0
  301. onlinepayments/sdk/domain/refund_payment_batch_request.py +57 -0
  302. onlinepayments/sdk/domain/refund_payment_product840_customer_account.py +69 -0
  303. onlinepayments/sdk/domain/refund_payment_product840_specific_output.py +39 -0
  304. onlinepayments/sdk/domain/refund_redirect_method_specific_output.py +51 -0
  305. onlinepayments/sdk/domain/refund_redirect_payment_method_specific_input.py +41 -0
  306. onlinepayments/sdk/domain/refund_redirect_payment_product900_specific_input.py +37 -0
  307. onlinepayments/sdk/domain/refund_request.py +210 -0
  308. onlinepayments/sdk/domain/refund_response.py +97 -0
  309. onlinepayments/sdk/domain/refunds_response.py +46 -0
  310. onlinepayments/sdk/domain/regular_expression_validator.py +35 -0
  311. onlinepayments/sdk/domain/revoke_mandate_request.py +48 -0
  312. onlinepayments/sdk/domain/send_test_request.py +37 -0
  313. onlinepayments/sdk/domain/sepa_direct_debit_payment_method_specific_input.py +59 -0
  314. onlinepayments/sdk/domain/sepa_direct_debit_payment_method_specific_input_base.py +59 -0
  315. onlinepayments/sdk/domain/sepa_direct_debit_payment_method_specific_output.py +81 -0
  316. onlinepayments/sdk/domain/sepa_direct_debit_payment_product771_specific_input.py +59 -0
  317. onlinepayments/sdk/domain/sepa_direct_debit_payment_product771_specific_input_base.py +59 -0
  318. onlinepayments/sdk/domain/session_data.py +116 -0
  319. onlinepayments/sdk/domain/session_details.py +55 -0
  320. onlinepayments/sdk/domain/session_request.py +44 -0
  321. onlinepayments/sdk/domain/session_response.py +114 -0
  322. onlinepayments/sdk/domain/shipping.py +214 -0
  323. onlinepayments/sdk/domain/shipping_detail.py +63 -0
  324. onlinepayments/sdk/domain/shipping_method.py +91 -0
  325. onlinepayments/sdk/domain/shopping_cart.py +155 -0
  326. onlinepayments/sdk/domain/shopping_cart_extension.py +77 -0
  327. onlinepayments/sdk/domain/shopping_cart_output.py +46 -0
  328. onlinepayments/sdk/domain/show_form_data.py +173 -0
  329. onlinepayments/sdk/domain/show_instructions_data.py +37 -0
  330. onlinepayments/sdk/domain/split_payment_product_filter.py +42 -0
  331. onlinepayments/sdk/domain/split_payment_product_filters_hosted_checkout.py +62 -0
  332. onlinepayments/sdk/domain/submit_batch_request_body.py +230 -0
  333. onlinepayments/sdk/domain/submit_batch_response.py +55 -0
  334. onlinepayments/sdk/domain/subsequent_card_payment_method_specific_input.py +175 -0
  335. onlinepayments/sdk/domain/subsequent_payment_batch_request.py +57 -0
  336. onlinepayments/sdk/domain/subsequent_payment_product5001_specific_input.py +41 -0
  337. onlinepayments/sdk/domain/subsequent_payment_request.py +107 -0
  338. onlinepayments/sdk/domain/subsequent_payment_response.py +41 -0
  339. onlinepayments/sdk/domain/surcharge.py +141 -0
  340. onlinepayments/sdk/domain/surcharge_calculation_card.py +55 -0
  341. onlinepayments/sdk/domain/surcharge_for_payment_link.py +40 -0
  342. onlinepayments/sdk/domain/surcharge_rate.py +91 -0
  343. onlinepayments/sdk/domain/surcharge_specific_input.py +62 -0
  344. onlinepayments/sdk/domain/surcharge_specific_output.py +84 -0
  345. onlinepayments/sdk/domain/test_connection.py +35 -0
  346. onlinepayments/sdk/domain/three_d_secure.py +281 -0
  347. onlinepayments/sdk/domain/three_d_secure_base.py +219 -0
  348. onlinepayments/sdk/domain/three_d_secure_data.py +78 -0
  349. onlinepayments/sdk/domain/three_d_secure_results.py +266 -0
  350. onlinepayments/sdk/domain/token_card.py +57 -0
  351. onlinepayments/sdk/domain/token_card_data.py +83 -0
  352. onlinepayments/sdk/domain/token_card_specific_input.py +41 -0
  353. onlinepayments/sdk/domain/token_data.py +63 -0
  354. onlinepayments/sdk/domain/token_e_wallet.py +59 -0
  355. onlinepayments/sdk/domain/token_response.py +181 -0
  356. onlinepayments/sdk/domain/transaction.py +41 -0
  357. onlinepayments/sdk/domain/uploadable_file.py +51 -0
  358. onlinepayments/sdk/domain/validate_credentials_request.py +55 -0
  359. onlinepayments/sdk/domain/validate_credentials_response.py +37 -0
  360. onlinepayments/sdk/domain/value_mapping_element.py +62 -0
  361. onlinepayments/sdk/domain/web_hooks_event.py +214 -0
  362. onlinepayments/sdk/exception_factory.py +75 -0
  363. onlinepayments/sdk/factory.py +127 -0
  364. onlinepayments/sdk/i_client.py +78 -0
  365. onlinepayments/sdk/i_communicator.py +180 -0
  366. onlinepayments/sdk/idempotence_exception.py +36 -0
  367. onlinepayments/sdk/json/__init__.py +0 -0
  368. onlinepayments/sdk/json/default_marshaller.py +60 -0
  369. onlinepayments/sdk/json/marshaller.py +32 -0
  370. onlinepayments/sdk/json/marshaller_syntax_exception.py +13 -0
  371. onlinepayments/sdk/log/__init__.py +0 -0
  372. onlinepayments/sdk/log/body_obfuscator.py +113 -0
  373. onlinepayments/sdk/log/communicator_logger.py +35 -0
  374. onlinepayments/sdk/log/header_obfuscator.py +49 -0
  375. onlinepayments/sdk/log/log_message.py +94 -0
  376. onlinepayments/sdk/log/logging_capable.py +26 -0
  377. onlinepayments/sdk/log/obfuscation_capable.py +24 -0
  378. onlinepayments/sdk/log/obfuscation_rule.py +50 -0
  379. onlinepayments/sdk/log/python_communicator_logger.py +54 -0
  380. onlinepayments/sdk/log/request_log_message.py +28 -0
  381. onlinepayments/sdk/log/response_log_message.py +37 -0
  382. onlinepayments/sdk/log/sys_out_communicator_logger.py +36 -0
  383. onlinepayments/sdk/merchant/__init__.py +4 -0
  384. onlinepayments/sdk/merchant/captures/__init__.py +4 -0
  385. onlinepayments/sdk/merchant/captures/captures_client.py +63 -0
  386. onlinepayments/sdk/merchant/captures/i_captures_client.py +34 -0
  387. onlinepayments/sdk/merchant/cofseries/__init__.py +4 -0
  388. onlinepayments/sdk/merchant/cofseries/cof_series_client.py +62 -0
  389. onlinepayments/sdk/merchant/cofseries/i_cof_series_client.py +35 -0
  390. onlinepayments/sdk/merchant/complete/__init__.py +4 -0
  391. onlinepayments/sdk/merchant/complete/complete_client.py +67 -0
  392. onlinepayments/sdk/merchant/complete/i_complete_client.py +37 -0
  393. onlinepayments/sdk/merchant/hostedcheckout/__init__.py +4 -0
  394. onlinepayments/sdk/merchant/hostedcheckout/hosted_checkout_client.py +99 -0
  395. onlinepayments/sdk/merchant/hostedcheckout/i_hosted_checkout_client.py +55 -0
  396. onlinepayments/sdk/merchant/hostedfields/__init__.py +4 -0
  397. onlinepayments/sdk/merchant/hostedfields/hosted_fields_client.py +62 -0
  398. onlinepayments/sdk/merchant/hostedfields/i_hosted_fields_client.py +35 -0
  399. onlinepayments/sdk/merchant/hostedtokenization/__init__.py +4 -0
  400. onlinepayments/sdk/merchant/hostedtokenization/hosted_tokenization_client.py +99 -0
  401. onlinepayments/sdk/merchant/hostedtokenization/i_hosted_tokenization_client.py +55 -0
  402. onlinepayments/sdk/merchant/i_merchant_client.py +202 -0
  403. onlinepayments/sdk/merchant/mandates/__init__.py +4 -0
  404. onlinepayments/sdk/merchant/mandates/i_mandates_client.py +114 -0
  405. onlinepayments/sdk/merchant/mandates/mandates_client.py +212 -0
  406. onlinepayments/sdk/merchant/merchant_client.py +232 -0
  407. onlinepayments/sdk/merchant/merchantbatch/__init__.py +4 -0
  408. onlinepayments/sdk/merchant/merchantbatch/i_merchant_batch_client.py +74 -0
  409. onlinepayments/sdk/merchant/merchantbatch/merchant_batch_client.py +138 -0
  410. onlinepayments/sdk/merchant/paymentlinks/__init__.py +4 -0
  411. onlinepayments/sdk/merchant/paymentlinks/get_payment_links_in_bulk_params.py +36 -0
  412. onlinepayments/sdk/merchant/paymentlinks/i_payment_links_client.py +73 -0
  413. onlinepayments/sdk/merchant/paymentlinks/payment_links_client.py +135 -0
  414. onlinepayments/sdk/merchant/payments/__init__.py +4 -0
  415. onlinepayments/sdk/merchant/payments/i_payments_client.py +143 -0
  416. onlinepayments/sdk/merchant/payments/payments_client.py +260 -0
  417. onlinepayments/sdk/merchant/payouts/__init__.py +4 -0
  418. onlinepayments/sdk/merchant/payouts/i_payouts_client.py +55 -0
  419. onlinepayments/sdk/merchant/payouts/payouts_client.py +100 -0
  420. onlinepayments/sdk/merchant/privacypolicy/__init__.py +4 -0
  421. onlinepayments/sdk/merchant/privacypolicy/get_privacy_policy_params.py +54 -0
  422. onlinepayments/sdk/merchant/privacypolicy/i_privacy_policy_client.py +36 -0
  423. onlinepayments/sdk/merchant/privacypolicy/privacy_policy_client.py +61 -0
  424. onlinepayments/sdk/merchant/productgroups/__init__.py +4 -0
  425. onlinepayments/sdk/merchant/productgroups/get_product_group_params.py +140 -0
  426. onlinepayments/sdk/merchant/productgroups/get_product_groups_params.py +140 -0
  427. onlinepayments/sdk/merchant/productgroups/i_product_groups_client.py +58 -0
  428. onlinepayments/sdk/merchant/productgroups/product_groups_client.py +100 -0
  429. onlinepayments/sdk/merchant/products/__init__.py +4 -0
  430. onlinepayments/sdk/merchant/products/get_payment_product_networks_params.py +89 -0
  431. onlinepayments/sdk/merchant/products/get_payment_product_params.py +138 -0
  432. onlinepayments/sdk/merchant/products/get_payment_products_params.py +138 -0
  433. onlinepayments/sdk/merchant/products/get_product_directory_params.py +54 -0
  434. onlinepayments/sdk/merchant/products/i_products_client.py +102 -0
  435. onlinepayments/sdk/merchant/products/products_client.py +178 -0
  436. onlinepayments/sdk/merchant/refunds/__init__.py +4 -0
  437. onlinepayments/sdk/merchant/refunds/i_refunds_client.py +34 -0
  438. onlinepayments/sdk/merchant/refunds/refunds_client.py +63 -0
  439. onlinepayments/sdk/merchant/services/__init__.py +4 -0
  440. onlinepayments/sdk/merchant/services/i_services_client.py +96 -0
  441. onlinepayments/sdk/merchant/services/services_client.py +167 -0
  442. onlinepayments/sdk/merchant/sessions/__init__.py +4 -0
  443. onlinepayments/sdk/merchant/sessions/i_sessions_client.py +35 -0
  444. onlinepayments/sdk/merchant/sessions/sessions_client.py +62 -0
  445. onlinepayments/sdk/merchant/subsequent/__init__.py +4 -0
  446. onlinepayments/sdk/merchant/subsequent/i_subsequent_client.py +37 -0
  447. onlinepayments/sdk/merchant/subsequent/subsequent_client.py +67 -0
  448. onlinepayments/sdk/merchant/tokenization/__init__.py +4 -0
  449. onlinepayments/sdk/merchant/tokenization/get_card_data_by_payments_params.py +48 -0
  450. onlinepayments/sdk/merchant/tokenization/get_card_data_by_tokens_params.py +48 -0
  451. onlinepayments/sdk/merchant/tokenization/i_tokenization_client.py +77 -0
  452. onlinepayments/sdk/merchant/tokenization/tokenization_client.py +131 -0
  453. onlinepayments/sdk/merchant/tokens/__init__.py +4 -0
  454. onlinepayments/sdk/merchant/tokens/i_tokens_client.py +74 -0
  455. onlinepayments/sdk/merchant/tokens/tokens_client.py +135 -0
  456. onlinepayments/sdk/merchant/webhooks/__init__.py +4 -0
  457. onlinepayments/sdk/merchant/webhooks/i_webhooks_client.py +55 -0
  458. onlinepayments/sdk/merchant/webhooks/webhooks_client.py +97 -0
  459. onlinepayments/sdk/platform_exception.py +19 -0
  460. onlinepayments/sdk/proxy_configuration.py +102 -0
  461. onlinepayments/sdk/reference_exception.py +19 -0
  462. onlinepayments/sdk/validation_exception.py +19 -0
  463. onlinepayments/sdk/webhooks/__init__.py +0 -0
  464. onlinepayments/sdk/webhooks/api_version_mismatch_exception.py +24 -0
  465. onlinepayments/sdk/webhooks/in_memory_secret_key_store.py +48 -0
  466. onlinepayments/sdk/webhooks/secret_key_not_available_exception.py +18 -0
  467. onlinepayments/sdk/webhooks/secret_key_store.py +15 -0
  468. onlinepayments/sdk/webhooks/signature_validation_exception.py +17 -0
  469. onlinepayments/sdk/webhooks/signature_validator.py +56 -0
  470. onlinepayments/sdk/webhooks/webhooks_helper.py +52 -0
  471. onlinepayments_sdk_python3-7.4.1.dist-info/METADATA +154 -0
  472. onlinepayments_sdk_python3-7.4.1.dist-info/RECORD +475 -0
  473. onlinepayments_sdk_python3-7.4.1.dist-info/WHEEL +5 -0
  474. onlinepayments_sdk_python3-7.4.1.dist-info/licenses/LICENSE.txt +52 -0
  475. onlinepayments_sdk_python3-7.4.1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,30 @@
1
+ from typing import Optional
2
+
3
+
4
+ class RequestParam(object):
5
+ """
6
+ A single request parameter. Immutable.
7
+ """
8
+
9
+ def __init__(self, name: str, value: Optional[str]):
10
+ if name is None or not name.strip():
11
+ raise ValueError("name is required")
12
+ self.__name = name
13
+ self.__value = value
14
+
15
+ @property
16
+ def name(self) -> str:
17
+ """
18
+ :return: The parameter name.
19
+ """
20
+ return self.__name
21
+
22
+ @property
23
+ def value(self) -> Optional[str]:
24
+ """
25
+ :return: The un-encoded value.
26
+ """
27
+ return self.__value
28
+
29
+ def __str__(self):
30
+ return self.name + ":" + self.value
@@ -0,0 +1,58 @@
1
+ from typing import Mapping, Optional, Tuple
2
+
3
+ from .response_header import get_header_value, get_header
4
+
5
+
6
+ class ResponseException(RuntimeError):
7
+ """
8
+ Thrown when a response was received from the Online Payments platform which indicates an error.
9
+ """
10
+
11
+ def __init__(self, status: int, body: Optional[str], headers: Optional[Mapping[str, str]]):
12
+ super(ResponseException, self).__init__("the Online Payments platform returned an error response")
13
+ self.__status_code = status
14
+ self.__headers = headers if headers is not None else {}
15
+ self.__body = body
16
+
17
+ @property
18
+ def status_code(self) -> int:
19
+ """
20
+ :return: The HTTP status code that was returned by the Online Payments platform.
21
+ """
22
+ return self.__status_code
23
+
24
+ @property
25
+ def body(self) -> Optional[str]:
26
+ """
27
+ :return: The raw response body that was returned by the Online Payments platform.
28
+ """
29
+ return self.__body
30
+
31
+ @property
32
+ def headers(self) -> Mapping[str, str]:
33
+ """
34
+ :return: The headers that were returned by the Online Payments platform. Never None.
35
+ """
36
+ return self.__headers
37
+
38
+ def get_header(self, header_name: str) -> Optional[Tuple[str, str]]:
39
+ """
40
+ :return: The header with the given name, or None if there was no such header.
41
+ """
42
+ return get_header(self.__headers, header_name)
43
+
44
+ def get_header_value(self, header_name: str) -> Optional[str]:
45
+ """
46
+ :return: The value header with the given name, or None if there was no such header.
47
+ """
48
+ return get_header_value(self.__headers, header_name)
49
+
50
+ def __str__(self):
51
+ string = super(ResponseException, self).__str__()
52
+ status_code = self.__status_code
53
+ if status_code > 0:
54
+ string += "; status_code=" + str(status_code)
55
+ response_body = self.__body
56
+ if response_body:
57
+ string += "; response_body='" + response_body + "'"
58
+ return str(string)
@@ -0,0 +1,50 @@
1
+ import re
2
+ from typing import Mapping, Optional, Tuple
3
+
4
+
5
+ def get_header_value(headers: Optional[Mapping[str, str]], header_name: str) -> Optional[str]:
6
+ """
7
+ :return: The value of the header with the given name, or None if there was no such header.
8
+ """
9
+ if headers is None:
10
+ return None
11
+ for name, value in headers.items():
12
+ if name.lower() == header_name.lower():
13
+ return value
14
+ return None
15
+
16
+
17
+ def get_header(headers: Optional[Mapping[str, str]], header_name: str) -> Optional[Tuple[str, str]]:
18
+ """
19
+ :return: The header with the given name as a tuple with the name and value, or None if there was no such header.
20
+ """
21
+ if headers is None:
22
+ return None
23
+ for name, value in headers.items():
24
+ if name.lower() == header_name.lower():
25
+ return name, value
26
+ return None
27
+
28
+
29
+ def get_disposition_filename(headers: Optional[Mapping[str, str]]) -> Optional[str]:
30
+ """
31
+ :return: The value of the filename parameter of the Content-Disposition header, or None if there was no such header or parameter.
32
+ """
33
+ header_value = get_header_value(headers, "Content-Disposition")
34
+ if header_value is None:
35
+ return None
36
+ pattern = re.compile("(?:^|;)\\s*filename\\s*=\\s*(.*?)\\s*(?:;|$)", re.IGNORECASE)
37
+ match = pattern.search(header_value)
38
+ if match is not None:
39
+ filename = match.group(1)
40
+ return __trim_quotes(filename)
41
+ return None
42
+
43
+
44
+ def __trim_quotes(filename: str) -> str:
45
+ if len(filename) < 2:
46
+ return filename
47
+ if (filename.startswith("\"") and filename.endswith("\"")) or \
48
+ (filename.startswith("'") and filename.endswith("'")):
49
+ return filename[1:-1]
50
+ return filename
@@ -0,0 +1,465 @@
1
+ from datetime import timedelta
2
+ from typing import Any, Iterable, List, Mapping, Optional, Type, Union
3
+ from urllib.parse import quote, urlparse, ParseResult
4
+ from time import time
5
+ from wsgiref.handlers import format_date_time
6
+
7
+ from .call_context import CallContext
8
+ from .i_communicator import ICommunicator, BinaryResponse
9
+
10
+ from onlinepayments.sdk.authentication.authenticator import Authenticator
11
+ from onlinepayments.sdk.communication.communication_exception import CommunicationException
12
+ from onlinepayments.sdk.communication.connection import Connection, Response
13
+ from onlinepayments.sdk.communication.not_found_exception import NotFoundException
14
+ from onlinepayments.sdk.communication.pooled_connection import PooledConnection
15
+ from onlinepayments.sdk.communication.i_metadata_provider import IMetadataProvider
16
+ from onlinepayments.sdk.communication.multipart_form_data_object import MultipartFormDataObject
17
+ from onlinepayments.sdk.communication.multipart_form_data_request import MultipartFormDataRequest
18
+ from onlinepayments.sdk.communication.param_request import ParamRequest
19
+ from onlinepayments.sdk.communication.request_header import RequestHeader
20
+ from onlinepayments.sdk.communication.request_param import RequestParam
21
+ from onlinepayments.sdk.communication.response_exception import ResponseException
22
+ from onlinepayments.sdk.communication.response_header import get_header_value
23
+ from onlinepayments.sdk.domain.data_object import DataObject
24
+ from onlinepayments.sdk.json.marshaller import Marshaller, T
25
+ from onlinepayments.sdk.log.body_obfuscator import BodyObfuscator
26
+ from onlinepayments.sdk.log.communicator_logger import CommunicatorLogger
27
+ from onlinepayments.sdk.log.header_obfuscator import HeaderObfuscator
28
+
29
+
30
+ class Communicator(ICommunicator):
31
+ """
32
+ Used to communicate with the Online Payments platform web services.
33
+
34
+ It contains all the logic to transform a request object to an HTTP request and an HTTP response to a response object.
35
+ """
36
+
37
+ def __init__(self, api_endpoint: Union[str, ParseResult], connection: Connection, authenticator: Authenticator,
38
+ metadata_provider: IMetadataProvider, marshaller: Marshaller):
39
+ if api_endpoint is None:
40
+ raise ValueError("api_endpoint is required")
41
+ if isinstance(api_endpoint, str):
42
+ api_endpoint = urlparse(api_endpoint)
43
+ if api_endpoint.scheme.lower() not in ["http", "https"] or not api_endpoint.netloc:
44
+ raise ValueError("invalid api_endpoint: " + str(api_endpoint))
45
+ if api_endpoint.path:
46
+ raise ValueError("api_endpoint should not contain a path")
47
+ if api_endpoint.username is not None or api_endpoint.query or api_endpoint.fragment:
48
+ raise ValueError("api_endpoint should not contain user info, query or fragment")
49
+ if connection is None:
50
+ raise ValueError("connection is required")
51
+ if authenticator is None:
52
+ raise ValueError("authenticator is required")
53
+ if metadata_provider is None:
54
+ raise ValueError("metadata_provider is required")
55
+ if marshaller is None:
56
+ raise ValueError("marshaller is required")
57
+ self.__api_endpoint = api_endpoint
58
+ self.__connection = connection
59
+ self.__authenticator = authenticator
60
+ self.__metadata_provider = metadata_provider
61
+ self.__marshaller = marshaller
62
+
63
+ def close(self) -> None:
64
+ """
65
+ Releases any system resources associated with this object.
66
+ """
67
+ self.__connection.close()
68
+
69
+ def _get_with_binary_response(self, relative_path: str, request_headers: Optional[List[RequestHeader]],
70
+ request_parameters: Optional[ParamRequest],
71
+ context: Optional[CallContext]) -> Response:
72
+ if request_parameters is None:
73
+ request_parameter_list = None
74
+ else:
75
+ request_parameter_list = request_parameters.to_request_parameters()
76
+ uri = self._to_absolute_uri(relative_path, request_parameter_list)
77
+ if request_headers is None:
78
+ request_headers = []
79
+ self._add_generic_headers("GET", uri, request_headers, context)
80
+
81
+ return self.__connection.get(uri, request_headers)
82
+
83
+ def get_with_binary_response(self, relative_path: str, request_headers: Optional[List[RequestHeader]],
84
+ request_parameters: Optional[ParamRequest],
85
+ context: Optional[CallContext]) -> BinaryResponse:
86
+ """
87
+ Corresponds to the HTTP GET method.
88
+
89
+ :param relative_path: The path to call, relative to the base URI.
90
+ :param request_headers: An optional list of request headers.
91
+ :param request_parameters: An optional set of request parameters.
92
+ :param context: The optional call context to use.
93
+ :raise CommunicationException: when an exception occurred communicating with the Online Payments platform
94
+ :raise ResponseException: when an error response was received from the Online Payments platform
95
+ """
96
+ (status, headers, chunks) = self._get_with_binary_response(relative_path, request_headers, request_parameters, context)
97
+ return self._process_binary_response(status, chunks, headers, relative_path, context)
98
+
99
+ def get(self, relative_path: str, request_headers: Optional[List[RequestHeader]],
100
+ request_parameters: Optional[ParamRequest],
101
+ response_type: Type[T],
102
+ context: Optional[CallContext]) -> T:
103
+ """
104
+ Corresponds to the HTTP GET method.
105
+
106
+ :param relative_path: The path to call, relative to the base URI.
107
+ :param request_headers: An optional list of request headers.
108
+ :param request_parameters: An optional set of request parameters.
109
+ :param response_type: The type of response to return.
110
+ :param context: The optional call context to use.
111
+ :raise CommunicationException: when an exception occurred communicating with the Online Payments platform
112
+ :raise ResponseException: when an error response was received from the Online Payments platform
113
+ """
114
+ (status, headers, chunks) = self._get_with_binary_response(relative_path, request_headers, request_parameters, context)
115
+ return self._process_response(status, chunks, headers, relative_path, response_type, context)
116
+
117
+ def _delete_with_binary_response(self, relative_path: str, request_headers: Optional[List[RequestHeader]],
118
+ request_parameters: Optional[ParamRequest],
119
+ context: Optional[CallContext]) -> Response:
120
+ if request_parameters is None:
121
+ request_parameter_list = None
122
+ else:
123
+ request_parameter_list = request_parameters.to_request_parameters()
124
+ uri = self._to_absolute_uri(relative_path, request_parameter_list)
125
+ if request_headers is None:
126
+ request_headers = []
127
+ self._add_generic_headers("DELETE", uri, request_headers, context)
128
+
129
+ return self.__connection.delete(uri, request_headers)
130
+
131
+ def delete_with_binary_response(self, relative_path: str, request_headers: Optional[List[RequestHeader]],
132
+ request_parameters: Optional[ParamRequest],
133
+ context: Optional[CallContext]) -> BinaryResponse:
134
+ """
135
+ Corresponds to the HTTP DELETE method.
136
+
137
+ :param relative_path: The path to call, relative to the base URI.
138
+ :param request_headers: An optional list of request headers.
139
+ :param request_parameters: An optional set of request parameters.
140
+ :param context: The optional call context to use.
141
+ :raise CommunicationException: when an exception occurred communicating with the Online Payments platform
142
+ :raise ResponseException: when an error response was received from the Online Payments platform
143
+ """
144
+ (status, headers, chunks) = self._delete_with_binary_response(relative_path, request_headers, request_parameters, context)
145
+ return self._process_binary_response(status, chunks, headers, relative_path, context)
146
+
147
+ def delete(self, relative_path: str, request_headers: Optional[List[RequestHeader]],
148
+ request_parameters: Optional[ParamRequest],
149
+ response_type: Type[T],
150
+ context: Optional[CallContext]) -> T:
151
+ """
152
+ Corresponds to the HTTP DELETE method.
153
+
154
+ :param relative_path: The path to call, relative to the base URI.
155
+ :param request_headers: An optional list of request headers.
156
+ :param request_parameters: An optional set of request parameters.
157
+ :param response_type: The type of response to return.
158
+ :param context: The optional call context to use.
159
+ :raise CommunicationException: when an exception occurred communicating with the Online Payments platform
160
+ :raise ResponseException: when an error response was received from the Online Payments platform
161
+ """
162
+ (status, headers, chunks) = self._delete_with_binary_response(relative_path, request_headers, request_parameters, context)
163
+ return self._process_response(status, chunks, headers, relative_path, response_type, context)
164
+
165
+ def _post_with_binary_response(self, relative_path: str, request_headers: Optional[List[RequestHeader]],
166
+ request_parameters: Optional[ParamRequest],
167
+ request_body: Any,
168
+ context: Optional[CallContext]) -> Response:
169
+ if request_parameters is None:
170
+ request_parameter_list = None
171
+ else:
172
+ request_parameter_list = request_parameters.to_request_parameters()
173
+ uri = self._to_absolute_uri(relative_path, request_parameter_list)
174
+ if request_headers is None:
175
+ request_headers = []
176
+
177
+ body = None
178
+ if isinstance(request_body, MultipartFormDataObject):
179
+ request_headers.append(RequestHeader("Content-Type", request_body.content_type))
180
+ body = request_body
181
+ elif isinstance(request_body, MultipartFormDataRequest):
182
+ multipart = request_body.to_multipart_form_data_object()
183
+ request_headers.append(RequestHeader("Content-Type", multipart.content_type))
184
+ body = multipart
185
+ elif request_body is not None:
186
+ request_headers.append(RequestHeader("Content-Type", "application/json"))
187
+ body = self.__marshaller.marshal(request_body)
188
+
189
+ if (
190
+ body is not None
191
+ and context is not None
192
+ and context.gzip is True
193
+ and not isinstance(body, MultipartFormDataObject)
194
+ ):
195
+ request_headers.append(RequestHeader("Content-Encoding", "gzip"))
196
+
197
+ self._add_generic_headers("POST", uri, request_headers, context)
198
+ return self.__connection.post(uri, request_headers, body)
199
+
200
+ def post_with_binary_response(self, relative_path: str, request_headers: Optional[List[RequestHeader]],
201
+ request_parameters: Optional[ParamRequest], request_body: Any,
202
+ context: Optional[CallContext]) -> BinaryResponse:
203
+ """
204
+ Corresponds to the HTTP POST method.
205
+
206
+ :param relative_path: The path to call, relative to the base URI.
207
+ :param request_headers: An optional list of request headers.
208
+ :param request_parameters: An optional set of request parameters.
209
+ :param request_body: The optional request body to send.
210
+ :param context: The optional call context to use.
211
+ :raise CommunicationException: when an exception occurred communicating with the Online Payments platform
212
+ :raise ResponseException: when an error response was received from the Online Payments platform
213
+ """
214
+ (status, headers, chunks) = self._post_with_binary_response(relative_path, request_headers, request_parameters, request_body, context)
215
+ return self._process_binary_response(status, chunks, headers, relative_path, context)
216
+
217
+ def post(self, relative_path: str, request_headers: Optional[List[RequestHeader]],
218
+ request_parameters: Optional[ParamRequest], request_body: Any,
219
+ response_type: Type[T],
220
+ context: Optional[CallContext]) -> T:
221
+ """
222
+ Corresponds to the HTTP POST method.
223
+
224
+ :param relative_path: The path to call, relative to the base URI.
225
+ :param request_headers: An optional list of request headers.
226
+ :param request_parameters: An optional set of request parameters.
227
+ :param request_body: The optional request body to send.
228
+ :param response_type: The type of response to return.
229
+ :param context: The optional call context to use.
230
+ :raise CommunicationException: when an exception occurred communicating with the Online Payments platform
231
+ :raise ResponseException: when an error response was received from the Online Payments platform
232
+ """
233
+ (status, headers, chunks) = self._post_with_binary_response(relative_path, request_headers, request_parameters, request_body, context)
234
+ return self._process_response(status, chunks, headers, relative_path, response_type, context)
235
+
236
+ def _put_with_binary_response(self, relative_path: str, request_headers: Optional[List[RequestHeader]],
237
+ request_parameters: Optional[ParamRequest], request_body: Any,
238
+ context: Optional[CallContext]) -> Response:
239
+ if request_parameters is None:
240
+ request_parameter_list = None
241
+ else:
242
+ request_parameter_list = request_parameters.to_request_parameters()
243
+ uri = self._to_absolute_uri(relative_path, request_parameter_list)
244
+ if request_headers is None:
245
+ request_headers = []
246
+
247
+ body = None
248
+ if isinstance(request_body, MultipartFormDataObject):
249
+ request_headers.append(RequestHeader("Content-Type", request_body.content_type))
250
+ body = request_body
251
+ elif isinstance(request_body, MultipartFormDataRequest):
252
+ multipart = request_body.to_multipart_form_data_object()
253
+ request_headers.append(RequestHeader("Content-Type", multipart.content_type))
254
+ body = multipart
255
+ elif request_body is not None:
256
+ request_headers.append(RequestHeader("Content-Type", "application/json"))
257
+ body = self.__marshaller.marshal(request_body)
258
+
259
+ self._add_generic_headers("PUT", uri, request_headers, context)
260
+ return self.__connection.put(uri, request_headers, body)
261
+
262
+ def put_with_binary_response(self, relative_path: str, request_headers: Optional[List[RequestHeader]],
263
+ request_parameters: Optional[ParamRequest], request_body: Any,
264
+ context: Optional[CallContext]) -> BinaryResponse:
265
+ """
266
+ Corresponds to the HTTP PUT method.
267
+
268
+ :param relative_path: The path to call, relative to the base URI.
269
+ :param request_headers: An optional list of request headers.
270
+ :param request_parameters: An optional set of request parameters.
271
+ :param request_body: The optional request body to send.
272
+ :param context: The optional call context to use.
273
+ :raise CommunicationException: when an exception occurred communicating with the Online Payments platform
274
+ :raise ResponseException: when an error response was received from the Online Payments platform
275
+ """
276
+ (status, headers, chunks) = self._put_with_binary_response(relative_path, request_headers, request_parameters, request_body, context)
277
+ return self._process_binary_response(status, chunks, headers, relative_path, context)
278
+
279
+ def put(self, relative_path: str, request_headers: Optional[List[RequestHeader]],
280
+ request_parameters: Optional[ParamRequest], request_body: Any,
281
+ response_type: Type[T],
282
+ context: Optional[CallContext]) -> T:
283
+ """
284
+ Corresponds to the HTTP PUT method.
285
+
286
+ :param relative_path: The path to call, relative to the base URI.
287
+ :param request_headers: An optional list of request headers.
288
+ :param request_parameters: An optional set of request parameters.
289
+ :param request_body: The optional request body to send.
290
+ :param response_type: The type of response to return.
291
+ :param context: The optional call context to use.
292
+ :raise CommunicationException: when an exception occurred communicating with the Online Payments platform
293
+ :raise ResponseException: when an error response was received from the Online Payments platform
294
+ """
295
+ (status, headers, chunks) = self._put_with_binary_response(relative_path, request_headers, request_parameters, request_body, context)
296
+ return self._process_response(status, chunks, headers, relative_path, response_type, context)
297
+
298
+ @property
299
+ def marshaller(self) -> Marshaller:
300
+ """
301
+ :return: The Marshaller object associated with this communicator. Never None.
302
+ """
303
+ return self.__marshaller
304
+
305
+ def _to_absolute_uri(self, relative_path: str, request_parameters: List[RequestParam]) -> ParseResult:
306
+ if relative_path.startswith("/"):
307
+ absolute_path = relative_path
308
+ else:
309
+ absolute_path = "/" + relative_path
310
+ uri = self.__api_endpoint.geturl() + absolute_path
311
+ separator = "?"
312
+ if request_parameters is not None:
313
+ for nvp in request_parameters:
314
+ uri += separator
315
+ uri += quote(nvp.name) + "=" + quote(nvp.value)
316
+ separator = "&"
317
+ # no need to revalidate that uri has a valid scheme and netloc
318
+ return urlparse(uri)
319
+
320
+ def _add_generic_headers(self, http_method: str, uri: ParseResult, request_headers: List[RequestHeader],
321
+ context: Optional[CallContext]) -> None:
322
+ """
323
+ Adds the necessary headers to the given list of headers. This includes
324
+ the authorization header, which uses other headers, so when you need to
325
+ override this method, make sure to call super.addGenericHeaders at the
326
+ end of your overridden method.
327
+ """
328
+ # add server meta info header
329
+ request_headers.extend(self.__metadata_provider.metadata_headers)
330
+ # add date header
331
+ request_headers.append(RequestHeader("Date", self._get_header_date_string()))
332
+ if context is not None and context.idempotence_key is not None:
333
+ # add context specific headers
334
+ request_headers.append(RequestHeader("X-GCS-Idempotence-Key", context.idempotence_key))
335
+ # add authorization
336
+ authenticator = self.__authenticator
337
+ authorization = authenticator.get_authorization(http_method, uri, request_headers)
338
+ request_headers.append(RequestHeader("Authorization", authorization))
339
+
340
+ @staticmethod
341
+ def _get_header_date_string() -> str:
342
+ """
343
+ Returns the date in the preferred format for the HTTP date header.
344
+ Locale-independent using RFC 1123 via wsgiref.handlers.format_date_time.
345
+ """
346
+ return format_date_time(time())
347
+
348
+ @staticmethod
349
+ def __collect_chunks(chunks: Iterable[bytes]) -> str:
350
+ collected_body = b""
351
+ for chunk in chunks:
352
+ collected_body += chunk
353
+ return collected_body.decode('utf-8')
354
+
355
+ def _process_binary_response(self, status: int, chunks: Iterable[bytes], headers: Mapping[str, str], request_path: str,
356
+ context: Optional[CallContext]) -> BinaryResponse:
357
+ if context is not None:
358
+ self._update_context(headers, context)
359
+ self._throw_exception_if_necessary_binary(status, chunks, headers, request_path)
360
+ return headers, chunks
361
+
362
+ def _process_response(self, status: int, chunks: Iterable[bytes], headers: Mapping[str, str], request_path: str,
363
+ response_type: Type[T],
364
+ context: Optional[CallContext]) -> T:
365
+ if context is not None:
366
+ self._update_context(headers, context)
367
+ body = self.__collect_chunks(chunks)
368
+ self._throw_exception_if_necessary(status, body, headers, request_path)
369
+ return self.__marshaller.unmarshal(body, response_type)
370
+
371
+ @staticmethod
372
+ def _update_context(headers: Mapping[str, str], context: Optional[CallContext]) -> None:
373
+ """
374
+ Updates the given call context based on the contents of the given response.
375
+ """
376
+ idempotence_request_timestamp_value = get_header_value(headers, "X-GCS-Idempotence-Request-Timestamp")
377
+ if idempotence_request_timestamp_value is not None:
378
+ idempotence_request_timestamp = int(idempotence_request_timestamp_value)
379
+ context.idempotence_request_timestamp = idempotence_request_timestamp
380
+ else:
381
+ context.idempotence_request_timestamp = None
382
+ idempotence_response_date_time_value = get_header_value(headers, "IdempotencyResponseDatetime")
383
+ if idempotence_response_date_time_value is not None:
384
+ idempotence_response_date_time = DataObject.parse_datetime(idempotence_response_date_time_value)
385
+ context.idempotence_response_date_time = idempotence_response_date_time
386
+ else:
387
+ context.idempotence_response_date_time = None
388
+
389
+ def _throw_exception_if_necessary_binary(self, status: int, chunks: Iterable[bytes], headers: Mapping[str, str], request_path: str) -> None:
390
+ """
391
+ Checks the Response for errors and throws an exception if necessary.
392
+ """
393
+ # status codes in the 100 or 300 range are not expected
394
+ if status < 200 or status >= 300:
395
+ body = self.__collect_chunks(chunks)
396
+ self.__throw_exception(status, body, headers, request_path)
397
+
398
+ def _throw_exception_if_necessary(self, status: int, body: str, headers: Mapping[str, str], request_path: str) -> None:
399
+ """
400
+ Checks the Response for errors and throws an exception if necessary.
401
+ """
402
+ # status codes in the 100 or 300 range are not expected
403
+ if status < 200 or status >= 300:
404
+ self.__throw_exception(status, body, headers, request_path)
405
+
406
+ def __throw_exception(self, status: int, body: str, headers: Mapping[str, str], request_path: str) -> None:
407
+ if body is not None and not self.__is_json(headers):
408
+ cause = ResponseException(status, body, headers)
409
+ if status == 404:
410
+ raise NotFoundException(cause, "The requested resource was not found; invalid path: " + request_path)
411
+ else:
412
+ raise CommunicationException(cause)
413
+ else:
414
+ raise ResponseException(status, body, headers)
415
+
416
+ @staticmethod
417
+ def __is_json(headers: Mapping[str, str]) -> bool:
418
+ content_type = get_header_value(headers, "Content-Type")
419
+ if content_type is None:
420
+ return True
421
+ content_type = content_type.lower()
422
+ return ("application/json" == content_type) or \
423
+ ("application/problem+json" == content_type) or \
424
+ (content_type.startswith("application/json")) or \
425
+ (content_type.startswith("application/problem+json"))
426
+
427
+ def close_idle_connections(self, idle_time: timedelta) -> None:
428
+ """
429
+ Utility method that delegates the call to this communicator's connection
430
+ if that's an instance of PooledConnection. If not this method does nothing.
431
+
432
+ :param idle_time: a datetime.timedelta object indicating the idle time
433
+ """
434
+ if isinstance(self.__connection, PooledConnection):
435
+ self.__connection.close_idle_connections(idle_time)
436
+
437
+ def close_expired_connections(self) -> None:
438
+ """
439
+ Utility method that delegates the call to this communicator's connection
440
+ if that's an instance of PooledConnection. If not this method does nothing.
441
+ """
442
+ if isinstance(self.__connection, PooledConnection):
443
+ self.__connection.close_expired_connections()
444
+
445
+ def set_body_obfuscator(self, body_obfuscator: BodyObfuscator) -> None:
446
+ # delegate to the connection
447
+ self.__connection.set_body_obfuscator(body_obfuscator)
448
+
449
+ def set_header_obfuscator(self, header_obfuscator: HeaderObfuscator) -> None:
450
+ # delegate to the connection
451
+ self.__connection.set_header_obfuscator(header_obfuscator)
452
+
453
+ def enable_logging(self, communicator_logger: CommunicatorLogger) -> None:
454
+ # delegate to the connection
455
+ self.__connection.enable_logging(communicator_logger)
456
+
457
+ def disable_logging(self) -> None:
458
+ # delegate to the connection
459
+ self.__connection.disable_logging()
460
+
461
+ def __enter__(self):
462
+ return self
463
+
464
+ def __exit__(self, exc_type, exc_val, exc_tb):
465
+ self.close()