start_activemerchant 1.50.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 (218) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG +1769 -0
  3. data/CONTRIBUTORS +540 -0
  4. data/MIT-LICENSE +20 -0
  5. data/README.md +226 -0
  6. data/lib/active_merchant.rb +67 -0
  7. data/lib/active_merchant/billing.rb +15 -0
  8. data/lib/active_merchant/billing/apple_pay_payment_token.rb +22 -0
  9. data/lib/active_merchant/billing/avs_result.rb +98 -0
  10. data/lib/active_merchant/billing/base.rb +72 -0
  11. data/lib/active_merchant/billing/check.rb +76 -0
  12. data/lib/active_merchant/billing/compatibility.rb +120 -0
  13. data/lib/active_merchant/billing/credit_card.rb +404 -0
  14. data/lib/active_merchant/billing/credit_card_formatting.rb +24 -0
  15. data/lib/active_merchant/billing/credit_card_methods.rb +195 -0
  16. data/lib/active_merchant/billing/cvv_result.rb +38 -0
  17. data/lib/active_merchant/billing/gateway.rb +291 -0
  18. data/lib/active_merchant/billing/gateways.rb +14 -0
  19. data/lib/active_merchant/billing/gateways/allied_wallet.rb +203 -0
  20. data/lib/active_merchant/billing/gateways/app55.rb +176 -0
  21. data/lib/active_merchant/billing/gateways/authorize_net.rb +510 -0
  22. data/lib/active_merchant/billing/gateways/authorize_net_arb.rb +417 -0
  23. data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +976 -0
  24. data/lib/active_merchant/billing/gateways/axcessms.rb +181 -0
  25. data/lib/active_merchant/billing/gateways/balanced.rb +256 -0
  26. data/lib/active_merchant/billing/gateways/bank_frick.rb +225 -0
  27. data/lib/active_merchant/billing/gateways/banwire.rb +105 -0
  28. data/lib/active_merchant/billing/gateways/barclays_epdq.rb +314 -0
  29. data/lib/active_merchant/billing/gateways/barclays_epdq_extra_plus.rb +15 -0
  30. data/lib/active_merchant/billing/gateways/be2bill.rb +131 -0
  31. data/lib/active_merchant/billing/gateways/beanstream.rb +192 -0
  32. data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +389 -0
  33. data/lib/active_merchant/billing/gateways/beanstream_interac.rb +58 -0
  34. data/lib/active_merchant/billing/gateways/blue_pay.rb +506 -0
  35. data/lib/active_merchant/billing/gateways/bogus.rb +140 -0
  36. data/lib/active_merchant/billing/gateways/borgun.rb +211 -0
  37. data/lib/active_merchant/billing/gateways/bpoint.rb +277 -0
  38. data/lib/active_merchant/billing/gateways/braintree.rb +19 -0
  39. data/lib/active_merchant/billing/gateways/braintree/braintree_common.rb +9 -0
  40. data/lib/active_merchant/billing/gateways/braintree_blue.rb +574 -0
  41. data/lib/active_merchant/billing/gateways/braintree_orange.rb +20 -0
  42. data/lib/active_merchant/billing/gateways/bridge_pay.rb +189 -0
  43. data/lib/active_merchant/billing/gateways/card_save.rb +23 -0
  44. data/lib/active_merchant/billing/gateways/card_stream.rb +238 -0
  45. data/lib/active_merchant/billing/gateways/cashnet.rb +202 -0
  46. data/lib/active_merchant/billing/gateways/cc5.rb +201 -0
  47. data/lib/active_merchant/billing/gateways/cecabank.rb +229 -0
  48. data/lib/active_merchant/billing/gateways/cenpos.rb +262 -0
  49. data/lib/active_merchant/billing/gateways/certo_direct.rb +278 -0
  50. data/lib/active_merchant/billing/gateways/checkout.rb +216 -0
  51. data/lib/active_merchant/billing/gateways/checkout_v2.rb +200 -0
  52. data/lib/active_merchant/billing/gateways/commercegate.rb +143 -0
  53. data/lib/active_merchant/billing/gateways/conekta.rb +210 -0
  54. data/lib/active_merchant/billing/gateways/cyber_source.rb +720 -0
  55. data/lib/active_merchant/billing/gateways/data_cash.rb +600 -0
  56. data/lib/active_merchant/billing/gateways/dibs.rb +206 -0
  57. data/lib/active_merchant/billing/gateways/efsnet.rb +219 -0
  58. data/lib/active_merchant/billing/gateways/elavon.rb +348 -0
  59. data/lib/active_merchant/billing/gateways/epay.rb +274 -0
  60. data/lib/active_merchant/billing/gateways/evo_ca.rb +308 -0
  61. data/lib/active_merchant/billing/gateways/eway.rb +214 -0
  62. data/lib/active_merchant/billing/gateways/eway_managed.rb +291 -0
  63. data/lib/active_merchant/billing/gateways/eway_rapid.rb +522 -0
  64. data/lib/active_merchant/billing/gateways/exact.rb +227 -0
  65. data/lib/active_merchant/billing/gateways/ezic.rb +206 -0
  66. data/lib/active_merchant/billing/gateways/fat_zebra.rb +213 -0
  67. data/lib/active_merchant/billing/gateways/federated_canada.rb +160 -0
  68. data/lib/active_merchant/billing/gateways/finansbank.rb +23 -0
  69. data/lib/active_merchant/billing/gateways/first_giving.rb +143 -0
  70. data/lib/active_merchant/billing/gateways/first_pay.rb +160 -0
  71. data/lib/active_merchant/billing/gateways/firstdata_e4.rb +413 -0
  72. data/lib/active_merchant/billing/gateways/flo2cash.rb +215 -0
  73. data/lib/active_merchant/billing/gateways/flo2cash_simple.rb +20 -0
  74. data/lib/active_merchant/billing/gateways/garanti.rb +261 -0
  75. data/lib/active_merchant/billing/gateways/global_transport.rb +179 -0
  76. data/lib/active_merchant/billing/gateways/hdfc.rb +207 -0
  77. data/lib/active_merchant/billing/gateways/hps.rb +287 -0
  78. data/lib/active_merchant/billing/gateways/iats_payments.rb +277 -0
  79. data/lib/active_merchant/billing/gateways/ideal/ideal_base.rb +246 -0
  80. data/lib/active_merchant/billing/gateways/ideal/ideal_rabobank.pem +13 -0
  81. data/lib/active_merchant/billing/gateways/ideal/ideal_response.rb +29 -0
  82. data/lib/active_merchant/billing/gateways/ideal_rabobank.rb +66 -0
  83. data/lib/active_merchant/billing/gateways/inspire.rb +219 -0
  84. data/lib/active_merchant/billing/gateways/instapay.rb +163 -0
  85. data/lib/active_merchant/billing/gateways/ipp.rb +175 -0
  86. data/lib/active_merchant/billing/gateways/iridium.rb +457 -0
  87. data/lib/active_merchant/billing/gateways/itransact.rb +448 -0
  88. data/lib/active_merchant/billing/gateways/jetpay.rb +275 -0
  89. data/lib/active_merchant/billing/gateways/linkpoint.rb +438 -0
  90. data/lib/active_merchant/billing/gateways/litle.rb +345 -0
  91. data/lib/active_merchant/billing/gateways/maxipago.rb +197 -0
  92. data/lib/active_merchant/billing/gateways/merchant_e_solutions.rb +170 -0
  93. data/lib/active_merchant/billing/gateways/merchant_one.rb +114 -0
  94. data/lib/active_merchant/billing/gateways/merchant_partners.rb +245 -0
  95. data/lib/active_merchant/billing/gateways/merchant_ware.rb +319 -0
  96. data/lib/active_merchant/billing/gateways/merchant_ware_version_four.rb +268 -0
  97. data/lib/active_merchant/billing/gateways/merchant_warrior.rb +195 -0
  98. data/lib/active_merchant/billing/gateways/mercury.rb +326 -0
  99. data/lib/active_merchant/billing/gateways/metrics_global.rb +303 -0
  100. data/lib/active_merchant/billing/gateways/migs.rb +280 -0
  101. data/lib/active_merchant/billing/gateways/migs/migs_codes.rb +100 -0
  102. data/lib/active_merchant/billing/gateways/modern_payments.rb +37 -0
  103. data/lib/active_merchant/billing/gateways/modern_payments_cim.rb +219 -0
  104. data/lib/active_merchant/billing/gateways/monei.rb +307 -0
  105. data/lib/active_merchant/billing/gateways/moneris.rb +309 -0
  106. data/lib/active_merchant/billing/gateways/moneris_us.rb +298 -0
  107. data/lib/active_merchant/billing/gateways/money_movers.rb +152 -0
  108. data/lib/active_merchant/billing/gateways/nab_transact.rb +290 -0
  109. data/lib/active_merchant/billing/gateways/net_registry.rb +198 -0
  110. data/lib/active_merchant/billing/gateways/netaxept.rb +181 -0
  111. data/lib/active_merchant/billing/gateways/netbilling.rb +224 -0
  112. data/lib/active_merchant/billing/gateways/netpay.rb +223 -0
  113. data/lib/active_merchant/billing/gateways/network_merchants.rb +242 -0
  114. data/lib/active_merchant/billing/gateways/nmi.rb +256 -0
  115. data/lib/active_merchant/billing/gateways/ogone.rb +435 -0
  116. data/lib/active_merchant/billing/gateways/omise.rb +319 -0
  117. data/lib/active_merchant/billing/gateways/openpay.rb +194 -0
  118. data/lib/active_merchant/billing/gateways/optimal_payment.rb +314 -0
  119. data/lib/active_merchant/billing/gateways/orbital.rb +834 -0
  120. data/lib/active_merchant/billing/gateways/orbital/orbital_soft_descriptors.rb +47 -0
  121. data/lib/active_merchant/billing/gateways/pac_net_raven.rb +207 -0
  122. data/lib/active_merchant/billing/gateways/pago_facil.rb +122 -0
  123. data/lib/active_merchant/billing/gateways/pay_conex.rb +246 -0
  124. data/lib/active_merchant/billing/gateways/pay_gate_xml.rb +277 -0
  125. data/lib/active_merchant/billing/gateways/pay_hub.rb +213 -0
  126. data/lib/active_merchant/billing/gateways/pay_junction.rb +390 -0
  127. data/lib/active_merchant/billing/gateways/pay_secure.rb +112 -0
  128. data/lib/active_merchant/billing/gateways/paybox_direct.rb +188 -0
  129. data/lib/active_merchant/billing/gateways/payex.rb +412 -0
  130. data/lib/active_merchant/billing/gateways/payflow.rb +308 -0
  131. data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +220 -0
  132. data/lib/active_merchant/billing/gateways/payflow/payflow_express_response.rb +39 -0
  133. data/lib/active_merchant/billing/gateways/payflow/payflow_response.rb +13 -0
  134. data/lib/active_merchant/billing/gateways/payflow_express.rb +224 -0
  135. data/lib/active_merchant/billing/gateways/payflow_express_uk.rb +15 -0
  136. data/lib/active_merchant/billing/gateways/payflow_uk.rb +21 -0
  137. data/lib/active_merchant/billing/gateways/payment_express.rb +353 -0
  138. data/lib/active_merchant/billing/gateways/paymill.rb +282 -0
  139. data/lib/active_merchant/billing/gateways/paypal.rb +129 -0
  140. data/lib/active_merchant/billing/gateways/paypal/paypal_common_api.rb +679 -0
  141. data/lib/active_merchant/billing/gateways/paypal/paypal_express_response.rb +65 -0
  142. data/lib/active_merchant/billing/gateways/paypal/paypal_recurring_api.rb +262 -0
  143. data/lib/active_merchant/billing/gateways/paypal_ca.rb +13 -0
  144. data/lib/active_merchant/billing/gateways/paypal_digital_goods.rb +44 -0
  145. data/lib/active_merchant/billing/gateways/paypal_express.rb +264 -0
  146. data/lib/active_merchant/billing/gateways/paypal_express_common.rb +30 -0
  147. data/lib/active_merchant/billing/gateways/payscout.rb +162 -0
  148. data/lib/active_merchant/billing/gateways/paystation.rb +199 -0
  149. data/lib/active_merchant/billing/gateways/payu_in.rb +247 -0
  150. data/lib/active_merchant/billing/gateways/payway.rb +207 -0
  151. data/lib/active_merchant/billing/gateways/pin.rb +207 -0
  152. data/lib/active_merchant/billing/gateways/plugnpay.rb +283 -0
  153. data/lib/active_merchant/billing/gateways/psigate.rb +216 -0
  154. data/lib/active_merchant/billing/gateways/psl_card.rb +303 -0
  155. data/lib/active_merchant/billing/gateways/qbms.rb +292 -0
  156. data/lib/active_merchant/billing/gateways/quantum.rb +276 -0
  157. data/lib/active_merchant/billing/gateways/quickbooks.rb +280 -0
  158. data/lib/active_merchant/billing/gateways/quickpay.rb +26 -0
  159. data/lib/active_merchant/billing/gateways/quickpay/quickpay_common.rb +188 -0
  160. data/lib/active_merchant/billing/gateways/quickpay/quickpay_v10.rb +240 -0
  161. data/lib/active_merchant/billing/gateways/quickpay/quickpay_v4to7.rb +227 -0
  162. data/lib/active_merchant/billing/gateways/qvalent.rb +179 -0
  163. data/lib/active_merchant/billing/gateways/realex.rb +298 -0
  164. data/lib/active_merchant/billing/gateways/redsys.rb +406 -0
  165. data/lib/active_merchant/billing/gateways/s5.rb +226 -0
  166. data/lib/active_merchant/billing/gateways/sage.rb +173 -0
  167. data/lib/active_merchant/billing/gateways/sage/sage_bankcard.rb +89 -0
  168. data/lib/active_merchant/billing/gateways/sage/sage_core.rb +115 -0
  169. data/lib/active_merchant/billing/gateways/sage/sage_vault.rb +149 -0
  170. data/lib/active_merchant/billing/gateways/sage/sage_virtual_check.rb +97 -0
  171. data/lib/active_merchant/billing/gateways/sage_pay.rb +399 -0
  172. data/lib/active_merchant/billing/gateways/sallie_mae.rb +143 -0
  173. data/lib/active_merchant/billing/gateways/secure_net.rb +263 -0
  174. data/lib/active_merchant/billing/gateways/secure_pay.rb +201 -0
  175. data/lib/active_merchant/billing/gateways/secure_pay_au.rb +281 -0
  176. data/lib/active_merchant/billing/gateways/secure_pay_tech.rb +105 -0
  177. data/lib/active_merchant/billing/gateways/skip_jack.rb +451 -0
  178. data/lib/active_merchant/billing/gateways/smart_ps.rb +283 -0
  179. data/lib/active_merchant/billing/gateways/so_easy_pay.rb +194 -0
  180. data/lib/active_merchant/billing/gateways/spreedly_core.rb +247 -0
  181. data/lib/active_merchant/billing/gateways/stripe.rb +489 -0
  182. data/lib/active_merchant/billing/gateways/swipe_checkout.rb +157 -0
  183. data/lib/active_merchant/billing/gateways/tns.rb +227 -0
  184. data/lib/active_merchant/billing/gateways/trans_first.rb +126 -0
  185. data/lib/active_merchant/billing/gateways/transax.rb +23 -0
  186. data/lib/active_merchant/billing/gateways/transnational.rb +10 -0
  187. data/lib/active_merchant/billing/gateways/trust_commerce.rb +416 -0
  188. data/lib/active_merchant/billing/gateways/usa_epay.rb +25 -0
  189. data/lib/active_merchant/billing/gateways/usa_epay_advanced.rb +1516 -0
  190. data/lib/active_merchant/billing/gateways/usa_epay_transaction.rb +259 -0
  191. data/lib/active_merchant/billing/gateways/vanco.rb +280 -0
  192. data/lib/active_merchant/billing/gateways/verifi.rb +225 -0
  193. data/lib/active_merchant/billing/gateways/viaklix.rb +183 -0
  194. data/lib/active_merchant/billing/gateways/webpay.rb +97 -0
  195. data/lib/active_merchant/billing/gateways/wepay.rb +205 -0
  196. data/lib/active_merchant/billing/gateways/wirecard.rb +420 -0
  197. data/lib/active_merchant/billing/gateways/worldpay.rb +331 -0
  198. data/lib/active_merchant/billing/gateways/worldpay_online_payments.rb +204 -0
  199. data/lib/active_merchant/billing/gateways/worldpay_us.rb +181 -0
  200. data/lib/active_merchant/billing/model.rb +30 -0
  201. data/lib/active_merchant/billing/network_tokenization_credit_card.rb +24 -0
  202. data/lib/active_merchant/billing/payment_token.rb +21 -0
  203. data/lib/active_merchant/billing/rails.rb +3 -0
  204. data/lib/active_merchant/billing/response.rb +92 -0
  205. data/lib/active_merchant/connection.rb +172 -0
  206. data/lib/active_merchant/country.rb +332 -0
  207. data/lib/active_merchant/empty.rb +20 -0
  208. data/lib/active_merchant/errors.rb +35 -0
  209. data/lib/active_merchant/network_connection_retries.rb +79 -0
  210. data/lib/active_merchant/post_data.rb +24 -0
  211. data/lib/active_merchant/posts_data.rb +84 -0
  212. data/lib/active_merchant/version.rb +3 -0
  213. data/lib/activemerchant.rb +1 -0
  214. data/lib/certs/cacert.pem +3866 -0
  215. data/lib/support/gateway_support.rb +71 -0
  216. data/lib/support/outbound_hosts.rb +28 -0
  217. data/lib/support/ssl_verify.rb +93 -0
  218. metadata +387 -0
@@ -0,0 +1,332 @@
1
+ # encoding: utf-8
2
+
3
+ module ActiveMerchant #:nodoc:
4
+ class InvalidCountryCodeError < StandardError
5
+ end
6
+
7
+ class CountryCodeFormatError < StandardError
8
+ end
9
+
10
+ class CountryCode
11
+ attr_reader :value, :format
12
+ def initialize(value)
13
+ @value = value.to_s.upcase
14
+ detect_format
15
+ end
16
+
17
+ def to_s
18
+ value
19
+ end
20
+
21
+ private
22
+
23
+ def detect_format
24
+ case @value
25
+ when /^[[:alpha:]]{2}$/
26
+ @format = :alpha2
27
+ when /^[[:alpha:]]{3}$/
28
+ @format = :alpha3
29
+ when /^[[:digit:]]{3}$/
30
+ @format = :numeric
31
+ else
32
+ raise CountryCodeFormatError, "The country code is not formatted correctly #{@value}"
33
+ end
34
+ end
35
+ end
36
+
37
+ class Country
38
+ attr_reader :name
39
+
40
+ def initialize(options = {})
41
+ @name = options.delete(:name)
42
+ @codes = options.collect{|k,v| CountryCode.new(v)}
43
+ end
44
+
45
+ def code(format)
46
+ @codes.detect{|c| c.format == format}
47
+ end
48
+
49
+ def ==(other)
50
+ if other.class == ActiveMerchant::Country
51
+ (@name == other.name)
52
+ else
53
+ super
54
+ end
55
+ end
56
+
57
+ alias eql? ==
58
+
59
+ def hash
60
+ @name.hash
61
+ end
62
+
63
+ def to_s
64
+ @name
65
+ end
66
+
67
+ COUNTRIES = [
68
+ { alpha2: 'AF', name: 'Afghanistan', alpha3: 'AFG', numeric: '004' },
69
+ { alpha2: 'AL', name: 'Albania', alpha3: 'ALB', numeric: '008' },
70
+ { alpha2: 'DZ', name: 'Algeria', alpha3: 'DZA', numeric: '012' },
71
+ { alpha2: 'AS', name: 'American Samoa', alpha3: 'ASM', numeric: '016' },
72
+ { alpha2: 'AD', name: 'Andorra', alpha3: 'AND', numeric: '020' },
73
+ { alpha2: 'AO', name: 'Angola', alpha3: 'AGO', numeric: '024' },
74
+ { alpha2: 'AI', name: 'Anguilla', alpha3: 'AIA', numeric: '660' },
75
+ { alpha2: 'AG', name: 'Antigua and Barbuda', alpha3: 'ATG', numeric: '028' },
76
+ { alpha2: 'AR', name: 'Argentina', alpha3: 'ARG', numeric: '032' },
77
+ { alpha2: 'AM', name: 'Armenia', alpha3: 'ARM', numeric: '051' },
78
+ { alpha2: 'AW', name: 'Aruba', alpha3: 'ABW', numeric: '533' },
79
+ { alpha2: 'AU', name: 'Australia', alpha3: 'AUS', numeric: '036' },
80
+ { alpha2: 'AT', name: 'Austria', alpha3: 'AUT', numeric: '040' },
81
+ { alpha2: 'AZ', name: 'Azerbaijan', alpha3: 'AZE', numeric: '031' },
82
+ { alpha2: 'BS', name: 'Bahamas', alpha3: 'BHS', numeric: '044' },
83
+ { alpha2: 'BH', name: 'Bahrain', alpha3: 'BHR', numeric: '048' },
84
+ { alpha2: 'BD', name: 'Bangladesh', alpha3: 'BGD', numeric: '050' },
85
+ { alpha2: 'BB', name: 'Barbados', alpha3: 'BRB', numeric: '052' },
86
+ { alpha2: 'BY', name: 'Belarus', alpha3: 'BLR', numeric: '112' },
87
+ { alpha2: 'BE', name: 'Belgium', alpha3: 'BEL', numeric: '056' },
88
+ { alpha2: 'BZ', name: 'Belize', alpha3: 'BLZ', numeric: '084' },
89
+ { alpha2: 'BJ', name: 'Benin', alpha3: 'BEN', numeric: '204' },
90
+ { alpha2: 'BM', name: 'Bermuda', alpha3: 'BMU', numeric: '060' },
91
+ { alpha2: 'BT', name: 'Bhutan', alpha3: 'BTN', numeric: '064' },
92
+ { alpha2: 'BO', name: 'Bolivia', alpha3: 'BOL', numeric: '068' },
93
+ { alpha2: 'BA', name: 'Bosnia and Herzegovina', alpha3: 'BIH', numeric: '070' },
94
+ { alpha2: 'BW', name: 'Botswana', alpha3: 'BWA', numeric: '072' },
95
+ { alpha2: 'BV', name: 'Bouvet Island', alpha3: 'BVD', numeric: '074' },
96
+ { alpha2: 'BR', name: 'Brazil', alpha3: 'BRA', numeric: '076' },
97
+ { alpha2: 'IO', name: 'British Indian Ocean Territory', alpha3: 'IOT', numeric: '086' },
98
+ { alpha2: 'BN', name: 'Brunei Darussalam', alpha3: 'BRN', numeric: '096' },
99
+ { alpha2: 'BG', name: 'Bulgaria', alpha3: 'BGR', numeric: '100' },
100
+ { alpha2: 'BF', name: 'Burkina Faso', alpha3: 'BFA', numeric: '854' },
101
+ { alpha2: 'BI', name: 'Burundi', alpha3: 'BDI', numeric: '108' },
102
+ { alpha2: 'KH', name: 'Cambodia', alpha3: 'KHM', numeric: '116' },
103
+ { alpha2: 'CM', name: 'Cameroon', alpha3: 'CMR', numeric: '120' },
104
+ { alpha2: 'CA', name: 'Canada', alpha3: 'CAN', numeric: '124' },
105
+ { alpha2: 'CV', name: 'Cape Verde', alpha3: 'CPV', numeric: '132' },
106
+ { alpha2: 'KY', name: 'Cayman Islands', alpha3: 'CYM', numeric: '136' },
107
+ { alpha2: 'CF', name: 'Central African Republic', alpha3: 'CAF', numeric: '140' },
108
+ { alpha2: 'TD', name: 'Chad', alpha3: 'TCD', numeric: '148' },
109
+ { alpha2: 'CL', name: 'Chile', alpha3: 'CHL', numeric: '152' },
110
+ { alpha2: 'CN', name: 'China', alpha3: 'CHN', numeric: '156' },
111
+ { alpha2: 'CX', name: 'Christmas Island', alpha3: 'CXR', numeric: '162' },
112
+ { alpha2: 'CC', name: 'Cocos (Keeling) Islands', alpha3: 'CCK', numeric: '166' },
113
+ { alpha2: 'CO', name: 'Colombia', alpha3: 'COL', numeric: '170' },
114
+ { alpha2: 'KM', name: 'Comoros', alpha3: 'COM', numeric: '174' },
115
+ { alpha2: 'CG', name: 'Congo', alpha3: 'COG', numeric: '178' },
116
+ { alpha2: 'CD', name: 'Congo, the Democratic Republic of the', alpha3: 'COD', numeric: '180' },
117
+ { alpha2: 'CK', name: 'Cook Islands', alpha3: 'COK', numeric: '184' },
118
+ { alpha2: 'CR', name: 'Costa Rica', alpha3: 'CRI', numeric: '188' },
119
+ { alpha2: 'CI', name: 'Cote D\'Ivoire', alpha3: 'CIV', numeric: '384' },
120
+ { alpha2: 'HR', name: 'Croatia', alpha3: 'HRV', numeric: '191' },
121
+ { alpha2: 'CU', name: 'Cuba', alpha3: 'CUB', numeric: '192' },
122
+ { alpha2: 'CW', name: 'Curaçao', alpha3: 'CUW', numeric: '531' },
123
+ { alpha2: 'CY', name: 'Cyprus', alpha3: 'CYP', numeric: '196' },
124
+ { alpha2: 'CZ', name: 'Czech Republic', alpha3: 'CZE', numeric: '203' },
125
+ { alpha2: 'DK', name: 'Denmark', alpha3: 'DNK', numeric: '208' },
126
+ { alpha2: 'DJ', name: 'Djibouti', alpha3: 'DJI', numeric: '262' },
127
+ { alpha2: 'DM', name: 'Dominica', alpha3: 'DMA', numeric: '212' },
128
+ { alpha2: 'DO', name: 'Dominican Republic', alpha3: 'DOM', numeric: '214' },
129
+ { alpha2: 'EC', name: 'Ecuador', alpha3: 'ECU', numeric: '218' },
130
+ { alpha2: 'EG', name: 'Egypt', alpha3: 'EGY', numeric: '818' },
131
+ { alpha2: 'SV', name: 'El Salvador', alpha3: 'SLV', numeric: '222' },
132
+ { alpha2: 'GQ', name: 'Equatorial Guinea', alpha3: 'GNQ', numeric: '226' },
133
+ { alpha2: 'ER', name: 'Eritrea', alpha3: 'ERI', numeric: '232' },
134
+ { alpha2: 'EE', name: 'Estonia', alpha3: 'EST', numeric: '233' },
135
+ { alpha2: 'ET', name: 'Ethiopia', alpha3: 'ETH', numeric: '231' },
136
+ { alpha2: 'FK', name: 'Falkland Islands (Malvinas)', alpha3: 'FLK', numeric: '238' },
137
+ { alpha2: 'FO', name: 'Faroe Islands', alpha3: 'FRO', numeric: '234' },
138
+ { alpha2: 'FJ', name: 'Fiji', alpha3: 'FJI', numeric: '242' },
139
+ { alpha2: 'FI', name: 'Finland', alpha3: 'FIN', numeric: '246' },
140
+ { alpha2: 'FR', name: 'France', alpha3: 'FRA', numeric: '250' },
141
+ { alpha2: 'GF', name: 'French Guiana', alpha3: 'GUF', numeric: '254' },
142
+ { alpha2: 'PF', name: 'French Polynesia', alpha3: 'PYF', numeric: '258' },
143
+ { alpha2: 'TF', name: 'French Southern Territories', alpha3: 'ATF', numeric: '260' },
144
+ { alpha2: 'GA', name: 'Gabon', alpha3: 'GAB', numeric: '266' },
145
+ { alpha2: 'GM', name: 'Gambia', alpha3: 'GMB', numeric: '270' },
146
+ { alpha2: 'GE', name: 'Georgia', alpha3: 'GEO', numeric: '268' },
147
+ { alpha2: 'DE', name: 'Germany', alpha3: 'DEU', numeric: '276' },
148
+ { alpha2: 'GH', name: 'Ghana', alpha3: 'GHA', numeric: '288' },
149
+ { alpha2: 'GI', name: 'Gibraltar', alpha3: 'GIB', numeric: '292' },
150
+ { alpha2: 'GR', name: 'Greece', alpha3: 'GRC', numeric: '300' },
151
+ { alpha2: 'GL', name: 'Greenland', alpha3: 'GRL', numeric: '304' },
152
+ { alpha2: 'GD', name: 'Grenada', alpha3: 'GRD', numeric: '308' },
153
+ { alpha2: 'GP', name: 'Guadeloupe', alpha3: 'GLP', numeric: '312' },
154
+ { alpha2: 'GU', name: 'Guam', alpha3: 'GUM', numeric: '316' },
155
+ { alpha2: 'GT', name: 'Guatemala', alpha3: 'GTM', numeric: '320' },
156
+ { alpha2: 'GG', name: 'Guernsey', alpha3: 'GGY', numeric: '831' },
157
+ { alpha2: 'GN', name: 'Guinea', alpha3: 'GIN', numeric: '324' },
158
+ { alpha2: 'GW', name: 'Guinea-Bissau', alpha3: 'GNB', numeric: '624' },
159
+ { alpha2: 'GY', name: 'Guyana', alpha3: 'GUY', numeric: '328' },
160
+ { alpha2: 'HT', name: 'Haiti', alpha3: 'HTI', numeric: '332' },
161
+ { alpha2: 'HM', name: 'Heard Island And Mcdonald Islands', alpha3: 'HMD', numeric: '334' },
162
+ { alpha2: 'VA', name: 'Holy See (Vatican City State)', alpha3: 'VAT', numeric: '336' },
163
+ { alpha2: 'HN', name: 'Honduras', alpha3: 'HND', numeric: '340' },
164
+ { alpha2: 'HK', name: 'Hong Kong', alpha3: 'HKG', numeric: '344' },
165
+ { alpha2: 'HU', name: 'Hungary', alpha3: 'HUN', numeric: '348' },
166
+ { alpha2: 'IS', name: 'Iceland', alpha3: 'ISL', numeric: '352' },
167
+ { alpha2: 'IN', name: 'India', alpha3: 'IND', numeric: '356' },
168
+ { alpha2: 'ID', name: 'Indonesia', alpha3: 'IDN', numeric: '360' },
169
+ { alpha2: 'IR', name: 'Iran, Islamic Republic of', alpha3: 'IRN', numeric: '364' },
170
+ { alpha2: 'IQ', name: 'Iraq', alpha3: 'IRQ', numeric: '368' },
171
+ { alpha2: 'IE', name: 'Ireland', alpha3: 'IRL', numeric: '372' },
172
+ { alpha2: 'IM', name: 'Isle Of Man', alpha3: 'IMN', numeric: '833' },
173
+ { alpha2: 'IL', name: 'Israel', alpha3: 'ISR', numeric: '376' },
174
+ { alpha2: 'IT', name: 'Italy', alpha3: 'ITA', numeric: '380' },
175
+ { alpha2: 'JM', name: 'Jamaica', alpha3: 'JAM', numeric: '388' },
176
+ { alpha2: 'JP', name: 'Japan', alpha3: 'JPN', numeric: '392' },
177
+ { alpha2: 'JE', name: 'Jersey', alpha3: 'JEY', numeric: '832' },
178
+ { alpha2: 'JO', name: 'Jordan', alpha3: 'JOR', numeric: '400' },
179
+ { alpha2: 'KZ', name: 'Kazakhstan', alpha3: 'KAZ', numeric: '398' },
180
+ { alpha2: 'KE', name: 'Kenya', alpha3: 'KEN', numeric: '404' },
181
+ { alpha2: 'KI', name: 'Kiribati', alpha3: 'KIR', numeric: '296' },
182
+ { alpha2: 'KP', name: 'Korea, Democratic People\'s Republic of', alpha3: 'PRK', numeric: '408' },
183
+ { alpha2: 'KR', name: 'Korea, Republic of', alpha3: 'KOR', numeric: '410' },
184
+ { alpha2: 'KV', name: 'Kosovo', alpha3: 'KSV', numeric: '377' },
185
+ { alpha2: 'KW', name: 'Kuwait', alpha3: 'KWT', numeric: '414' },
186
+ { alpha2: 'KG', name: 'Kyrgyzstan', alpha3: 'KGZ', numeric: '417' },
187
+ { alpha2: 'LA', name: 'Lao People\'s Democratic Republic', alpha3: 'LAO', numeric: '418' },
188
+ { alpha2: 'LV', name: 'Latvia', alpha3: 'LVA', numeric: '428' },
189
+ { alpha2: 'LB', name: 'Lebanon', alpha3: 'LBN', numeric: '422' },
190
+ { alpha2: 'LS', name: 'Lesotho', alpha3: 'LSO', numeric: '426' },
191
+ { alpha2: 'LR', name: 'Liberia', alpha3: 'LBR', numeric: '430' },
192
+ { alpha2: 'LY', name: 'Libyan Arab Jamahiriya', alpha3: 'LBY', numeric: '434' },
193
+ { alpha2: 'LI', name: 'Liechtenstein', alpha3: 'LIE', numeric: '438' },
194
+ { alpha2: 'LT', name: 'Lithuania', alpha3: 'LTU', numeric: '440' },
195
+ { alpha2: 'LU', name: 'Luxembourg', alpha3: 'LUX', numeric: '442' },
196
+ { alpha2: 'MO', name: 'Macao', alpha3: 'MAC', numeric: '446' },
197
+ { alpha2: 'MK', name: 'Macedonia, the Former Yugoslav Republic of', alpha3: 'MKD', numeric: '807' },
198
+ { alpha2: 'MG', name: 'Madagascar', alpha3: 'MDG', numeric: '450' },
199
+ { alpha2: 'MW', name: 'Malawi', alpha3: 'MWI', numeric: '454' },
200
+ { alpha2: 'MY', name: 'Malaysia', alpha3: 'MYS', numeric: '458' },
201
+ { alpha2: 'MV', name: 'Maldives', alpha3: 'MDV', numeric: '462' },
202
+ { alpha2: 'ML', name: 'Mali', alpha3: 'MLI', numeric: '466' },
203
+ { alpha2: 'MT', name: 'Malta', alpha3: 'MLT', numeric: '470' },
204
+ { alpha2: 'MH', name: 'Marshall Islands', alpha3: 'MHL', numeric: '584' },
205
+ { alpha2: 'MQ', name: 'Martinique', alpha3: 'MTQ', numeric: '474' },
206
+ { alpha2: 'MR', name: 'Mauritania', alpha3: 'MRT', numeric: '478' },
207
+ { alpha2: 'MU', name: 'Mauritius', alpha3: 'MUS', numeric: '480' },
208
+ { alpha2: 'YT', name: 'Mayotte', alpha3: 'MYT', numeric: '175' },
209
+ { alpha2: 'MX', name: 'Mexico', alpha3: 'MEX', numeric: '484' },
210
+ { alpha2: 'FM', name: 'Micronesia, Federated States of', alpha3: 'FSM', numeric: '583' },
211
+ { alpha2: 'MD', name: 'Moldova, Republic of', alpha3: 'MDA', numeric: '498' },
212
+ { alpha2: 'MC', name: 'Monaco', alpha3: 'MCO', numeric: '492' },
213
+ { alpha2: 'MN', name: 'Mongolia', alpha3: 'MNG', numeric: '496' },
214
+ { alpha2: 'ME', name: 'Montenegro', alpha3: 'MNE', numeric: '499' },
215
+ { alpha2: 'MS', name: 'Montserrat', alpha3: 'MSR', numeric: '500' },
216
+ { alpha2: 'MA', name: 'Morocco', alpha3: 'MAR', numeric: '504' },
217
+ { alpha2: 'MZ', name: 'Mozambique', alpha3: 'MOZ', numeric: '508' },
218
+ { alpha2: 'MM', name: 'Myanmar', alpha3: 'MMR', numeric: '104' },
219
+ { alpha2: 'NA', name: 'Namibia', alpha3: 'NAM', numeric: '516' },
220
+ { alpha2: 'NR', name: 'Nauru', alpha3: 'NRU', numeric: '520' },
221
+ { alpha2: 'NP', name: 'Nepal', alpha3: 'NPL', numeric: '524' },
222
+ { alpha2: 'NL', name: 'Netherlands', alpha3: 'NLD', numeric: '528' },
223
+ { alpha2: 'AN', name: 'Netherlands Antilles', alpha3: 'ANT', numeric: '530' },
224
+ { alpha2: 'NC', name: 'New Caledonia', alpha3: 'NCL', numeric: '540' },
225
+ { alpha2: 'NZ', name: 'New Zealand', alpha3: 'NZL', numeric: '554' },
226
+ { alpha2: 'NI', name: 'Nicaragua', alpha3: 'NIC', numeric: '558' },
227
+ { alpha2: 'NE', name: 'Niger', alpha3: 'NER', numeric: '562' },
228
+ { alpha2: 'NG', name: 'Nigeria', alpha3: 'NGA', numeric: '566' },
229
+ { alpha2: 'NU', name: 'Niue', alpha3: 'NIU', numeric: '570' },
230
+ { alpha2: 'NF', name: 'Norfolk Island', alpha3: 'NFK', numeric: '574' },
231
+ { alpha2: 'MP', name: 'Northern Mariana Islands', alpha3: 'MNP', numeric: '580' },
232
+ { alpha2: 'NO', name: 'Norway', alpha3: 'NOR', numeric: '578' },
233
+ { alpha2: 'OM', name: 'Oman', alpha3: 'OMN', numeric: '512' },
234
+ { alpha2: 'PK', name: 'Pakistan', alpha3: 'PAK', numeric: '586' },
235
+ { alpha2: 'PW', name: 'Palau', alpha3: 'PLW', numeric: '585' },
236
+ { alpha2: 'PS', name: 'Palestinian Territory, Occupied', alpha3: 'PSE', numeric: '275' },
237
+ { alpha2: 'PA', name: 'Panama', alpha3: 'PAN', numeric: '591' },
238
+ { alpha2: 'PG', name: 'Papua New Guinea', alpha3: 'PNG', numeric: '598' },
239
+ { alpha2: 'PY', name: 'Paraguay', alpha3: 'PRY', numeric: '600' },
240
+ { alpha2: 'PE', name: 'Peru', alpha3: 'PER', numeric: '604' },
241
+ { alpha2: 'PH', name: 'Philippines', alpha3: 'PHL', numeric: '608' },
242
+ { alpha2: 'PN', name: 'Pitcairn', alpha3: 'PCN', numeric: '612' },
243
+ { alpha2: 'PL', name: 'Poland', alpha3: 'POL', numeric: '616' },
244
+ { alpha2: 'PT', name: 'Portugal', alpha3: 'PRT', numeric: '620' },
245
+ { alpha2: 'PR', name: 'Puerto Rico', alpha3: 'PRI', numeric: '630' },
246
+ { alpha2: 'QA', name: 'Qatar', alpha3: 'QAT', numeric: '634' },
247
+ { alpha2: 'RE', name: 'Reunion', alpha3: 'REU', numeric: '638' },
248
+ { alpha2: 'RO', name: 'Romania', alpha3: 'ROM', numeric: '642' },
249
+ { alpha2: 'RU', name: 'Russian Federation', alpha3: 'RUS', numeric: '643' },
250
+ { alpha2: 'RW', name: 'Rwanda', alpha3: 'RWA', numeric: '646' },
251
+ { alpha2: 'BL', name: 'Saint Barthélemy', alpha3: 'BLM', numeric: '652' },
252
+ { alpha2: 'SH', name: 'Saint Helena', alpha3: 'SHN', numeric: '654' },
253
+ { alpha2: 'KN', name: 'Saint Kitts and Nevis', alpha3: 'KNA', numeric: '659' },
254
+ { alpha2: 'LC', name: 'Saint Lucia', alpha3: 'LCA', numeric: '662' },
255
+ { alpha2: 'MF', name: 'Saint Martin (French part)', alpha3: 'MAF', numeric: '663' },
256
+ { alpha2: 'PM', name: 'Saint Pierre and Miquelon', alpha3: 'SPM', numeric: '666' },
257
+ { alpha2: 'VC', name: 'Saint Vincent and the Grenadines', alpha3: 'VCT', numeric: '670' },
258
+ { alpha2: 'WS', name: 'Samoa', alpha3: 'WSM', numeric: '882' },
259
+ { alpha2: 'SM', name: 'San Marino', alpha3: 'SMR', numeric: '674' },
260
+ { alpha2: 'ST', name: 'Sao Tome and Principe', alpha3: 'STP', numeric: '678' },
261
+ { alpha2: 'SA', name: 'Saudi Arabia', alpha3: 'SAU', numeric: '682' },
262
+ { alpha2: 'SN', name: 'Senegal', alpha3: 'SEN', numeric: '686' },
263
+ { alpha2: 'RS', name: 'Serbia', alpha3: 'SRB', numeric: '688' },
264
+ { alpha2: 'SC', name: 'Seychelles', alpha3: 'SYC', numeric: '690' },
265
+ { alpha2: 'SL', name: 'Sierra Leone', alpha3: 'SLE', numeric: '694' },
266
+ { alpha2: 'SG', name: 'Singapore', alpha3: 'SGP', numeric: '702' },
267
+ { alpha2: 'SK', name: 'Slovakia', alpha3: 'SVK', numeric: '703' },
268
+ { alpha2: 'SI', name: 'Slovenia', alpha3: 'SVN', numeric: '705' },
269
+ { alpha2: 'SB', name: 'Solomon Islands', alpha3: 'SLB', numeric: '090' },
270
+ { alpha2: 'SO', name: 'Somalia', alpha3: 'SOM', numeric: '706' },
271
+ { alpha2: 'ZA', name: 'South Africa', alpha3: 'ZAF', numeric: '710' },
272
+ { alpha2: 'GS', name: 'South Georgia and the South Sandwich Islands', alpha3: 'SGS', numeric: '239' },
273
+ { alpha2: 'ES', name: 'Spain', alpha3: 'ESP', numeric: '724' },
274
+ { alpha2: 'LK', name: 'Sri Lanka', alpha3: 'LKA', numeric: '144' },
275
+ { alpha2: 'SD', name: 'Sudan', alpha3: 'SDN', numeric: '736' },
276
+ { alpha2: 'SR', name: 'Suriname', alpha3: 'SUR', numeric: '740' },
277
+ { alpha2: 'SJ', name: 'Svalbard and Jan Mayen', alpha3: 'SJM', numeric: '744' },
278
+ { alpha2: 'SZ', name: 'Swaziland', alpha3: 'SWZ', numeric: '748' },
279
+ { alpha2: 'SE', name: 'Sweden', alpha3: 'SWE', numeric: '752' },
280
+ { alpha2: 'CH', name: 'Switzerland', alpha3: 'CHE', numeric: '756' },
281
+ { alpha2: 'SY', name: 'Syrian Arab Republic', alpha3: 'SYR', numeric: '760' },
282
+ { alpha2: 'TW', name: 'Taiwan, Province of China', alpha3: 'TWN', numeric: '158' },
283
+ { alpha2: 'TJ', name: 'Tajikistan', alpha3: 'TJK', numeric: '762' },
284
+ { alpha2: 'TZ', name: 'Tanzania, United Republic of', alpha3: 'TZA', numeric: '834' },
285
+ { alpha2: 'TH', name: 'Thailand', alpha3: 'THA', numeric: '764' },
286
+ { alpha2: 'TL', name: 'Timor Leste', alpha3: 'TLS', numeric: '626' },
287
+ { alpha2: 'TG', name: 'Togo', alpha3: 'TGO', numeric: '768' },
288
+ { alpha2: 'TK', name: 'Tokelau', alpha3: 'TKL', numeric: '772' },
289
+ { alpha2: 'TO', name: 'Tonga', alpha3: 'TON', numeric: '776' },
290
+ { alpha2: 'TT', name: 'Trinidad and Tobago', alpha3: 'TTO', numeric: '780' },
291
+ { alpha2: 'TN', name: 'Tunisia', alpha3: 'TUN', numeric: '788' },
292
+ { alpha2: 'TR', name: 'Turkey', alpha3: 'TUR', numeric: '792' },
293
+ { alpha2: 'TM', name: 'Turkmenistan', alpha3: 'TKM', numeric: '795' },
294
+ { alpha2: 'TC', name: 'Turks and Caicos Islands', alpha3: 'TCA', numeric: '796' },
295
+ { alpha2: 'TV', name: 'Tuvalu', alpha3: 'TUV', numeric: '798' },
296
+ { alpha2: 'UG', name: 'Uganda', alpha3: 'UGA', numeric: '800' },
297
+ { alpha2: 'UA', name: 'Ukraine', alpha3: 'UKR', numeric: '804' },
298
+ { alpha2: 'AE', name: 'United Arab Emirates', alpha3: 'ARE', numeric: '784' },
299
+ { alpha2: 'GB', name: 'United Kingdom', alpha3: 'GBR', numeric: '826' },
300
+ { alpha2: 'US', name: 'United States', alpha3: 'USA', numeric: '840' },
301
+ { alpha2: 'UM', name: 'United States Minor Outlying Islands', alpha3: 'UMI', numeric: '581' },
302
+ { alpha2: 'UY', name: 'Uruguay', alpha3: 'URY', numeric: '858' },
303
+ { alpha2: 'UZ', name: 'Uzbekistan', alpha3: 'UZB', numeric: '860' },
304
+ { alpha2: 'VU', name: 'Vanuatu', alpha3: 'VUT', numeric: '548' },
305
+ { alpha2: 'VE', name: 'Venezuela', alpha3: 'VEN', numeric: '862' },
306
+ { alpha2: 'VN', name: 'Viet Nam', alpha3: 'VNM', numeric: '704' },
307
+ { alpha2: 'VG', name: 'Virgin Islands, British', alpha3: 'VGB', numeric: '092' },
308
+ { alpha2: 'VI', name: 'Virgin Islands, U.S.', alpha3: 'VIR', numeric: '850' },
309
+ { alpha2: 'WF', name: 'Wallis and Futuna', alpha3: 'WLF', numeric: '876' },
310
+ { alpha2: 'EH', name: 'Western Sahara', alpha3: 'ESH', numeric: '732' },
311
+ { alpha2: 'YE', name: 'Yemen', alpha3: 'YEM', numeric: '887' },
312
+ { alpha2: 'ZM', name: 'Zambia', alpha3: 'ZMB', numeric: '894' },
313
+ { alpha2: 'ZW', name: 'Zimbabwe', alpha3: 'ZWE', numeric: '716' },
314
+ { alpha2: 'AX', name: 'Åland Islands', alpha3: 'ALA', numeric: '248' }
315
+ ]
316
+
317
+ def self.find(name)
318
+ raise InvalidCountryCodeError, "Cannot lookup country for an empty name" if name.blank?
319
+
320
+ case name.length
321
+ when 2, 3
322
+ upcase_name = name.upcase
323
+ country_code = CountryCode.new(name)
324
+ country = COUNTRIES.detect{|c| c[country_code.format] == upcase_name }
325
+ else
326
+ country = COUNTRIES.detect{|c| c[:name] == name }
327
+ end
328
+ raise InvalidCountryCodeError, "No country could be found for the country #{name}" if country.nil?
329
+ Country.new(country.dup)
330
+ end
331
+ end
332
+ end
@@ -0,0 +1,20 @@
1
+ module ActiveMerchant
2
+ module Empty
3
+ private
4
+
5
+ def empty?(value)
6
+ case value
7
+ when nil
8
+ true
9
+ when Array, Hash
10
+ value.empty?
11
+ when String
12
+ value.strip.empty?
13
+ when Numeric
14
+ (value == 0)
15
+ else
16
+ false
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,35 @@
1
+ module ActiveMerchant #:nodoc:
2
+ class ActiveMerchantError < StandardError #:nodoc:
3
+ end
4
+
5
+ class ConnectionError < ActiveMerchantError # :nodoc:
6
+ attr_reader :triggering_exception
7
+
8
+ def initialize(message, triggering_exception)
9
+ super(message)
10
+ @triggering_exception = triggering_exception
11
+ end
12
+ end
13
+
14
+ class RetriableConnectionError < ConnectionError # :nodoc:
15
+ end
16
+
17
+ class ResponseError < ActiveMerchantError # :nodoc:
18
+ attr_reader :response
19
+
20
+ def initialize(response, message = nil)
21
+ @response = response
22
+ @message = message
23
+ end
24
+
25
+ def to_s
26
+ "Failed with #{response.code} #{response.message if response.respond_to?(:message)}"
27
+ end
28
+ end
29
+
30
+ class ClientCertificateError < ActiveMerchantError # :nodoc
31
+ end
32
+
33
+ class InvalidResponseError < ActiveMerchantError # :nodoc
34
+ end
35
+ end
@@ -0,0 +1,79 @@
1
+ module ActiveMerchant
2
+ module NetworkConnectionRetries
3
+ DEFAULT_RETRIES = 3
4
+ DEFAULT_CONNECTION_ERRORS = {
5
+ EOFError => "The remote server dropped the connection",
6
+ Errno::ECONNRESET => "The remote server reset the connection",
7
+ Timeout::Error => "The connection to the remote server timed out",
8
+ Errno::ETIMEDOUT => "The connection to the remote server timed out",
9
+ SocketError => "The connection to the remote server could not be established",
10
+ Errno::EHOSTUNREACH => "The connection to the remote server could not be established",
11
+ OpenSSL::SSL::SSLError => "The SSL connection to the remote server could not be established"
12
+ }
13
+
14
+ def self.included(base)
15
+ base.send(:attr_accessor, :retry_safe)
16
+ end
17
+
18
+ def retry_exceptions(options={})
19
+ connection_errors = DEFAULT_CONNECTION_ERRORS.merge(options[:connection_exceptions] || {})
20
+
21
+ retry_network_exceptions(options) do
22
+ begin
23
+ yield
24
+ rescue Errno::ECONNREFUSED => e
25
+ raise ActiveMerchant::RetriableConnectionError.new("The remote server refused the connection", e)
26
+ rescue OpenSSL::X509::CertificateError => e
27
+ NetworkConnectionRetries.log(options[:logger], :error, e.message, options[:tag])
28
+ raise ActiveMerchant::ClientCertificateError, "The remote server did not accept the provided SSL certificate"
29
+ rescue Zlib::BufError => e
30
+ raise ActiveMerchant::InvalidResponseError, "The remote server replied with an invalid response"
31
+ rescue *connection_errors.keys => e
32
+ raise ActiveMerchant::ConnectionError.new(derived_error_message(connection_errors, e.class), e)
33
+ end
34
+ end
35
+ end
36
+
37
+ private
38
+
39
+ def retry_network_exceptions(options = {})
40
+ initial_retries = options[:max_retries] || DEFAULT_RETRIES
41
+ retries = initial_retries
42
+ request_start = nil
43
+
44
+ begin
45
+ request_start = Time.now.to_f
46
+ result = yield
47
+ log_with_retry_details(options[:logger], initial_retries-retries + 1, Time.now.to_f - request_start, "success", options[:tag])
48
+ result
49
+ rescue ActiveMerchant::RetriableConnectionError => e
50
+ retries -= 1
51
+
52
+ log_with_retry_details(options[:logger], initial_retries-retries, Time.now.to_f - request_start, e.message, options[:tag])
53
+ retry unless retries.zero?
54
+ raise ActiveMerchant::ConnectionError.new(e.message, e)
55
+ rescue ActiveMerchant::ConnectionError, ActiveMerchant::InvalidResponseError => e
56
+ retries -= 1
57
+ log_with_retry_details(options[:logger], initial_retries-retries, Time.now.to_f - request_start, e.message, options[:tag])
58
+ retry if (options[:retry_safe] || retry_safe) && !retries.zero?
59
+ raise
60
+ end
61
+ end
62
+
63
+ def self.log(logger, level, message, tag=nil)
64
+ tag ||= self.class.to_s
65
+ message = "[#{tag}] #{message}"
66
+ logger.send(level, message) if logger
67
+ end
68
+
69
+ private
70
+ def log_with_retry_details(logger, attempts, time, message, tag)
71
+ NetworkConnectionRetries.log(logger, :info, "connection_attempt=%d connection_request_time=%.4fs connection_msg=\"%s\"" % [attempts, time, message], tag)
72
+ end
73
+
74
+ def derived_error_message(errors, klass)
75
+ key = (errors.keys & klass.ancestors).first
76
+ key ? errors[key] : nil
77
+ end
78
+ end
79
+ end