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.
Files changed (174) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +2 -0
  3. data/LICENSE.txt +22 -0
  4. data/README.md +140 -0
  5. data/Rakefile +34 -0
  6. data/acquiring-sdk-ruby.gemspec +30 -0
  7. data/lib/worldline/acquiring/sdk/api_resource.rb +53 -0
  8. data/lib/worldline/acquiring/sdk/authentication/authenticator.rb +21 -0
  9. data/lib/worldline/acquiring/sdk/authentication/authorization_type.rb +17 -0
  10. data/lib/worldline/acquiring/sdk/authentication/oauth2_authenticator.rb +142 -0
  11. data/lib/worldline/acquiring/sdk/authentication/oauth2_exception.rb +15 -0
  12. data/lib/worldline/acquiring/sdk/authentication.rb +1 -0
  13. data/lib/worldline/acquiring/sdk/call_context.rb +9 -0
  14. data/lib/worldline/acquiring/sdk/client.rb +69 -0
  15. data/lib/worldline/acquiring/sdk/communication/communication_exception.rb +21 -0
  16. data/lib/worldline/acquiring/sdk/communication/connection.rb +50 -0
  17. data/lib/worldline/acquiring/sdk/communication/default_connection.rb +429 -0
  18. data/lib/worldline/acquiring/sdk/communication/metadata_provider.rb +162 -0
  19. data/lib/worldline/acquiring/sdk/communication/multipart_form_data_object.rb +54 -0
  20. data/lib/worldline/acquiring/sdk/communication/multipart_form_data_request.rb +15 -0
  21. data/lib/worldline/acquiring/sdk/communication/not_found_exception.rb +21 -0
  22. data/lib/worldline/acquiring/sdk/communication/param_request.rb +16 -0
  23. data/lib/worldline/acquiring/sdk/communication/pooled_connection.rb +28 -0
  24. data/lib/worldline/acquiring/sdk/communication/request_header.rb +64 -0
  25. data/lib/worldline/acquiring/sdk/communication/request_param.rb +30 -0
  26. data/lib/worldline/acquiring/sdk/communication/response_exception.rb +58 -0
  27. data/lib/worldline/acquiring/sdk/communication/response_header.rb +80 -0
  28. data/lib/worldline/acquiring/sdk/communication.rb +1 -0
  29. data/lib/worldline/acquiring/sdk/communicator.rb +506 -0
  30. data/lib/worldline/acquiring/sdk/communicator_configuration.rb +197 -0
  31. data/lib/worldline/acquiring/sdk/domain/data_object.rb +34 -0
  32. data/lib/worldline/acquiring/sdk/domain/shopping_cart_extension.rb +62 -0
  33. data/lib/worldline/acquiring/sdk/domain/uploadable_file.rb +35 -0
  34. data/lib/worldline/acquiring/sdk/domain.rb +1 -0
  35. data/lib/worldline/acquiring/sdk/factory.rb +183 -0
  36. data/lib/worldline/acquiring/sdk/json/default_marshaller.rb +36 -0
  37. data/lib/worldline/acquiring/sdk/json/marshaller.rb +29 -0
  38. data/lib/worldline/acquiring/sdk/json/marshaller_syntax_exception.rb +11 -0
  39. data/lib/worldline/acquiring/sdk/json.rb +1 -0
  40. data/lib/worldline/acquiring/sdk/logging/communicator_logger.rb +26 -0
  41. data/lib/worldline/acquiring/sdk/logging/log_message_builder.rb +91 -0
  42. data/lib/worldline/acquiring/sdk/logging/logging_capable.rb +19 -0
  43. data/lib/worldline/acquiring/sdk/logging/obfuscation/body_obfuscator.rb +101 -0
  44. data/lib/worldline/acquiring/sdk/logging/obfuscation/header_obfuscator.rb +54 -0
  45. data/lib/worldline/acquiring/sdk/logging/obfuscation/obfuscation_capable.rb +23 -0
  46. data/lib/worldline/acquiring/sdk/logging/obfuscation/obfuscation_rule.rb +49 -0
  47. data/lib/worldline/acquiring/sdk/logging/obfuscation.rb +1 -0
  48. data/lib/worldline/acquiring/sdk/logging/request_log_message_builder.rb +52 -0
  49. data/lib/worldline/acquiring/sdk/logging/response_log_message_builder.rb +43 -0
  50. data/lib/worldline/acquiring/sdk/logging/ruby_communicator_logger.rb +63 -0
  51. data/lib/worldline/acquiring/sdk/logging/stdout_communicator_logger.rb +33 -0
  52. data/lib/worldline/acquiring/sdk/logging.rb +1 -0
  53. data/lib/worldline/acquiring/sdk/proxy_configuration.rb +76 -0
  54. data/lib/worldline/acquiring/sdk/v1/acquirer/acquirer_client.rb +35 -0
  55. data/lib/worldline/acquiring/sdk/v1/acquirer/merchant/accountverifications/account_verifications_client.rb +60 -0
  56. data/lib/worldline/acquiring/sdk/v1/acquirer/merchant/accountverifications.rb +4 -0
  57. data/lib/worldline/acquiring/sdk/v1/acquirer/merchant/dynamiccurrencyconversion/dynamic_currency_conversion_client.rb +60 -0
  58. data/lib/worldline/acquiring/sdk/v1/acquirer/merchant/dynamiccurrencyconversion.rb +4 -0
  59. data/lib/worldline/acquiring/sdk/v1/acquirer/merchant/merchant_client.rb +66 -0
  60. data/lib/worldline/acquiring/sdk/v1/acquirer/merchant/payments/get_payment_status_params.rb +34 -0
  61. data/lib/worldline/acquiring/sdk/v1/acquirer/merchant/payments/payments_client.rb +224 -0
  62. data/lib/worldline/acquiring/sdk/v1/acquirer/merchant/payments.rb +4 -0
  63. data/lib/worldline/acquiring/sdk/v1/acquirer/merchant/refunds/get_refund_params.rb +34 -0
  64. data/lib/worldline/acquiring/sdk/v1/acquirer/merchant/refunds/refunds_client.rb +157 -0
  65. data/lib/worldline/acquiring/sdk/v1/acquirer/merchant/refunds.rb +4 -0
  66. data/lib/worldline/acquiring/sdk/v1/acquirer/merchant/technicalreversals/technical_reversals_client.rb +64 -0
  67. data/lib/worldline/acquiring/sdk/v1/acquirer/merchant/technicalreversals.rb +4 -0
  68. data/lib/worldline/acquiring/sdk/v1/acquirer/merchant.rb +4 -0
  69. data/lib/worldline/acquiring/sdk/v1/acquirer.rb +4 -0
  70. data/lib/worldline/acquiring/sdk/v1/api_exception.rb +63 -0
  71. data/lib/worldline/acquiring/sdk/v1/authorization_exception.rb +23 -0
  72. data/lib/worldline/acquiring/sdk/v1/domain/address_verification_data.rb +41 -0
  73. data/lib/worldline/acquiring/sdk/v1/domain/amount_data.rb +48 -0
  74. data/lib/worldline/acquiring/sdk/v1/domain/api_account_verification_request.rb +70 -0
  75. data/lib/worldline/acquiring/sdk/v1/domain/api_account_verification_response.rb +87 -0
  76. data/lib/worldline/acquiring/sdk/v1/domain/api_action_response.rb +71 -0
  77. data/lib/worldline/acquiring/sdk/v1/domain/api_action_response_for_refund.rb +71 -0
  78. data/lib/worldline/acquiring/sdk/v1/domain/api_capture_request.rb +75 -0
  79. data/lib/worldline/acquiring/sdk/v1/domain/api_capture_request_for_refund.rb +43 -0
  80. data/lib/worldline/acquiring/sdk/v1/domain/api_increment_request.rb +61 -0
  81. data/lib/worldline/acquiring/sdk/v1/domain/api_increment_response.rb +43 -0
  82. data/lib/worldline/acquiring/sdk/v1/domain/api_payment_error_response.rb +62 -0
  83. data/lib/worldline/acquiring/sdk/v1/domain/api_payment_refund_request.rb +77 -0
  84. data/lib/worldline/acquiring/sdk/v1/domain/api_payment_request.rb +95 -0
  85. data/lib/worldline/acquiring/sdk/v1/domain/api_payment_resource.rb +103 -0
  86. data/lib/worldline/acquiring/sdk/v1/domain/api_payment_response.rb +126 -0
  87. data/lib/worldline/acquiring/sdk/v1/domain/api_payment_reversal_request.rb +61 -0
  88. data/lib/worldline/acquiring/sdk/v1/domain/api_payment_summary_for_response.rb +66 -0
  89. data/lib/worldline/acquiring/sdk/v1/domain/api_references_for_responses.rb +48 -0
  90. data/lib/worldline/acquiring/sdk/v1/domain/api_refund_request.rb +88 -0
  91. data/lib/worldline/acquiring/sdk/v1/domain/api_refund_resource.rb +110 -0
  92. data/lib/worldline/acquiring/sdk/v1/domain/api_refund_response.rb +133 -0
  93. data/lib/worldline/acquiring/sdk/v1/domain/api_refund_summary_for_response.rb +66 -0
  94. data/lib/worldline/acquiring/sdk/v1/domain/api_reversal_response.rb +36 -0
  95. data/lib/worldline/acquiring/sdk/v1/domain/api_technical_reversal_request.rb +50 -0
  96. data/lib/worldline/acquiring/sdk/v1/domain/api_technical_reversal_response.rb +62 -0
  97. data/lib/worldline/acquiring/sdk/v1/domain/card_data_for_dcc.rb +48 -0
  98. data/lib/worldline/acquiring/sdk/v1/domain/card_on_file_data.rb +52 -0
  99. data/lib/worldline/acquiring/sdk/v1/domain/card_payment_data.rb +114 -0
  100. data/lib/worldline/acquiring/sdk/v1/domain/card_payment_data_for_refund.rb +82 -0
  101. data/lib/worldline/acquiring/sdk/v1/domain/card_payment_data_for_resource.rb +43 -0
  102. data/lib/worldline/acquiring/sdk/v1/domain/card_payment_data_for_response.rb +52 -0
  103. data/lib/worldline/acquiring/sdk/v1/domain/card_payment_data_for_verification.rb +91 -0
  104. data/lib/worldline/acquiring/sdk/v1/domain/dcc_data.rb +55 -0
  105. data/lib/worldline/acquiring/sdk/v1/domain/dcc_proposal.rb +60 -0
  106. data/lib/worldline/acquiring/sdk/v1/domain/e_commerce_data.rb +52 -0
  107. data/lib/worldline/acquiring/sdk/v1/domain/e_commerce_data_for_account_verification.rb +45 -0
  108. data/lib/worldline/acquiring/sdk/v1/domain/e_commerce_data_for_response.rb +41 -0
  109. data/lib/worldline/acquiring/sdk/v1/domain/get_dcc_rate_request.rb +75 -0
  110. data/lib/worldline/acquiring/sdk/v1/domain/get_dcc_rate_response.rb +57 -0
  111. data/lib/worldline/acquiring/sdk/v1/domain/initial_card_on_file_data.rb +41 -0
  112. data/lib/worldline/acquiring/sdk/v1/domain/merchant_data.rb +76 -0
  113. data/lib/worldline/acquiring/sdk/v1/domain/network_token_data.rb +41 -0
  114. data/lib/worldline/acquiring/sdk/v1/domain/payment_references.rb +48 -0
  115. data/lib/worldline/acquiring/sdk/v1/domain/plain_card_data.rb +48 -0
  116. data/lib/worldline/acquiring/sdk/v1/domain/point_of_sale_data.rb +34 -0
  117. data/lib/worldline/acquiring/sdk/v1/domain/point_of_sale_data_for_dcc.rb +41 -0
  118. data/lib/worldline/acquiring/sdk/v1/domain/rate_data.rb +64 -0
  119. data/lib/worldline/acquiring/sdk/v1/domain/sub_operation.rb +94 -0
  120. data/lib/worldline/acquiring/sdk/v1/domain/sub_operation_for_refund.rb +87 -0
  121. data/lib/worldline/acquiring/sdk/v1/domain/subsequent_card_on_file_data.rb +48 -0
  122. data/lib/worldline/acquiring/sdk/v1/domain/three_d_secure.rb +62 -0
  123. data/lib/worldline/acquiring/sdk/v1/domain/transaction_data_for_dcc.rb +52 -0
  124. data/lib/worldline/acquiring/sdk/v1/domain.rb +4 -0
  125. data/lib/worldline/acquiring/sdk/v1/exception_factory.rb +48 -0
  126. data/lib/worldline/acquiring/sdk/v1/ping/ping_client.rb +52 -0
  127. data/lib/worldline/acquiring/sdk/v1/ping.rb +4 -0
  128. data/lib/worldline/acquiring/sdk/v1/platform_exception.rb +23 -0
  129. data/lib/worldline/acquiring/sdk/v1/reference_exception.rb +23 -0
  130. data/lib/worldline/acquiring/sdk/v1/v1_client.rb +43 -0
  131. data/lib/worldline/acquiring/sdk/v1/validation_exception.rb +23 -0
  132. data/lib/worldline/acquiring/sdk/v1.rb +4 -0
  133. data/lib/worldline/acquiring/sdk.rb +1 -0
  134. data/spec/comparable_extension.rb +29 -0
  135. data/spec/fixtures/resources/authentication/oauth2AccessToken.expired.json +4 -0
  136. data/spec/fixtures/resources/authentication/oauth2AccessToken.invalidClient.json +4 -0
  137. data/spec/fixtures/resources/authentication/oauth2AccessToken.json +4 -0
  138. data/spec/fixtures/resources/communication/getWithQueryParams.json +3 -0
  139. data/spec/fixtures/resources/communication/getWithoutQueryParams.json +3 -0
  140. data/spec/fixtures/resources/communication/notFound.html +1 -0
  141. data/spec/fixtures/resources/communication/postWithBadRequestResponse.json +11 -0
  142. data/spec/fixtures/resources/communication/postWithCreatedResponse.json +6 -0
  143. data/spec/fixtures/resources/communication/unknownServerError.json +10 -0
  144. data/spec/fixtures/resources/logging/bodyNoObfuscation.json +7 -0
  145. data/spec/fixtures/resources/logging/bodyWithBinObfuscated.json +3 -0
  146. data/spec/fixtures/resources/logging/bodyWithBinOriginal.json +3 -0
  147. data/spec/fixtures/resources/logging/bodyWithCardCustomObfuscated.json +13 -0
  148. data/spec/fixtures/resources/logging/bodyWithCardObfuscated.json +13 -0
  149. data/spec/fixtures/resources/logging/bodyWithCardOriginal.json +13 -0
  150. data/spec/fixtures/resources/logging/bodyWithObjectObfuscated.json +5 -0
  151. data/spec/fixtures/resources/logging/bodyWithObjectOriginal.json +5 -0
  152. data/spec/fixtures/resources/properties.oauth2.yml +8 -0
  153. data/spec/fixtures/resources/properties.proxy.yml +14 -0
  154. data/spec/integration/connection_pooling_spec.rb +74 -0
  155. data/spec/integration/multipart_form_data_spec.rb +216 -0
  156. data/spec/integration/process_payment_spec.rb +43 -0
  157. data/spec/integration/request_dcc_rate_spec.rb +24 -0
  158. data/spec/integration/sdk_proxy_spec.rb +70 -0
  159. data/spec/integration_setup.rb +111 -0
  160. data/spec/lib/authentication/oauth2_authenticator_spec.rb +68 -0
  161. data/spec/lib/client_spec.rb +47 -0
  162. data/spec/lib/communication/default_connection_logger_spec.rb +484 -0
  163. data/spec/lib/communication/default_connection_spec.rb +352 -0
  164. data/spec/lib/communication/metadata_provider_spec.rb +93 -0
  165. data/spec/lib/communicator_configuration_spec.rb +181 -0
  166. data/spec/lib/communicator_spec.rb +34 -0
  167. data/spec/lib/factory_spec.rb +38 -0
  168. data/spec/lib/json/default_marshaller_spec.rb +39 -0
  169. data/spec/lib/logging/obfuscation/body_obfuscator_spec.rb +86 -0
  170. data/spec/lib/logging/obfuscation/header_obfuscator_spec.rb +100 -0
  171. data/spec/lib/logging/ruby_communicator_logger_spec.rb +92 -0
  172. data/spec/lib/logging/stdout_communicator_logger_spec.rb +64 -0
  173. data/spec/spec_helper.rb +32 -0
  174. 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 }