acquiring-sdk-ruby 0.1.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 +7 -0
- data/Gemfile +2 -0
- data/LICENSE.txt +22 -0
- data/README.md +140 -0
- data/Rakefile +34 -0
- data/acquiring-sdk-ruby.gemspec +30 -0
- data/lib/worldline/acquiring/sdk/api_resource.rb +53 -0
- data/lib/worldline/acquiring/sdk/authentication/authenticator.rb +21 -0
- data/lib/worldline/acquiring/sdk/authentication/authorization_type.rb +17 -0
- data/lib/worldline/acquiring/sdk/authentication/oauth2_authenticator.rb +142 -0
- data/lib/worldline/acquiring/sdk/authentication/oauth2_exception.rb +15 -0
- data/lib/worldline/acquiring/sdk/authentication.rb +1 -0
- data/lib/worldline/acquiring/sdk/call_context.rb +9 -0
- data/lib/worldline/acquiring/sdk/client.rb +69 -0
- data/lib/worldline/acquiring/sdk/communication/communication_exception.rb +21 -0
- data/lib/worldline/acquiring/sdk/communication/connection.rb +50 -0
- data/lib/worldline/acquiring/sdk/communication/default_connection.rb +429 -0
- data/lib/worldline/acquiring/sdk/communication/metadata_provider.rb +162 -0
- data/lib/worldline/acquiring/sdk/communication/multipart_form_data_object.rb +54 -0
- data/lib/worldline/acquiring/sdk/communication/multipart_form_data_request.rb +15 -0
- data/lib/worldline/acquiring/sdk/communication/not_found_exception.rb +21 -0
- data/lib/worldline/acquiring/sdk/communication/param_request.rb +16 -0
- data/lib/worldline/acquiring/sdk/communication/pooled_connection.rb +28 -0
- data/lib/worldline/acquiring/sdk/communication/request_header.rb +64 -0
- data/lib/worldline/acquiring/sdk/communication/request_param.rb +30 -0
- data/lib/worldline/acquiring/sdk/communication/response_exception.rb +58 -0
- data/lib/worldline/acquiring/sdk/communication/response_header.rb +80 -0
- data/lib/worldline/acquiring/sdk/communication.rb +1 -0
- data/lib/worldline/acquiring/sdk/communicator.rb +506 -0
- data/lib/worldline/acquiring/sdk/communicator_configuration.rb +197 -0
- data/lib/worldline/acquiring/sdk/domain/data_object.rb +34 -0
- data/lib/worldline/acquiring/sdk/domain/shopping_cart_extension.rb +62 -0
- data/lib/worldline/acquiring/sdk/domain/uploadable_file.rb +35 -0
- data/lib/worldline/acquiring/sdk/domain.rb +1 -0
- data/lib/worldline/acquiring/sdk/factory.rb +183 -0
- data/lib/worldline/acquiring/sdk/json/default_marshaller.rb +36 -0
- data/lib/worldline/acquiring/sdk/json/marshaller.rb +29 -0
- data/lib/worldline/acquiring/sdk/json/marshaller_syntax_exception.rb +11 -0
- data/lib/worldline/acquiring/sdk/json.rb +1 -0
- data/lib/worldline/acquiring/sdk/logging/communicator_logger.rb +26 -0
- data/lib/worldline/acquiring/sdk/logging/log_message_builder.rb +91 -0
- data/lib/worldline/acquiring/sdk/logging/logging_capable.rb +19 -0
- data/lib/worldline/acquiring/sdk/logging/obfuscation/body_obfuscator.rb +101 -0
- data/lib/worldline/acquiring/sdk/logging/obfuscation/header_obfuscator.rb +54 -0
- data/lib/worldline/acquiring/sdk/logging/obfuscation/obfuscation_capable.rb +23 -0
- data/lib/worldline/acquiring/sdk/logging/obfuscation/obfuscation_rule.rb +49 -0
- data/lib/worldline/acquiring/sdk/logging/obfuscation.rb +1 -0
- data/lib/worldline/acquiring/sdk/logging/request_log_message_builder.rb +52 -0
- data/lib/worldline/acquiring/sdk/logging/response_log_message_builder.rb +43 -0
- data/lib/worldline/acquiring/sdk/logging/ruby_communicator_logger.rb +63 -0
- data/lib/worldline/acquiring/sdk/logging/stdout_communicator_logger.rb +33 -0
- data/lib/worldline/acquiring/sdk/logging.rb +1 -0
- data/lib/worldline/acquiring/sdk/proxy_configuration.rb +76 -0
- data/lib/worldline/acquiring/sdk/v1/acquirer/acquirer_client.rb +35 -0
- data/lib/worldline/acquiring/sdk/v1/acquirer/merchant/accountverifications/account_verifications_client.rb +60 -0
- data/lib/worldline/acquiring/sdk/v1/acquirer/merchant/accountverifications.rb +4 -0
- data/lib/worldline/acquiring/sdk/v1/acquirer/merchant/dynamiccurrencyconversion/dynamic_currency_conversion_client.rb +60 -0
- data/lib/worldline/acquiring/sdk/v1/acquirer/merchant/dynamiccurrencyconversion.rb +4 -0
- data/lib/worldline/acquiring/sdk/v1/acquirer/merchant/merchant_client.rb +66 -0
- data/lib/worldline/acquiring/sdk/v1/acquirer/merchant/payments/get_payment_status_params.rb +34 -0
- data/lib/worldline/acquiring/sdk/v1/acquirer/merchant/payments/payments_client.rb +224 -0
- data/lib/worldline/acquiring/sdk/v1/acquirer/merchant/payments.rb +4 -0
- data/lib/worldline/acquiring/sdk/v1/acquirer/merchant/refunds/get_refund_params.rb +34 -0
- data/lib/worldline/acquiring/sdk/v1/acquirer/merchant/refunds/refunds_client.rb +157 -0
- data/lib/worldline/acquiring/sdk/v1/acquirer/merchant/refunds.rb +4 -0
- data/lib/worldline/acquiring/sdk/v1/acquirer/merchant/technicalreversals/technical_reversals_client.rb +64 -0
- data/lib/worldline/acquiring/sdk/v1/acquirer/merchant/technicalreversals.rb +4 -0
- data/lib/worldline/acquiring/sdk/v1/acquirer/merchant.rb +4 -0
- data/lib/worldline/acquiring/sdk/v1/acquirer.rb +4 -0
- data/lib/worldline/acquiring/sdk/v1/api_exception.rb +63 -0
- data/lib/worldline/acquiring/sdk/v1/authorization_exception.rb +23 -0
- data/lib/worldline/acquiring/sdk/v1/domain/address_verification_data.rb +41 -0
- data/lib/worldline/acquiring/sdk/v1/domain/amount_data.rb +48 -0
- data/lib/worldline/acquiring/sdk/v1/domain/api_account_verification_request.rb +70 -0
- data/lib/worldline/acquiring/sdk/v1/domain/api_account_verification_response.rb +87 -0
- data/lib/worldline/acquiring/sdk/v1/domain/api_action_response.rb +71 -0
- data/lib/worldline/acquiring/sdk/v1/domain/api_action_response_for_refund.rb +71 -0
- data/lib/worldline/acquiring/sdk/v1/domain/api_capture_request.rb +75 -0
- data/lib/worldline/acquiring/sdk/v1/domain/api_capture_request_for_refund.rb +43 -0
- data/lib/worldline/acquiring/sdk/v1/domain/api_increment_request.rb +61 -0
- data/lib/worldline/acquiring/sdk/v1/domain/api_increment_response.rb +43 -0
- data/lib/worldline/acquiring/sdk/v1/domain/api_payment_error_response.rb +62 -0
- data/lib/worldline/acquiring/sdk/v1/domain/api_payment_refund_request.rb +77 -0
- data/lib/worldline/acquiring/sdk/v1/domain/api_payment_request.rb +95 -0
- data/lib/worldline/acquiring/sdk/v1/domain/api_payment_resource.rb +103 -0
- data/lib/worldline/acquiring/sdk/v1/domain/api_payment_response.rb +126 -0
- data/lib/worldline/acquiring/sdk/v1/domain/api_payment_reversal_request.rb +61 -0
- data/lib/worldline/acquiring/sdk/v1/domain/api_payment_summary_for_response.rb +66 -0
- data/lib/worldline/acquiring/sdk/v1/domain/api_references_for_responses.rb +48 -0
- data/lib/worldline/acquiring/sdk/v1/domain/api_refund_request.rb +88 -0
- data/lib/worldline/acquiring/sdk/v1/domain/api_refund_resource.rb +110 -0
- data/lib/worldline/acquiring/sdk/v1/domain/api_refund_response.rb +133 -0
- data/lib/worldline/acquiring/sdk/v1/domain/api_refund_summary_for_response.rb +66 -0
- data/lib/worldline/acquiring/sdk/v1/domain/api_reversal_response.rb +36 -0
- data/lib/worldline/acquiring/sdk/v1/domain/api_technical_reversal_request.rb +50 -0
- data/lib/worldline/acquiring/sdk/v1/domain/api_technical_reversal_response.rb +62 -0
- data/lib/worldline/acquiring/sdk/v1/domain/card_data_for_dcc.rb +48 -0
- data/lib/worldline/acquiring/sdk/v1/domain/card_on_file_data.rb +52 -0
- data/lib/worldline/acquiring/sdk/v1/domain/card_payment_data.rb +114 -0
- data/lib/worldline/acquiring/sdk/v1/domain/card_payment_data_for_refund.rb +82 -0
- data/lib/worldline/acquiring/sdk/v1/domain/card_payment_data_for_resource.rb +43 -0
- data/lib/worldline/acquiring/sdk/v1/domain/card_payment_data_for_response.rb +52 -0
- data/lib/worldline/acquiring/sdk/v1/domain/card_payment_data_for_verification.rb +91 -0
- data/lib/worldline/acquiring/sdk/v1/domain/dcc_data.rb +55 -0
- data/lib/worldline/acquiring/sdk/v1/domain/dcc_proposal.rb +60 -0
- data/lib/worldline/acquiring/sdk/v1/domain/e_commerce_data.rb +52 -0
- data/lib/worldline/acquiring/sdk/v1/domain/e_commerce_data_for_account_verification.rb +45 -0
- data/lib/worldline/acquiring/sdk/v1/domain/e_commerce_data_for_response.rb +41 -0
- data/lib/worldline/acquiring/sdk/v1/domain/get_dcc_rate_request.rb +75 -0
- data/lib/worldline/acquiring/sdk/v1/domain/get_dcc_rate_response.rb +57 -0
- data/lib/worldline/acquiring/sdk/v1/domain/initial_card_on_file_data.rb +41 -0
- data/lib/worldline/acquiring/sdk/v1/domain/merchant_data.rb +76 -0
- data/lib/worldline/acquiring/sdk/v1/domain/network_token_data.rb +41 -0
- data/lib/worldline/acquiring/sdk/v1/domain/payment_references.rb +48 -0
- data/lib/worldline/acquiring/sdk/v1/domain/plain_card_data.rb +48 -0
- data/lib/worldline/acquiring/sdk/v1/domain/point_of_sale_data.rb +34 -0
- data/lib/worldline/acquiring/sdk/v1/domain/point_of_sale_data_for_dcc.rb +41 -0
- data/lib/worldline/acquiring/sdk/v1/domain/rate_data.rb +64 -0
- data/lib/worldline/acquiring/sdk/v1/domain/sub_operation.rb +94 -0
- data/lib/worldline/acquiring/sdk/v1/domain/sub_operation_for_refund.rb +87 -0
- data/lib/worldline/acquiring/sdk/v1/domain/subsequent_card_on_file_data.rb +48 -0
- data/lib/worldline/acquiring/sdk/v1/domain/three_d_secure.rb +62 -0
- data/lib/worldline/acquiring/sdk/v1/domain/transaction_data_for_dcc.rb +52 -0
- data/lib/worldline/acquiring/sdk/v1/domain.rb +4 -0
- data/lib/worldline/acquiring/sdk/v1/exception_factory.rb +48 -0
- data/lib/worldline/acquiring/sdk/v1/ping/ping_client.rb +52 -0
- data/lib/worldline/acquiring/sdk/v1/ping.rb +4 -0
- data/lib/worldline/acquiring/sdk/v1/platform_exception.rb +23 -0
- data/lib/worldline/acquiring/sdk/v1/reference_exception.rb +23 -0
- data/lib/worldline/acquiring/sdk/v1/v1_client.rb +43 -0
- data/lib/worldline/acquiring/sdk/v1/validation_exception.rb +23 -0
- data/lib/worldline/acquiring/sdk/v1.rb +4 -0
- data/lib/worldline/acquiring/sdk.rb +1 -0
- data/spec/comparable_extension.rb +29 -0
- data/spec/fixtures/resources/authentication/oauth2AccessToken.expired.json +4 -0
- data/spec/fixtures/resources/authentication/oauth2AccessToken.invalidClient.json +4 -0
- data/spec/fixtures/resources/authentication/oauth2AccessToken.json +4 -0
- data/spec/fixtures/resources/communication/getWithQueryParams.json +3 -0
- data/spec/fixtures/resources/communication/getWithoutQueryParams.json +3 -0
- data/spec/fixtures/resources/communication/notFound.html +1 -0
- data/spec/fixtures/resources/communication/postWithBadRequestResponse.json +11 -0
- data/spec/fixtures/resources/communication/postWithCreatedResponse.json +6 -0
- data/spec/fixtures/resources/communication/unknownServerError.json +10 -0
- data/spec/fixtures/resources/logging/bodyNoObfuscation.json +7 -0
- data/spec/fixtures/resources/logging/bodyWithBinObfuscated.json +3 -0
- data/spec/fixtures/resources/logging/bodyWithBinOriginal.json +3 -0
- data/spec/fixtures/resources/logging/bodyWithCardCustomObfuscated.json +13 -0
- data/spec/fixtures/resources/logging/bodyWithCardObfuscated.json +13 -0
- data/spec/fixtures/resources/logging/bodyWithCardOriginal.json +13 -0
- data/spec/fixtures/resources/logging/bodyWithObjectObfuscated.json +5 -0
- data/spec/fixtures/resources/logging/bodyWithObjectOriginal.json +5 -0
- data/spec/fixtures/resources/properties.oauth2.yml +8 -0
- data/spec/fixtures/resources/properties.proxy.yml +14 -0
- data/spec/integration/connection_pooling_spec.rb +74 -0
- data/spec/integration/multipart_form_data_spec.rb +216 -0
- data/spec/integration/process_payment_spec.rb +43 -0
- data/spec/integration/request_dcc_rate_spec.rb +24 -0
- data/spec/integration/sdk_proxy_spec.rb +70 -0
- data/spec/integration_setup.rb +111 -0
- data/spec/lib/authentication/oauth2_authenticator_spec.rb +68 -0
- data/spec/lib/client_spec.rb +47 -0
- data/spec/lib/communication/default_connection_logger_spec.rb +484 -0
- data/spec/lib/communication/default_connection_spec.rb +352 -0
- data/spec/lib/communication/metadata_provider_spec.rb +93 -0
- data/spec/lib/communicator_configuration_spec.rb +181 -0
- data/spec/lib/communicator_spec.rb +34 -0
- data/spec/lib/factory_spec.rb +38 -0
- data/spec/lib/json/default_marshaller_spec.rb +39 -0
- data/spec/lib/logging/obfuscation/body_obfuscator_spec.rb +86 -0
- data/spec/lib/logging/obfuscation/header_obfuscator_spec.rb +100 -0
- data/spec/lib/logging/ruby_communicator_logger_spec.rb +92 -0
- data/spec/lib/logging/stdout_communicator_logger_spec.rb +64 -0
- data/spec/spec_helper.rb +32 -0
- metadata +375 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module Worldline
|
|
2
|
+
module Acquiring
|
|
3
|
+
module SDK
|
|
4
|
+
module Communication
|
|
5
|
+
# Class that represents the URL request parameters.
|
|
6
|
+
# Contains a method to add a name and value pair to a parameter array as a {Worldline::Acquiring::SDK::Communication::RequestParam}.
|
|
7
|
+
class ParamRequest
|
|
8
|
+
# @return [Array<Worldline::Acquiring::SDK::Communication::RequestParam>]
|
|
9
|
+
def to_request_parameters
|
|
10
|
+
raise NotImplementedError
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
require 'worldline/acquiring/sdk/communication/connection'
|
|
2
|
+
|
|
3
|
+
module Worldline
|
|
4
|
+
module Acquiring
|
|
5
|
+
module SDK
|
|
6
|
+
module Communication
|
|
7
|
+
# {Worldline::Acquiring::SDK::Communication::Connection} that supports connection pooling. This is used to more efficiently communicate using HTTP.
|
|
8
|
+
# Connection pooling means that a number of connections are kept alive after use so they can possibly be reused.
|
|
9
|
+
# If the Connection does not do so automatically,
|
|
10
|
+
# the methods _close_idle_connections_ and _close_expired_connections_ can be used to drop connections
|
|
11
|
+
# that are idle for a specified amount of time or that have expired.
|
|
12
|
+
# @see Worldline::Acquiring::SDK::Communication::DefaultConnection
|
|
13
|
+
class PooledConnection < Connection
|
|
14
|
+
|
|
15
|
+
# Closes all connections that have not been used for _idle_time_ seconds.
|
|
16
|
+
def close_idle_connections(idle_time)
|
|
17
|
+
raise NotImplementedError
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Closes all connections that have expired.
|
|
21
|
+
def close_expired_connections
|
|
22
|
+
raise NotImplementedError
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
module Worldline
|
|
2
|
+
module Acquiring
|
|
3
|
+
module SDK
|
|
4
|
+
module Communication
|
|
5
|
+
# Represents HTTP request headers
|
|
6
|
+
# Each header is immutable has a #name and #value attribute
|
|
7
|
+
#
|
|
8
|
+
# @attr_reader [String] name HTTP header name
|
|
9
|
+
# @attr_reader [String] value HTTP header value
|
|
10
|
+
class RequestHeader
|
|
11
|
+
|
|
12
|
+
# Create a new header using the name and value given as parameters.
|
|
13
|
+
def initialize(name, value)
|
|
14
|
+
if name.nil? || name.strip.empty?
|
|
15
|
+
raise ArgumentError.new('name is required')
|
|
16
|
+
end
|
|
17
|
+
@name = name
|
|
18
|
+
@value = normalize_value(value)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
attr_reader :name
|
|
22
|
+
attr_reader :value
|
|
23
|
+
|
|
24
|
+
def to_s
|
|
25
|
+
"#{name}:#{value}"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Return the {Worldline::Acquiring::SDK::Communication::RequestHeader} that goes by the given _header_name_,
|
|
29
|
+
# If this Response does not contain a header with the given name, return _nil_ instead
|
|
30
|
+
def self.get_header(headers, header_name)
|
|
31
|
+
selected_headers = headers.select { |h| h.name == header_name }
|
|
32
|
+
if selected_headers.nil? || selected_headers.length == 0
|
|
33
|
+
return nil
|
|
34
|
+
else
|
|
35
|
+
return selected_headers[0]
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Returns the header value of the header that goes by the given _header_name_,
|
|
40
|
+
# If this response does not contain a header with the given name, return _nil_ instead
|
|
41
|
+
def self.get_header_value(headers, header_name)
|
|
42
|
+
header = get_header(headers, header_name)
|
|
43
|
+
return (
|
|
44
|
+
if header.nil?
|
|
45
|
+
nil
|
|
46
|
+
else
|
|
47
|
+
header.value
|
|
48
|
+
end)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
private
|
|
52
|
+
|
|
53
|
+
def normalize_value(value)
|
|
54
|
+
if value.nil? || value.empty?
|
|
55
|
+
return value
|
|
56
|
+
end
|
|
57
|
+
# Replace all sequences of linebreak-whitespace* with a single linebreak-space
|
|
58
|
+
value.gsub(/\r?\n[\s&&[^\r\n]]*/, ' ')
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
module Worldline
|
|
2
|
+
module Acquiring
|
|
3
|
+
module SDK
|
|
4
|
+
module Communication
|
|
5
|
+
# Represents a URL request parameter.
|
|
6
|
+
# Each parameter is immutable and has a #name and #value attribute.
|
|
7
|
+
#
|
|
8
|
+
# @attr_reader [String] name Parameter name
|
|
9
|
+
# @attr_reader [String] value Parameter value
|
|
10
|
+
class RequestParam
|
|
11
|
+
|
|
12
|
+
def initialize(name, value)
|
|
13
|
+
if name.nil? || name.strip.empty?
|
|
14
|
+
raise ArgumentError.new('name is required')
|
|
15
|
+
end
|
|
16
|
+
@name = name
|
|
17
|
+
@value = value
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
attr_reader :name
|
|
21
|
+
attr_reader :value
|
|
22
|
+
|
|
23
|
+
def to_s
|
|
24
|
+
"#{name}=#{value}"
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
require 'worldline/acquiring/sdk/communication/response_header'
|
|
2
|
+
|
|
3
|
+
module Worldline
|
|
4
|
+
module Acquiring
|
|
5
|
+
module SDK
|
|
6
|
+
module Communication
|
|
7
|
+
# Exception used internally in the SDK to indicate an error response was received from the Worldline Acquiring platform.
|
|
8
|
+
#
|
|
9
|
+
# @attr_reader [Integer] status_code HTTP status code that was returned by the Worldline Acquiring platform
|
|
10
|
+
# @attr_reader [String] body HTTP message body that was returned by the Worldline Acquiring platform
|
|
11
|
+
# @attr_reader [Array<Worldline::Acquiring::SDK::Communication::ResponseHeader>] headers HTTP headers used in the response from the Worldline Acquiring platform
|
|
12
|
+
class ResponseException < RuntimeError
|
|
13
|
+
|
|
14
|
+
def initialize(status_code, headers, body)
|
|
15
|
+
super('the Worldline Acquiring platform returned an error response')
|
|
16
|
+
@status_code = status_code
|
|
17
|
+
@headers = if headers.nil? or headers.empty?
|
|
18
|
+
{}
|
|
19
|
+
else
|
|
20
|
+
headers.inject({}) do |hash, header|
|
|
21
|
+
hash[header.name.downcase.to_sym] = header.dup.freeze
|
|
22
|
+
hash
|
|
23
|
+
end
|
|
24
|
+
end.freeze
|
|
25
|
+
@body = body
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
attr_reader :status_code
|
|
29
|
+
attr_reader :body
|
|
30
|
+
attr_reader :headers
|
|
31
|
+
|
|
32
|
+
# Returns the {Worldline::Acquiring::SDK::Communication::ResponseHeader} that corresponds to the given _header_name_
|
|
33
|
+
# used in the HTTP response from the Worldline Acquiring platform, or *nil* if the header was not present in the response.
|
|
34
|
+
def get_header(header_name)
|
|
35
|
+
ResponseHeader.get_header(@headers, header_name)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Returns the header value received that corresponds to the header named by _header_name_,
|
|
39
|
+
# or *nil* if _header_name_ was not a header present in the HTTP response.
|
|
40
|
+
def get_header_value(header_name)
|
|
41
|
+
ResponseHeader.get_header_value(@headers, header_name)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def to_s
|
|
45
|
+
str = super.to_s
|
|
46
|
+
if @status_code > 0
|
|
47
|
+
str += '; status_code=' + @status_code.to_s
|
|
48
|
+
end
|
|
49
|
+
if !@body.nil? && @body.length > 0
|
|
50
|
+
str += "; response_body='" + @body + "'"
|
|
51
|
+
end
|
|
52
|
+
str.to_s
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
module Worldline
|
|
2
|
+
module Acquiring
|
|
3
|
+
module SDK
|
|
4
|
+
module Communication
|
|
5
|
+
# Represents HTTP response headers
|
|
6
|
+
# Each header is immutable has a #name and #value attribute
|
|
7
|
+
#
|
|
8
|
+
# @attr_reader [String] name HTTP header name
|
|
9
|
+
# @attr_reader [String] value HTTP header value
|
|
10
|
+
class ResponseHeader
|
|
11
|
+
|
|
12
|
+
# Create a new header using the name and value given as parameters.
|
|
13
|
+
def initialize(name, value)
|
|
14
|
+
raise ArgumentError.new('name is required') if name.nil? or name.strip.empty?
|
|
15
|
+
@name = name
|
|
16
|
+
@value = value
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
attr_reader :name
|
|
20
|
+
attr_reader :value
|
|
21
|
+
|
|
22
|
+
def to_s
|
|
23
|
+
"#{name}:#{value}"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Return the {Worldline::Acquiring::SDK::Communication::ResponseHeader} that goes by the given _header_name_,
|
|
27
|
+
# If this Response does not contain a header with the given name, return _nil_ instead
|
|
28
|
+
def self.get_header(headers, header_name)
|
|
29
|
+
selected_headers = headers.select { |h| h.name.casecmp(header_name) == 0 }
|
|
30
|
+
if selected_headers.nil? || selected_headers.length == 0
|
|
31
|
+
return nil
|
|
32
|
+
else
|
|
33
|
+
return selected_headers[0]
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Returns the header value of the header that goes by the given _header_name_,
|
|
38
|
+
# If this response does not contain a header with the given name, return _nil_ instead
|
|
39
|
+
def self.get_header_value(headers, header_name)
|
|
40
|
+
header = get_header(headers, header_name)
|
|
41
|
+
return (
|
|
42
|
+
if header.nil?
|
|
43
|
+
nil
|
|
44
|
+
else
|
|
45
|
+
header.value
|
|
46
|
+
end)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Returns the value of the _filename_ parameter of the _Content-Disposition_ header from
|
|
50
|
+
# parameter _headers_
|
|
51
|
+
# If this Response does not contain a header with the given name, return _nil_ instead
|
|
52
|
+
def self.get_disposition_filename(headers)
|
|
53
|
+
header_value = get_header_value(headers, "Content-Disposition")
|
|
54
|
+
unless header_value.nil?
|
|
55
|
+
if header_value =~ /(?:^|;)\s*filename\s*=\s*(.*?)\s*(?:;|$)i/
|
|
56
|
+
return trim_quotes($2)
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
return nil
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
private
|
|
64
|
+
|
|
65
|
+
# Trims the single or double quotes at the beginning and end of parameter _filename_ if they exist
|
|
66
|
+
# If they don't exist, it returns the original _filename_ instead
|
|
67
|
+
def trim_quotes(filename)
|
|
68
|
+
unless filename.length < 2
|
|
69
|
+
if (filename.chars.first == '\'' && filename.chars.last == '\"') ||
|
|
70
|
+
(filename.chars.first == '"' && filename.chars.last == '"')
|
|
71
|
+
return filename[1...-1]
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
filename
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Dir[File.join(__dir__, 'communication', '*.rb')].each { |f| require f }
|