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.
- onlinepayments/__init__.py +0 -0
- onlinepayments/sdk/__init__.py +4 -0
- onlinepayments/sdk/api_exception.py +60 -0
- onlinepayments/sdk/api_resource.py +57 -0
- onlinepayments/sdk/authentication/__init__.py +0 -0
- onlinepayments/sdk/authentication/authenticator.py +24 -0
- onlinepayments/sdk/authentication/authorization_type.py +10 -0
- onlinepayments/sdk/authentication/v1hmac_authenticator.py +122 -0
- onlinepayments/sdk/authorization_exception.py +19 -0
- onlinepayments/sdk/call_context.py +72 -0
- onlinepayments/sdk/client.py +107 -0
- onlinepayments/sdk/communication/__init__.py +0 -0
- onlinepayments/sdk/communication/communication_exception.py +8 -0
- onlinepayments/sdk/communication/connection.py +84 -0
- onlinepayments/sdk/communication/default_connection.py +313 -0
- onlinepayments/sdk/communication/i_metadata_provider.py +19 -0
- onlinepayments/sdk/communication/metadata_provider.py +132 -0
- onlinepayments/sdk/communication/multipart_form_data_object.py +51 -0
- onlinepayments/sdk/communication/multipart_form_data_request.py +16 -0
- onlinepayments/sdk/communication/not_found_exception.py +10 -0
- onlinepayments/sdk/communication/param_request.py +17 -0
- onlinepayments/sdk/communication/pooled_connection.py +29 -0
- onlinepayments/sdk/communication/request_header.py +60 -0
- onlinepayments/sdk/communication/request_param.py +30 -0
- onlinepayments/sdk/communication/response_exception.py +58 -0
- onlinepayments/sdk/communication/response_header.py +50 -0
- onlinepayments/sdk/communicator.py +465 -0
- onlinepayments/sdk/communicator_configuration.py +264 -0
- onlinepayments/sdk/declined_payment_exception.py +46 -0
- onlinepayments/sdk/declined_payout_exception.py +46 -0
- onlinepayments/sdk/declined_refund_exception.py +46 -0
- onlinepayments/sdk/declined_transaction_exception.py +22 -0
- onlinepayments/sdk/domain/__init__.py +4 -0
- onlinepayments/sdk/domain/acceptance.py +56 -0
- onlinepayments/sdk/domain/account_on_file.py +102 -0
- onlinepayments/sdk/domain/account_on_file_attribute.py +97 -0
- onlinepayments/sdk/domain/account_on_file_display_hints.py +64 -0
- onlinepayments/sdk/domain/acquirer_information.py +59 -0
- onlinepayments/sdk/domain/acquirer_selection_information.py +73 -0
- onlinepayments/sdk/domain/additional_order_input.py +107 -0
- onlinepayments/sdk/domain/address.py +145 -0
- onlinepayments/sdk/domain/address_personal.py +185 -0
- onlinepayments/sdk/domain/airline_data.py +519 -0
- onlinepayments/sdk/domain/airline_flight_leg.py +386 -0
- onlinepayments/sdk/domain/airline_passenger.py +129 -0
- onlinepayments/sdk/domain/amount_breakdown.py +63 -0
- onlinepayments/sdk/domain/amount_of_money.py +59 -0
- onlinepayments/sdk/domain/api_error.py +177 -0
- onlinepayments/sdk/domain/apple_pay_line_item.py +145 -0
- onlinepayments/sdk/domain/apple_pay_recurring_payment_request.py +116 -0
- onlinepayments/sdk/domain/bank_account_iban.py +37 -0
- onlinepayments/sdk/domain/batch_metadata.py +73 -0
- onlinepayments/sdk/domain/browser_data.py +130 -0
- onlinepayments/sdk/domain/calculate_surcharge_request.py +63 -0
- onlinepayments/sdk/domain/calculate_surcharge_response.py +44 -0
- onlinepayments/sdk/domain/cancel_payment_batch_request.py +57 -0
- onlinepayments/sdk/domain/cancel_payment_request.py +130 -0
- onlinepayments/sdk/domain/cancel_payment_response.py +41 -0
- onlinepayments/sdk/domain/capture.py +97 -0
- onlinepayments/sdk/domain/capture_output.py +272 -0
- onlinepayments/sdk/domain/capture_payment_batch_request.py +57 -0
- onlinepayments/sdk/domain/capture_payment_request.py +148 -0
- onlinepayments/sdk/domain/capture_response.py +99 -0
- onlinepayments/sdk/domain/capture_status_output.py +37 -0
- onlinepayments/sdk/domain/captures_response.py +46 -0
- onlinepayments/sdk/domain/card.py +91 -0
- onlinepayments/sdk/domain/card_bin_details.py +384 -0
- onlinepayments/sdk/domain/card_data_without_cvv.py +73 -0
- onlinepayments/sdk/domain/card_essentials.py +438 -0
- onlinepayments/sdk/domain/card_fraud_results.py +112 -0
- onlinepayments/sdk/domain/card_info.py +55 -0
- onlinepayments/sdk/domain/card_payment_method_specific_input.py +608 -0
- onlinepayments/sdk/domain/card_payment_method_specific_input_base.py +441 -0
- onlinepayments/sdk/domain/card_payment_method_specific_input_for_hosted_checkout.py +105 -0
- onlinepayments/sdk/domain/card_payment_method_specific_output.py +467 -0
- onlinepayments/sdk/domain/card_payout_method_specific_input.py +99 -0
- onlinepayments/sdk/domain/card_recurrence_details.py +40 -0
- onlinepayments/sdk/domain/card_source.py +95 -0
- onlinepayments/sdk/domain/card_without_cvv.py +73 -0
- onlinepayments/sdk/domain/click_to_pay.py +37 -0
- onlinepayments/sdk/domain/company_information.py +37 -0
- onlinepayments/sdk/domain/complete_payment_card_payment_method_specific_input.py +39 -0
- onlinepayments/sdk/domain/complete_payment_request.py +61 -0
- onlinepayments/sdk/domain/complete_payment_response.py +85 -0
- onlinepayments/sdk/domain/contact_details.py +109 -0
- onlinepayments/sdk/domain/create_certificate_response.py +55 -0
- onlinepayments/sdk/domain/create_hosted_checkout_request.py +195 -0
- onlinepayments/sdk/domain/create_hosted_checkout_response.py +132 -0
- onlinepayments/sdk/domain/create_hosted_fields_session_request.py +37 -0
- onlinepayments/sdk/domain/create_hosted_fields_session_response.py +102 -0
- onlinepayments/sdk/domain/create_hosted_tokenization_request.py +133 -0
- onlinepayments/sdk/domain/create_hosted_tokenization_response.py +127 -0
- onlinepayments/sdk/domain/create_mandate_request.py +187 -0
- onlinepayments/sdk/domain/create_mandate_response.py +63 -0
- onlinepayments/sdk/domain/create_mandate_with_return_url.py +187 -0
- onlinepayments/sdk/domain/create_payment_link_request.py +344 -0
- onlinepayments/sdk/domain/create_payment_request.py +249 -0
- onlinepayments/sdk/domain/create_payment_response.py +85 -0
- onlinepayments/sdk/domain/create_payout_request.py +176 -0
- onlinepayments/sdk/domain/create_token_request.py +77 -0
- onlinepayments/sdk/domain/created_payment_output.py +57 -0
- onlinepayments/sdk/domain/created_token_response.py +142 -0
- onlinepayments/sdk/domain/credit_card_specific_input_hosted_tokenization.py +66 -0
- onlinepayments/sdk/domain/credit_card_validation_rules.py +55 -0
- onlinepayments/sdk/domain/credit_card_validation_rules_hosted_tokenization.py +55 -0
- onlinepayments/sdk/domain/crm_token.py +55 -0
- onlinepayments/sdk/domain/csr_request.py +37 -0
- onlinepayments/sdk/domain/currency_conversion.py +59 -0
- onlinepayments/sdk/domain/currency_conversion_input.py +55 -0
- onlinepayments/sdk/domain/currency_conversion_request.py +59 -0
- onlinepayments/sdk/domain/currency_conversion_response.py +81 -0
- onlinepayments/sdk/domain/currency_conversion_result.py +61 -0
- onlinepayments/sdk/domain/currency_conversion_specific_input.py +40 -0
- onlinepayments/sdk/domain/customer.py +234 -0
- onlinepayments/sdk/domain/customer_account.py +204 -0
- onlinepayments/sdk/domain/customer_account_authentication.py +81 -0
- onlinepayments/sdk/domain/customer_bank_account.py +73 -0
- onlinepayments/sdk/domain/customer_device.py +155 -0
- onlinepayments/sdk/domain/customer_device_output.py +37 -0
- onlinepayments/sdk/domain/customer_output.py +41 -0
- onlinepayments/sdk/domain/customer_payment_activity.py +73 -0
- onlinepayments/sdk/domain/customer_token.py +83 -0
- onlinepayments/sdk/domain/data_object.py +47 -0
- onlinepayments/sdk/domain/dcc_card_source.py +93 -0
- onlinepayments/sdk/domain/dcc_proposal.py +118 -0
- onlinepayments/sdk/domain/decrypted_payment_data.py +120 -0
- onlinepayments/sdk/domain/detokenization_response.py +46 -0
- onlinepayments/sdk/domain/detokenized_token_response.py +145 -0
- onlinepayments/sdk/domain/directory_entry.py +73 -0
- onlinepayments/sdk/domain/discount.py +41 -0
- onlinepayments/sdk/domain/empty_validator.py +16 -0
- onlinepayments/sdk/domain/error_response.py +64 -0
- onlinepayments/sdk/domain/external_cardholder_authentication_data.py +216 -0
- onlinepayments/sdk/domain/external_token_linked.py +75 -0
- onlinepayments/sdk/domain/feedbacks.py +64 -0
- onlinepayments/sdk/domain/fixed_list_validator.py +42 -0
- onlinepayments/sdk/domain/fraud_fields.py +84 -0
- onlinepayments/sdk/domain/fraud_results.py +43 -0
- onlinepayments/sdk/domain/g_pay_three_d_secure.py +159 -0
- onlinepayments/sdk/domain/get_batch_status_response.py +91 -0
- onlinepayments/sdk/domain/get_hosted_checkout_response.py +63 -0
- onlinepayments/sdk/domain/get_hosted_tokenization_response.py +61 -0
- onlinepayments/sdk/domain/get_iin_details_request.py +57 -0
- onlinepayments/sdk/domain/get_iin_details_response.py +450 -0
- onlinepayments/sdk/domain/get_mandate_response.py +41 -0
- onlinepayments/sdk/domain/get_payment_product_groups_response.py +44 -0
- onlinepayments/sdk/domain/get_payment_products_response.py +44 -0
- onlinepayments/sdk/domain/get_privacy_policy_response.py +37 -0
- onlinepayments/sdk/domain/gift_card_purchase.py +59 -0
- onlinepayments/sdk/domain/hosted_checkout_specific_input.py +250 -0
- onlinepayments/sdk/domain/hosted_checkout_specific_output.py +55 -0
- onlinepayments/sdk/domain/iin_detail.py +423 -0
- onlinepayments/sdk/domain/import_cof_series_request.py +113 -0
- onlinepayments/sdk/domain/import_cof_series_response.py +37 -0
- onlinepayments/sdk/domain/label_template_element.py +55 -0
- onlinepayments/sdk/domain/length_validator.py +51 -0
- onlinepayments/sdk/domain/line_item.py +107 -0
- onlinepayments/sdk/domain/line_item_detail.py +99 -0
- onlinepayments/sdk/domain/line_item_invoice_data.py +37 -0
- onlinepayments/sdk/domain/loan_recipient.py +109 -0
- onlinepayments/sdk/domain/lodging_data.py +37 -0
- onlinepayments/sdk/domain/mandate_address.py +109 -0
- onlinepayments/sdk/domain/mandate_address_response.py +109 -0
- onlinepayments/sdk/domain/mandate_contact_details.py +37 -0
- onlinepayments/sdk/domain/mandate_customer.py +125 -0
- onlinepayments/sdk/domain/mandate_customer_response.py +125 -0
- onlinepayments/sdk/domain/mandate_merchant_action.py +61 -0
- onlinepayments/sdk/domain/mandate_personal_information.py +59 -0
- onlinepayments/sdk/domain/mandate_personal_information_response.py +59 -0
- onlinepayments/sdk/domain/mandate_personal_name.py +55 -0
- onlinepayments/sdk/domain/mandate_personal_name_response.py +55 -0
- onlinepayments/sdk/domain/mandate_redirect_data.py +55 -0
- onlinepayments/sdk/domain/mandate_response.py +150 -0
- onlinepayments/sdk/domain/market_place.py +55 -0
- onlinepayments/sdk/domain/merchant_action.py +132 -0
- onlinepayments/sdk/domain/mobile_payment_data.py +55 -0
- onlinepayments/sdk/domain/mobile_payment_method_hosted_checkout_specific_input.py +105 -0
- onlinepayments/sdk/domain/mobile_payment_method_specific_input.py +202 -0
- onlinepayments/sdk/domain/mobile_payment_method_specific_output.py +139 -0
- onlinepayments/sdk/domain/mobile_payment_product302_specific_input.py +103 -0
- onlinepayments/sdk/domain/mobile_payment_product320_specific_input.py +103 -0
- onlinepayments/sdk/domain/mobile_three_d_secure_challenge_parameters.py +91 -0
- onlinepayments/sdk/domain/multiple_payment_information.py +57 -0
- onlinepayments/sdk/domain/network_token_data.py +127 -0
- onlinepayments/sdk/domain/network_token_essentials.py +134 -0
- onlinepayments/sdk/domain/network_token_linked.py +80 -0
- onlinepayments/sdk/domain/omnichannel_payment_specific_input.py +37 -0
- onlinepayments/sdk/domain/omnichannel_payout_specific_input.py +55 -0
- onlinepayments/sdk/domain/omnichannel_refund_specific_input.py +37 -0
- onlinepayments/sdk/domain/omnichannel_subsequent_specific_input.py +37 -0
- onlinepayments/sdk/domain/operation_output.py +161 -0
- onlinepayments/sdk/domain/operation_payment_references.py +55 -0
- onlinepayments/sdk/domain/order.py +213 -0
- onlinepayments/sdk/domain/order_line_details.py +189 -0
- onlinepayments/sdk/domain/order_references.py +120 -0
- onlinepayments/sdk/domain/order_status_output.py +119 -0
- onlinepayments/sdk/domain/order_type_information.py +64 -0
- onlinepayments/sdk/domain/other_details.py +55 -0
- onlinepayments/sdk/domain/payment_account_on_file.py +57 -0
- onlinepayments/sdk/domain/payment_context.py +77 -0
- onlinepayments/sdk/domain/payment_creation_output.py +94 -0
- onlinepayments/sdk/domain/payment_details_response.py +148 -0
- onlinepayments/sdk/domain/payment_error_response.py +84 -0
- onlinepayments/sdk/domain/payment_link_event.py +73 -0
- onlinepayments/sdk/domain/payment_link_order_input.py +84 -0
- onlinepayments/sdk/domain/payment_link_order_output.py +81 -0
- onlinepayments/sdk/domain/payment_link_response.py +216 -0
- onlinepayments/sdk/domain/payment_link_specific_input.py +74 -0
- onlinepayments/sdk/domain/payment_links_response.py +44 -0
- onlinepayments/sdk/domain/payment_output.py +335 -0
- onlinepayments/sdk/domain/payment_product.py +296 -0
- onlinepayments/sdk/domain/payment_product130_specific_input.py +41 -0
- onlinepayments/sdk/domain/payment_product130_specific_three_d_secure.py +91 -0
- onlinepayments/sdk/domain/payment_product3012.py +55 -0
- onlinepayments/sdk/domain/payment_product3012_specific_input.py +100 -0
- onlinepayments/sdk/domain/payment_product3013_specific_input.py +73 -0
- onlinepayments/sdk/domain/payment_product302_specific_data.py +44 -0
- onlinepayments/sdk/domain/payment_product3203_specific_output.py +62 -0
- onlinepayments/sdk/domain/payment_product3204_specific_output.py +37 -0
- onlinepayments/sdk/domain/payment_product3208_specific_input.py +37 -0
- onlinepayments/sdk/domain/payment_product3208_specific_output.py +37 -0
- onlinepayments/sdk/domain/payment_product3209_specific_input.py +37 -0
- onlinepayments/sdk/domain/payment_product3209_specific_output.py +37 -0
- onlinepayments/sdk/domain/payment_product320_specific_data.py +62 -0
- onlinepayments/sdk/domain/payment_product350.py +55 -0
- onlinepayments/sdk/domain/payment_product5001.py +58 -0
- onlinepayments/sdk/domain/payment_product5001_specific_output.py +112 -0
- onlinepayments/sdk/domain/payment_product5100_specific_input.py +37 -0
- onlinepayments/sdk/domain/payment_product5402_specific_output.py +37 -0
- onlinepayments/sdk/domain/payment_product5404.py +55 -0
- onlinepayments/sdk/domain/payment_product5407.py +55 -0
- onlinepayments/sdk/domain/payment_product5500_specific_output.py +91 -0
- onlinepayments/sdk/domain/payment_product771_specific_output.py +37 -0
- onlinepayments/sdk/domain/payment_product840.py +37 -0
- onlinepayments/sdk/domain/payment_product840_customer_account.py +170 -0
- onlinepayments/sdk/domain/payment_product840_specific_output.py +167 -0
- onlinepayments/sdk/domain/payment_product_display_hints.py +73 -0
- onlinepayments/sdk/domain/payment_product_field.py +95 -0
- onlinepayments/sdk/domain/payment_product_field_data_restrictions.py +60 -0
- onlinepayments/sdk/domain/payment_product_field_display_element.py +97 -0
- onlinepayments/sdk/domain/payment_product_field_display_hints.py +218 -0
- onlinepayments/sdk/domain/payment_product_field_form_element.py +72 -0
- onlinepayments/sdk/domain/payment_product_field_tooltip.py +57 -0
- onlinepayments/sdk/domain/payment_product_field_validators.py +195 -0
- onlinepayments/sdk/domain/payment_product_filter.py +67 -0
- onlinepayments/sdk/domain/payment_product_filter_hosted_tokenization.py +42 -0
- onlinepayments/sdk/domain/payment_product_filters_hosted_checkout.py +62 -0
- onlinepayments/sdk/domain/payment_product_filters_hosted_tokenization.py +62 -0
- onlinepayments/sdk/domain/payment_product_group.py +103 -0
- onlinepayments/sdk/domain/payment_product_networks_response.py +42 -0
- onlinepayments/sdk/domain/payment_references.py +73 -0
- onlinepayments/sdk/domain/payment_response.py +143 -0
- onlinepayments/sdk/domain/payment_status_output.py +152 -0
- onlinepayments/sdk/domain/payout_error_response.py +80 -0
- onlinepayments/sdk/domain/payout_output.py +63 -0
- onlinepayments/sdk/domain/payout_response.py +93 -0
- onlinepayments/sdk/domain/payout_result.py +93 -0
- onlinepayments/sdk/domain/payout_status_output.py +76 -0
- onlinepayments/sdk/domain/pending_authentication.py +37 -0
- onlinepayments/sdk/domain/personal_information.py +77 -0
- onlinepayments/sdk/domain/personal_information_token.py +39 -0
- onlinepayments/sdk/domain/personal_name.py +73 -0
- onlinepayments/sdk/domain/personal_name_token.py +51 -0
- onlinepayments/sdk/domain/product302_recurring.py +37 -0
- onlinepayments/sdk/domain/product320_recurring.py +37 -0
- onlinepayments/sdk/domain/product_directory.py +46 -0
- onlinepayments/sdk/domain/protection_eligibility.py +59 -0
- onlinepayments/sdk/domain/range_validator.py +51 -0
- onlinepayments/sdk/domain/rate_details.py +109 -0
- onlinepayments/sdk/domain/reattempt_instructions.py +82 -0
- onlinepayments/sdk/domain/reattempt_instructions_conditions.py +55 -0
- onlinepayments/sdk/domain/redirect_data.py +55 -0
- onlinepayments/sdk/domain/redirect_payment_method_specific_input.py +575 -0
- onlinepayments/sdk/domain/redirect_payment_method_specific_output.py +267 -0
- onlinepayments/sdk/domain/redirect_payment_product11_specific_input.py +38 -0
- onlinepayments/sdk/domain/redirect_payment_product3103_specific_input.py +40 -0
- onlinepayments/sdk/domain/redirect_payment_product3112_specific_input.py +40 -0
- onlinepayments/sdk/domain/redirect_payment_product3116_specific_input.py +40 -0
- onlinepayments/sdk/domain/redirect_payment_product3203_specific_input.py +40 -0
- onlinepayments/sdk/domain/redirect_payment_product3204_specific_input.py +55 -0
- onlinepayments/sdk/domain/redirect_payment_product3302_specific_input.py +73 -0
- onlinepayments/sdk/domain/redirect_payment_product3306_specific_input.py +37 -0
- onlinepayments/sdk/domain/redirect_payment_product3307_specific_input.py +16 -0
- onlinepayments/sdk/domain/redirect_payment_product5001_specific_input.py +62 -0
- onlinepayments/sdk/domain/redirect_payment_product5300_specific_input.py +163 -0
- onlinepayments/sdk/domain/redirect_payment_product5402_specific_input.py +40 -0
- onlinepayments/sdk/domain/redirect_payment_product5403_specific_input.py +40 -0
- onlinepayments/sdk/domain/redirect_payment_product5406_specific_input.py +41 -0
- onlinepayments/sdk/domain/redirect_payment_product5408_specific_input.py +60 -0
- onlinepayments/sdk/domain/redirect_payment_product5410_specific_input.py +38 -0
- onlinepayments/sdk/domain/redirect_payment_product5412_specific_input.py +55 -0
- onlinepayments/sdk/domain/redirect_payment_product5601_specific_input.py +40 -0
- onlinepayments/sdk/domain/redirect_payment_product809_specific_input.py +40 -0
- onlinepayments/sdk/domain/redirect_payment_product840_specific_input.py +100 -0
- onlinepayments/sdk/domain/redirection_data.py +37 -0
- onlinepayments/sdk/domain/refund_card_method_specific_output.py +71 -0
- onlinepayments/sdk/domain/refund_e_wallet_method_specific_output.py +71 -0
- onlinepayments/sdk/domain/refund_error_response.py +82 -0
- onlinepayments/sdk/domain/refund_mobile_method_specific_output.py +69 -0
- onlinepayments/sdk/domain/refund_output.py +217 -0
- onlinepayments/sdk/domain/refund_payment_batch_request.py +57 -0
- onlinepayments/sdk/domain/refund_payment_product840_customer_account.py +69 -0
- onlinepayments/sdk/domain/refund_payment_product840_specific_output.py +39 -0
- onlinepayments/sdk/domain/refund_redirect_method_specific_output.py +51 -0
- onlinepayments/sdk/domain/refund_redirect_payment_method_specific_input.py +41 -0
- onlinepayments/sdk/domain/refund_redirect_payment_product900_specific_input.py +37 -0
- onlinepayments/sdk/domain/refund_request.py +210 -0
- onlinepayments/sdk/domain/refund_response.py +97 -0
- onlinepayments/sdk/domain/refunds_response.py +46 -0
- onlinepayments/sdk/domain/regular_expression_validator.py +35 -0
- onlinepayments/sdk/domain/revoke_mandate_request.py +48 -0
- onlinepayments/sdk/domain/send_test_request.py +37 -0
- onlinepayments/sdk/domain/sepa_direct_debit_payment_method_specific_input.py +59 -0
- onlinepayments/sdk/domain/sepa_direct_debit_payment_method_specific_input_base.py +59 -0
- onlinepayments/sdk/domain/sepa_direct_debit_payment_method_specific_output.py +81 -0
- onlinepayments/sdk/domain/sepa_direct_debit_payment_product771_specific_input.py +59 -0
- onlinepayments/sdk/domain/sepa_direct_debit_payment_product771_specific_input_base.py +59 -0
- onlinepayments/sdk/domain/session_data.py +116 -0
- onlinepayments/sdk/domain/session_details.py +55 -0
- onlinepayments/sdk/domain/session_request.py +44 -0
- onlinepayments/sdk/domain/session_response.py +114 -0
- onlinepayments/sdk/domain/shipping.py +214 -0
- onlinepayments/sdk/domain/shipping_detail.py +63 -0
- onlinepayments/sdk/domain/shipping_method.py +91 -0
- onlinepayments/sdk/domain/shopping_cart.py +155 -0
- onlinepayments/sdk/domain/shopping_cart_extension.py +77 -0
- onlinepayments/sdk/domain/shopping_cart_output.py +46 -0
- onlinepayments/sdk/domain/show_form_data.py +173 -0
- onlinepayments/sdk/domain/show_instructions_data.py +37 -0
- onlinepayments/sdk/domain/split_payment_product_filter.py +42 -0
- onlinepayments/sdk/domain/split_payment_product_filters_hosted_checkout.py +62 -0
- onlinepayments/sdk/domain/submit_batch_request_body.py +230 -0
- onlinepayments/sdk/domain/submit_batch_response.py +55 -0
- onlinepayments/sdk/domain/subsequent_card_payment_method_specific_input.py +175 -0
- onlinepayments/sdk/domain/subsequent_payment_batch_request.py +57 -0
- onlinepayments/sdk/domain/subsequent_payment_product5001_specific_input.py +41 -0
- onlinepayments/sdk/domain/subsequent_payment_request.py +107 -0
- onlinepayments/sdk/domain/subsequent_payment_response.py +41 -0
- onlinepayments/sdk/domain/surcharge.py +141 -0
- onlinepayments/sdk/domain/surcharge_calculation_card.py +55 -0
- onlinepayments/sdk/domain/surcharge_for_payment_link.py +40 -0
- onlinepayments/sdk/domain/surcharge_rate.py +91 -0
- onlinepayments/sdk/domain/surcharge_specific_input.py +62 -0
- onlinepayments/sdk/domain/surcharge_specific_output.py +84 -0
- onlinepayments/sdk/domain/test_connection.py +35 -0
- onlinepayments/sdk/domain/three_d_secure.py +281 -0
- onlinepayments/sdk/domain/three_d_secure_base.py +219 -0
- onlinepayments/sdk/domain/three_d_secure_data.py +78 -0
- onlinepayments/sdk/domain/three_d_secure_results.py +266 -0
- onlinepayments/sdk/domain/token_card.py +57 -0
- onlinepayments/sdk/domain/token_card_data.py +83 -0
- onlinepayments/sdk/domain/token_card_specific_input.py +41 -0
- onlinepayments/sdk/domain/token_data.py +63 -0
- onlinepayments/sdk/domain/token_e_wallet.py +59 -0
- onlinepayments/sdk/domain/token_response.py +181 -0
- onlinepayments/sdk/domain/transaction.py +41 -0
- onlinepayments/sdk/domain/uploadable_file.py +51 -0
- onlinepayments/sdk/domain/validate_credentials_request.py +55 -0
- onlinepayments/sdk/domain/validate_credentials_response.py +37 -0
- onlinepayments/sdk/domain/value_mapping_element.py +62 -0
- onlinepayments/sdk/domain/web_hooks_event.py +214 -0
- onlinepayments/sdk/exception_factory.py +75 -0
- onlinepayments/sdk/factory.py +127 -0
- onlinepayments/sdk/i_client.py +78 -0
- onlinepayments/sdk/i_communicator.py +180 -0
- onlinepayments/sdk/idempotence_exception.py +36 -0
- onlinepayments/sdk/json/__init__.py +0 -0
- onlinepayments/sdk/json/default_marshaller.py +60 -0
- onlinepayments/sdk/json/marshaller.py +32 -0
- onlinepayments/sdk/json/marshaller_syntax_exception.py +13 -0
- onlinepayments/sdk/log/__init__.py +0 -0
- onlinepayments/sdk/log/body_obfuscator.py +113 -0
- onlinepayments/sdk/log/communicator_logger.py +35 -0
- onlinepayments/sdk/log/header_obfuscator.py +49 -0
- onlinepayments/sdk/log/log_message.py +94 -0
- onlinepayments/sdk/log/logging_capable.py +26 -0
- onlinepayments/sdk/log/obfuscation_capable.py +24 -0
- onlinepayments/sdk/log/obfuscation_rule.py +50 -0
- onlinepayments/sdk/log/python_communicator_logger.py +54 -0
- onlinepayments/sdk/log/request_log_message.py +28 -0
- onlinepayments/sdk/log/response_log_message.py +37 -0
- onlinepayments/sdk/log/sys_out_communicator_logger.py +36 -0
- onlinepayments/sdk/merchant/__init__.py +4 -0
- onlinepayments/sdk/merchant/captures/__init__.py +4 -0
- onlinepayments/sdk/merchant/captures/captures_client.py +63 -0
- onlinepayments/sdk/merchant/captures/i_captures_client.py +34 -0
- onlinepayments/sdk/merchant/cofseries/__init__.py +4 -0
- onlinepayments/sdk/merchant/cofseries/cof_series_client.py +62 -0
- onlinepayments/sdk/merchant/cofseries/i_cof_series_client.py +35 -0
- onlinepayments/sdk/merchant/complete/__init__.py +4 -0
- onlinepayments/sdk/merchant/complete/complete_client.py +67 -0
- onlinepayments/sdk/merchant/complete/i_complete_client.py +37 -0
- onlinepayments/sdk/merchant/hostedcheckout/__init__.py +4 -0
- onlinepayments/sdk/merchant/hostedcheckout/hosted_checkout_client.py +99 -0
- onlinepayments/sdk/merchant/hostedcheckout/i_hosted_checkout_client.py +55 -0
- onlinepayments/sdk/merchant/hostedfields/__init__.py +4 -0
- onlinepayments/sdk/merchant/hostedfields/hosted_fields_client.py +62 -0
- onlinepayments/sdk/merchant/hostedfields/i_hosted_fields_client.py +35 -0
- onlinepayments/sdk/merchant/hostedtokenization/__init__.py +4 -0
- onlinepayments/sdk/merchant/hostedtokenization/hosted_tokenization_client.py +99 -0
- onlinepayments/sdk/merchant/hostedtokenization/i_hosted_tokenization_client.py +55 -0
- onlinepayments/sdk/merchant/i_merchant_client.py +202 -0
- onlinepayments/sdk/merchant/mandates/__init__.py +4 -0
- onlinepayments/sdk/merchant/mandates/i_mandates_client.py +114 -0
- onlinepayments/sdk/merchant/mandates/mandates_client.py +212 -0
- onlinepayments/sdk/merchant/merchant_client.py +232 -0
- onlinepayments/sdk/merchant/merchantbatch/__init__.py +4 -0
- onlinepayments/sdk/merchant/merchantbatch/i_merchant_batch_client.py +74 -0
- onlinepayments/sdk/merchant/merchantbatch/merchant_batch_client.py +138 -0
- onlinepayments/sdk/merchant/paymentlinks/__init__.py +4 -0
- onlinepayments/sdk/merchant/paymentlinks/get_payment_links_in_bulk_params.py +36 -0
- onlinepayments/sdk/merchant/paymentlinks/i_payment_links_client.py +73 -0
- onlinepayments/sdk/merchant/paymentlinks/payment_links_client.py +135 -0
- onlinepayments/sdk/merchant/payments/__init__.py +4 -0
- onlinepayments/sdk/merchant/payments/i_payments_client.py +143 -0
- onlinepayments/sdk/merchant/payments/payments_client.py +260 -0
- onlinepayments/sdk/merchant/payouts/__init__.py +4 -0
- onlinepayments/sdk/merchant/payouts/i_payouts_client.py +55 -0
- onlinepayments/sdk/merchant/payouts/payouts_client.py +100 -0
- onlinepayments/sdk/merchant/privacypolicy/__init__.py +4 -0
- onlinepayments/sdk/merchant/privacypolicy/get_privacy_policy_params.py +54 -0
- onlinepayments/sdk/merchant/privacypolicy/i_privacy_policy_client.py +36 -0
- onlinepayments/sdk/merchant/privacypolicy/privacy_policy_client.py +61 -0
- onlinepayments/sdk/merchant/productgroups/__init__.py +4 -0
- onlinepayments/sdk/merchant/productgroups/get_product_group_params.py +140 -0
- onlinepayments/sdk/merchant/productgroups/get_product_groups_params.py +140 -0
- onlinepayments/sdk/merchant/productgroups/i_product_groups_client.py +58 -0
- onlinepayments/sdk/merchant/productgroups/product_groups_client.py +100 -0
- onlinepayments/sdk/merchant/products/__init__.py +4 -0
- onlinepayments/sdk/merchant/products/get_payment_product_networks_params.py +89 -0
- onlinepayments/sdk/merchant/products/get_payment_product_params.py +138 -0
- onlinepayments/sdk/merchant/products/get_payment_products_params.py +138 -0
- onlinepayments/sdk/merchant/products/get_product_directory_params.py +54 -0
- onlinepayments/sdk/merchant/products/i_products_client.py +102 -0
- onlinepayments/sdk/merchant/products/products_client.py +178 -0
- onlinepayments/sdk/merchant/refunds/__init__.py +4 -0
- onlinepayments/sdk/merchant/refunds/i_refunds_client.py +34 -0
- onlinepayments/sdk/merchant/refunds/refunds_client.py +63 -0
- onlinepayments/sdk/merchant/services/__init__.py +4 -0
- onlinepayments/sdk/merchant/services/i_services_client.py +96 -0
- onlinepayments/sdk/merchant/services/services_client.py +167 -0
- onlinepayments/sdk/merchant/sessions/__init__.py +4 -0
- onlinepayments/sdk/merchant/sessions/i_sessions_client.py +35 -0
- onlinepayments/sdk/merchant/sessions/sessions_client.py +62 -0
- onlinepayments/sdk/merchant/subsequent/__init__.py +4 -0
- onlinepayments/sdk/merchant/subsequent/i_subsequent_client.py +37 -0
- onlinepayments/sdk/merchant/subsequent/subsequent_client.py +67 -0
- onlinepayments/sdk/merchant/tokenization/__init__.py +4 -0
- onlinepayments/sdk/merchant/tokenization/get_card_data_by_payments_params.py +48 -0
- onlinepayments/sdk/merchant/tokenization/get_card_data_by_tokens_params.py +48 -0
- onlinepayments/sdk/merchant/tokenization/i_tokenization_client.py +77 -0
- onlinepayments/sdk/merchant/tokenization/tokenization_client.py +131 -0
- onlinepayments/sdk/merchant/tokens/__init__.py +4 -0
- onlinepayments/sdk/merchant/tokens/i_tokens_client.py +74 -0
- onlinepayments/sdk/merchant/tokens/tokens_client.py +135 -0
- onlinepayments/sdk/merchant/webhooks/__init__.py +4 -0
- onlinepayments/sdk/merchant/webhooks/i_webhooks_client.py +55 -0
- onlinepayments/sdk/merchant/webhooks/webhooks_client.py +97 -0
- onlinepayments/sdk/platform_exception.py +19 -0
- onlinepayments/sdk/proxy_configuration.py +102 -0
- onlinepayments/sdk/reference_exception.py +19 -0
- onlinepayments/sdk/validation_exception.py +19 -0
- onlinepayments/sdk/webhooks/__init__.py +0 -0
- onlinepayments/sdk/webhooks/api_version_mismatch_exception.py +24 -0
- onlinepayments/sdk/webhooks/in_memory_secret_key_store.py +48 -0
- onlinepayments/sdk/webhooks/secret_key_not_available_exception.py +18 -0
- onlinepayments/sdk/webhooks/secret_key_store.py +15 -0
- onlinepayments/sdk/webhooks/signature_validation_exception.py +17 -0
- onlinepayments/sdk/webhooks/signature_validator.py +56 -0
- onlinepayments/sdk/webhooks/webhooks_helper.py +52 -0
- onlinepayments_sdk_python3-7.4.1.dist-info/METADATA +154 -0
- onlinepayments_sdk_python3-7.4.1.dist-info/RECORD +475 -0
- onlinepayments_sdk_python3-7.4.1.dist-info/WHEEL +5 -0
- onlinepayments_sdk_python3-7.4.1.dist-info/licenses/LICENSE.txt +52 -0
- 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()
|