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