stripe 5.31.0 → 5.35.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 (118) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +18 -0
  3. data/VERSION +1 -1
  4. data/lib/stripe/api_operations/request.rb +35 -2
  5. data/lib/stripe/api_resource.rb +8 -0
  6. data/lib/stripe/connection_manager.rb +17 -2
  7. data/lib/stripe/object_types.rb +3 -0
  8. data/lib/stripe/resources.rb +3 -0
  9. data/lib/stripe/resources/identity/verification_report.rb +12 -0
  10. data/lib/stripe/resources/identity/verification_session.rb +35 -0
  11. data/lib/stripe/resources/tax_code.rb +10 -0
  12. data/lib/stripe/stripe_client.rb +120 -57
  13. data/lib/stripe/stripe_response.rb +80 -52
  14. data/lib/stripe/util.rb +3 -1
  15. data/lib/stripe/version.rb +1 -1
  16. data/stripe.gemspec +9 -2
  17. metadata +9 -198
  18. data/.editorconfig +0 -10
  19. data/.gitattributes +0 -4
  20. data/.github/ISSUE_TEMPLATE.md +0 -5
  21. data/.github/workflows/ci.yml +0 -34
  22. data/.gitignore +0 -8
  23. data/.rubocop.yml +0 -81
  24. data/.rubocop_todo.yml +0 -33
  25. data/.travis.yml +0 -38
  26. data/.vscode/extensions.json +0 -7
  27. data/.vscode/settings.json +0 -8
  28. data/test/openapi/README.md +0 -9
  29. data/test/stripe/account_link_test.rb +0 -18
  30. data/test/stripe/account_test.rb +0 -412
  31. data/test/stripe/alipay_account_test.rb +0 -37
  32. data/test/stripe/api_operations_test.rb +0 -80
  33. data/test/stripe/api_resource_test.rb +0 -646
  34. data/test/stripe/apple_pay_domain_test.rb +0 -46
  35. data/test/stripe/application_fee_refund_test.rb +0 -37
  36. data/test/stripe/application_fee_test.rb +0 -58
  37. data/test/stripe/balance_test.rb +0 -13
  38. data/test/stripe/balance_transaction_test.rb +0 -20
  39. data/test/stripe/bank_account_test.rb +0 -36
  40. data/test/stripe/billing_portal/configuration_test.rb +0 -37
  41. data/test/stripe/billing_portal/session_test.rb +0 -18
  42. data/test/stripe/capability_test.rb +0 -45
  43. data/test/stripe/charge_test.rb +0 -64
  44. data/test/stripe/checkout/session_test.rb +0 -53
  45. data/test/stripe/connection_manager_test.rb +0 -210
  46. data/test/stripe/country_spec_test.rb +0 -20
  47. data/test/stripe/coupon_test.rb +0 -61
  48. data/test/stripe/credit_note_test.rb +0 -90
  49. data/test/stripe/customer_balance_transaction_test.rb +0 -37
  50. data/test/stripe/customer_card_test.rb +0 -48
  51. data/test/stripe/customer_test.rb +0 -226
  52. data/test/stripe/dispute_test.rb +0 -51
  53. data/test/stripe/ephemeral_key_test.rb +0 -93
  54. data/test/stripe/errors_test.rb +0 -53
  55. data/test/stripe/exchange_rate_test.rb +0 -20
  56. data/test/stripe/file_link_test.rb +0 -41
  57. data/test/stripe/file_test.rb +0 -87
  58. data/test/stripe/instrumentation_test.rb +0 -74
  59. data/test/stripe/invoice_item_test.rb +0 -66
  60. data/test/stripe/invoice_line_item_test.rb +0 -8
  61. data/test/stripe/invoice_test.rb +0 -229
  62. data/test/stripe/issuing/authorization_test.rb +0 -72
  63. data/test/stripe/issuing/card_test.rb +0 -74
  64. data/test/stripe/issuing/cardholder_test.rb +0 -53
  65. data/test/stripe/issuing/dispute_test.rb +0 -54
  66. data/test/stripe/issuing/transaction_test.rb +0 -48
  67. data/test/stripe/list_object_test.rb +0 -202
  68. data/test/stripe/login_link_test.rb +0 -37
  69. data/test/stripe/mandate_test.rb +0 -14
  70. data/test/stripe/multipart_encoder_test.rb +0 -130
  71. data/test/stripe/oauth_test.rb +0 -149
  72. data/test/stripe/order_return_test.rb +0 -21
  73. data/test/stripe/order_test.rb +0 -82
  74. data/test/stripe/payment_intent_test.rb +0 -107
  75. data/test/stripe/payment_method_test.rb +0 -84
  76. data/test/stripe/payout_test.rb +0 -72
  77. data/test/stripe/person_test.rb +0 -46
  78. data/test/stripe/plan_test.rb +0 -98
  79. data/test/stripe/price_test.rb +0 -48
  80. data/test/stripe/product_test.rb +0 -58
  81. data/test/stripe/promotion_code_test.rb +0 -42
  82. data/test/stripe/radar/early_fraud_warning_test.rb +0 -22
  83. data/test/stripe/radar/value_list_item_test.rb +0 -48
  84. data/test/stripe/radar/value_list_test.rb +0 -61
  85. data/test/stripe/recipient_test.rb +0 -62
  86. data/test/stripe/refund_test.rb +0 -39
  87. data/test/stripe/reporting/report_run_test.rb +0 -33
  88. data/test/stripe/reporting/report_type_test.rb +0 -22
  89. data/test/stripe/reversal_test.rb +0 -43
  90. data/test/stripe/review_test.rb +0 -27
  91. data/test/stripe/setup_attempt_test.rb +0 -16
  92. data/test/stripe/setup_intent_test.rb +0 -84
  93. data/test/stripe/sigma/scheduled_query_run_test.rb +0 -22
  94. data/test/stripe/sku_test.rb +0 -60
  95. data/test/stripe/source_test.rb +0 -119
  96. data/test/stripe/stripe_client_test.rb +0 -1456
  97. data/test/stripe/stripe_configuration_test.rb +0 -159
  98. data/test/stripe/stripe_object_test.rb +0 -510
  99. data/test/stripe/stripe_response_test.rb +0 -95
  100. data/test/stripe/subscription_item_test.rb +0 -84
  101. data/test/stripe/subscription_schedule_test.rb +0 -82
  102. data/test/stripe/subscription_test.rb +0 -80
  103. data/test/stripe/tax_id_test.rb +0 -31
  104. data/test/stripe/tax_rate_test.rb +0 -43
  105. data/test/stripe/terminal/connection_token_test.rb +0 -16
  106. data/test/stripe/terminal/location_test.rb +0 -68
  107. data/test/stripe/terminal/reader_test.rb +0 -62
  108. data/test/stripe/three_d_secure_test.rb +0 -23
  109. data/test/stripe/topup_test.rb +0 -62
  110. data/test/stripe/transfer_test.rb +0 -88
  111. data/test/stripe/usage_record_summary_test.rb +0 -29
  112. data/test/stripe/util_test.rb +0 -402
  113. data/test/stripe/webhook_endpoint_test.rb +0 -59
  114. data/test/stripe/webhook_test.rb +0 -135
  115. data/test/stripe_mock.rb +0 -78
  116. data/test/stripe_test.rb +0 -137
  117. data/test/test_data.rb +0 -61
  118. data/test/test_helper.rb +0 -74
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7e821f192b447738c35b91b15911de51e0cd138c0e999230747c43e04a1b97c7
4
- data.tar.gz: ba43636f6bf6e95dfed2daa8078f22d81a4dca5b056dacf12bc979925c6a7786
3
+ metadata.gz: f51ef2fd825e626807098544261c034bf55a84cf59852a7ac1c88a213add62ca
4
+ data.tar.gz: 6df0829f6b372f47393a5a22cc8aba022c40620188c0e8c3619d41965d84837b
5
5
  SHA512:
6
- metadata.gz: c9d7e86de7356f7e6a8a929304b330c7692686a31596af70e2ed91c5e15c024102ed9a32f9a81ec07ac585f12a6a853cd28acee37ea95523e1b8788d7041e130
7
- data.tar.gz: 7ac1ca50526e7dce9f45cd4179dc17f5965ce24f5702dc1605bd449f25f852827b8f24ba6dbb32983142f34037296cd8c0c28927da576915fbbc42e8022f8892
6
+ metadata.gz: 1d0c7c97de7a70c94ebd08659f6a0630f3508347772d2ed7a799778f2c08db2e6a1540a9b77b377f31edeadc6d5a874da4e084994c8ce23e4690512db083c987
7
+ data.tar.gz: 180af07a05467d75b0a88907bf59a0f837981ab4cd6ca16673ec4f17bedcff33e7efcf80ff482cd14517b9a2efa25095ce018011fc82b70d62a20bddc1cd2525
data/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # Changelog
2
2
 
3
+ ## 5.35.0 - 2021-06-30
4
+ * [#985](https://github.com/stripe/stripe-ruby/pull/985) Update normalize_opts to use dup instead of clone.
5
+ * [#982](https://github.com/stripe/stripe-ruby/pull/982) Deprecate travis
6
+ * [#983](https://github.com/stripe/stripe-ruby/pull/983) Add support for making a request and receiving the response as a stream.
7
+
8
+ ## 5.34.0 - 2021-06-04
9
+ * [#981](https://github.com/stripe/stripe-ruby/pull/981) API Updates
10
+ * Add support for `TaxCode` API.
11
+
12
+ ## 5.33.0 - 2021-05-19
13
+ * [#979](https://github.com/stripe/stripe-ruby/pull/979) Add support for the Identify VerificationSession and VerificationReport APIs
14
+
15
+ ## 5.32.1 - 2021-04-05
16
+ * Correct use of regexp `match` in gemspec for old versions of Ruby
17
+
18
+ ## 5.32.0 - 2021-04-05
19
+ * [#973](https://github.com/stripe/stripe-ruby/pull/973) Reduce packed gem size
20
+
3
21
  ## 5.31.0 - 2021-04-02
4
22
  * [#968](https://github.com/stripe/stripe-ruby/pull/968) Allow StripeClient to be configured per instance
5
23
  * [#971](https://github.com/stripe/stripe-ruby/pull/971) On config change, only clear connection managers for changed config
data/VERSION CHANGED
@@ -1 +1 @@
1
- 5.31.0
1
+ 5.35.0
@@ -6,6 +6,28 @@ module Stripe
6
6
  module ClassMethods
7
7
  def execute_resource_request(method, url,
8
8
  params = {}, opts = {})
9
+ execute_resource_request_internal(
10
+ :execute_request, method, url, params, opts
11
+ )
12
+ end
13
+
14
+ def execute_resource_request_stream(method, url,
15
+ params = {}, opts = {},
16
+ &read_body_chunk_block)
17
+ execute_resource_request_internal(
18
+ :execute_request_stream,
19
+ method,
20
+ url,
21
+ params,
22
+ opts,
23
+ &read_body_chunk_block
24
+ )
25
+ end
26
+
27
+ private def execute_resource_request_internal(client_request_method_sym,
28
+ method, url,
29
+ params, opts,
30
+ &read_body_chunk_block)
9
31
  params ||= {}
10
32
 
11
33
  error_on_invalid_params(params)
@@ -22,10 +44,12 @@ module Stripe
22
44
  client = headers.delete(:client)
23
45
  # Assume all remaining opts must be headers
24
46
 
25
- resp, opts[:api_key] = client.execute_request(
47
+ resp, opts[:api_key] = client.send(
48
+ client_request_method_sym,
26
49
  method, url,
27
50
  api_base: api_base, api_key: api_key,
28
- headers: headers, params: params
51
+ headers: headers, params: params,
52
+ &read_body_chunk_block
29
53
  )
30
54
 
31
55
  # Hash#select returns an array before 1.9
@@ -89,6 +113,15 @@ module Stripe
89
113
  self.class.execute_resource_request(method, url, params, opts)
90
114
  end
91
115
 
116
+ protected def execute_resource_request_stream(method, url,
117
+ params = {}, opts = {},
118
+ &read_body_chunk_block)
119
+ opts = @opts.merge(Util.normalize_opts(opts))
120
+ self.class.execute_resource_request_stream(
121
+ method, url, params, opts, &read_body_chunk_block
122
+ )
123
+ end
124
+
92
125
  # See notes on `alias` above.
93
126
  alias request execute_resource_request
94
127
  end
@@ -115,5 +115,13 @@ module Stripe
115
115
  Util.convert_to_stripe_object(resp.data, opts)
116
116
  end
117
117
  end
118
+
119
+ protected def request_stream(method:, path:, params:, opts: {},
120
+ &read_body_chunk_block)
121
+ resp, = execute_resource_request_stream(
122
+ method, path, params, opts, &read_body_chunk_block
123
+ )
124
+ resp
125
+ end
118
126
  end
119
127
  end
@@ -66,7 +66,8 @@ module Stripe
66
66
 
67
67
  # Executes an HTTP request to the given URI with the given method. Also
68
68
  # allows a request body, headers, and query string to be specified.
69
- def execute_request(method, uri, body: nil, headers: nil, query: nil)
69
+ def execute_request(method, uri, body: nil, headers: nil, query: nil,
70
+ &block)
70
71
  # Perform some basic argument validation because it's easy to get
71
72
  # confused between strings and hashes for things like body and query
72
73
  # parameters.
@@ -92,8 +93,22 @@ module Stripe
92
93
  u.path
93
94
  end
94
95
 
96
+ method_name = method.to_s.upcase
97
+ has_response_body = method_name != "HEAD"
98
+ request = Net::HTTPGenericRequest.new(
99
+ method_name,
100
+ (body ? true : false),
101
+ has_response_body,
102
+ path,
103
+ headers
104
+ )
105
+
95
106
  @mutex.synchronize do
96
- connection.send_request(method.to_s.upcase, path, body, headers)
107
+ # The block parameter is special here. If a block is provided, the block
108
+ # is invoked with the Net::HTTPResponse. However, the body will not have
109
+ # been read yet in the block, and can be streamed by calling
110
+ # HTTPResponse#read_body.
111
+ connection.request(request, body, &block)
97
112
  end
98
113
  end
99
114
 
@@ -41,6 +41,8 @@ module Stripe
41
41
  File::OBJECT_NAME => File,
42
42
  File::OBJECT_NAME_ALT => File,
43
43
  FileLink::OBJECT_NAME => FileLink,
44
+ Identity::VerificationReport::OBJECT_NAME => Identity::VerificationReport,
45
+ Identity::VerificationSession::OBJECT_NAME => Identity::VerificationSession,
44
46
  Invoice::OBJECT_NAME => Invoice,
45
47
  InvoiceItem::OBJECT_NAME => InvoiceItem,
46
48
  InvoiceLineItem::OBJECT_NAME => InvoiceLineItem,
@@ -82,6 +84,7 @@ module Stripe
82
84
  Subscription::OBJECT_NAME => Subscription,
83
85
  SubscriptionItem::OBJECT_NAME => SubscriptionItem,
84
86
  SubscriptionSchedule::OBJECT_NAME => SubscriptionSchedule,
87
+ TaxCode::OBJECT_NAME => TaxCode,
85
88
  TaxId::OBJECT_NAME => TaxId,
86
89
  TaxRate::OBJECT_NAME => TaxRate,
87
90
  Terminal::ConnectionToken::OBJECT_NAME => Terminal::ConnectionToken,
@@ -30,6 +30,8 @@ require "stripe/resources/event"
30
30
  require "stripe/resources/exchange_rate"
31
31
  require "stripe/resources/file"
32
32
  require "stripe/resources/file_link"
33
+ require "stripe/resources/identity/verification_report"
34
+ require "stripe/resources/identity/verification_session"
33
35
  require "stripe/resources/invoice"
34
36
  require "stripe/resources/invoice_item"
35
37
  require "stripe/resources/invoice_line_item"
@@ -71,6 +73,7 @@ require "stripe/resources/source_transaction"
71
73
  require "stripe/resources/subscription"
72
74
  require "stripe/resources/subscription_item"
73
75
  require "stripe/resources/subscription_schedule"
76
+ require "stripe/resources/tax_code"
74
77
  require "stripe/resources/tax_id"
75
78
  require "stripe/resources/tax_rate"
76
79
  require "stripe/resources/terminal/connection_token"
@@ -0,0 +1,12 @@
1
+ # File generated from our OpenAPI spec
2
+ # frozen_string_literal: true
3
+
4
+ module Stripe
5
+ module Identity
6
+ class VerificationReport < APIResource
7
+ extend Stripe::APIOperations::List
8
+
9
+ OBJECT_NAME = "identity.verification_report"
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,35 @@
1
+ # File generated from our OpenAPI spec
2
+ # frozen_string_literal: true
3
+
4
+ module Stripe
5
+ module Identity
6
+ class VerificationSession < APIResource
7
+ extend Stripe::APIOperations::Create
8
+ extend Stripe::APIOperations::List
9
+ include Stripe::APIOperations::Save
10
+
11
+ OBJECT_NAME = "identity.verification_session"
12
+
13
+ custom_method :cancel, http_verb: :post
14
+ custom_method :redact, http_verb: :post
15
+
16
+ def cancel(params = {}, opts = {})
17
+ request_stripe_object(
18
+ method: :post,
19
+ path: resource_url + "/cancel",
20
+ params: params,
21
+ opts: opts
22
+ )
23
+ end
24
+
25
+ def redact(params = {}, opts = {})
26
+ request_stripe_object(
27
+ method: :post,
28
+ path: resource_url + "/redact",
29
+ params: params,
30
+ opts: opts
31
+ )
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,10 @@
1
+ # File generated from our OpenAPI spec
2
+ # frozen_string_literal: true
3
+
4
+ module Stripe
5
+ class TaxCode < APIResource
6
+ extend Stripe::APIOperations::List
7
+
8
+ OBJECT_NAME = "tax_code"
9
+ end
10
+ end
@@ -213,62 +213,9 @@ module Stripe
213
213
 
214
214
  def execute_request(method, path,
215
215
  api_base: nil, api_key: nil, headers: {}, params: {})
216
- raise ArgumentError, "method should be a symbol" \
217
- unless method.is_a?(Symbol)
218
- raise ArgumentError, "path should be a string" \
219
- unless path.is_a?(String)
220
-
221
- api_base ||= config.api_base
222
- api_key ||= config.api_key
223
- params = Util.objects_to_ids(params)
224
-
225
- check_api_key!(api_key)
226
-
227
- body_params = nil
228
- query_params = nil
229
- case method
230
- when :get, :head, :delete
231
- query_params = params
232
- else
233
- body_params = params
234
- end
235
-
236
- query_params, path = merge_query_params(query_params, path)
237
-
238
- headers = request_headers(api_key, method)
239
- .update(Util.normalize_headers(headers))
240
- url = api_url(path, api_base)
241
-
242
- # Merge given query parameters with any already encoded in the path.
243
- query = query_params ? Util.encode_parameters(query_params) : nil
244
-
245
- # Encoding body parameters is a little more complex because we may have
246
- # to send a multipart-encoded body. `body_log` is produced separately as
247
- # a log-friendly variant of the encoded form. File objects are displayed
248
- # as such instead of as their file contents.
249
- body, body_log =
250
- body_params ? encode_body(body_params, headers) : [nil, nil]
251
-
252
- # stores information on the request we're about to make so that we don't
253
- # have to pass as many parameters around for logging.
254
- context = RequestLogContext.new
255
- context.account = headers["Stripe-Account"]
256
- context.api_key = api_key
257
- context.api_version = headers["Stripe-Version"]
258
- context.body = body_log
259
- context.idempotency_key = headers["Idempotency-Key"]
260
- context.method = method
261
- context.path = path
262
- context.query = query
263
-
264
- http_resp = execute_request_with_rescues(method, api_base, context) do
265
- self.class
266
- .default_connection_manager(config)
267
- .execute_request(method, url,
268
- body: body,
269
- headers: headers,
270
- query: query)
271
- end
216
+ http_resp, api_key = execute_request_internal(
217
+ method, path, api_base, api_key, headers, params
218
+ )
272
219
 
273
220
  begin
274
221
  resp = StripeResponse.from_net_http(http_resp)
@@ -284,6 +231,38 @@ module Stripe
284
231
  [resp, api_key]
285
232
  end
286
233
 
234
+ # Executes a request and returns the body as a stream instead of converting
235
+ # it to a StripeObject. This should be used for any request where we expect
236
+ # an arbitrary binary response.
237
+ #
238
+ # A `read_body_chunk` block can be passed, which will be called repeatedly
239
+ # with the body chunks read from the socket.
240
+ #
241
+ # If a block is passed, a StripeHeadersOnlyResponse is returned as the
242
+ # block is expected to do all the necessary body processing. If no block is
243
+ # passed, then a StripeStreamResponse is returned containing an IO stream
244
+ # with the response body.
245
+ def execute_request_stream(method, path,
246
+ api_base: nil, api_key: nil,
247
+ headers: {}, params: {},
248
+ &read_body_chunk_block)
249
+ unless block_given?
250
+ raise ArgumentError,
251
+ "execute_request_stream requires a read_body_chunk_block"
252
+ end
253
+
254
+ http_resp, api_key = execute_request_internal(
255
+ method, path, api_base, api_key, headers, params, &read_body_chunk_block
256
+ )
257
+
258
+ # When the read_body_chunk_block is given, we no longer have access to the
259
+ # response body at this point and so return a response object containing
260
+ # only the headers. This is because the body was consumed by the block.
261
+ resp = StripeHeadersOnlyResponse.from_net_http(http_resp)
262
+
263
+ [resp, api_key]
264
+ end
265
+
287
266
  def store_last_response(object_id, resp)
288
267
  return unless last_response_has_key?(object_id)
289
268
 
@@ -451,6 +430,83 @@ module Stripe
451
430
  pruned_contexts.count
452
431
  end
453
432
 
433
+ private def execute_request_internal(method, path,
434
+ api_base, api_key, headers, params,
435
+ &read_body_chunk_block)
436
+ raise ArgumentError, "method should be a symbol" \
437
+ unless method.is_a?(Symbol)
438
+ raise ArgumentError, "path should be a string" \
439
+ unless path.is_a?(String)
440
+
441
+ api_base ||= config.api_base
442
+ api_key ||= config.api_key
443
+ params = Util.objects_to_ids(params)
444
+
445
+ check_api_key!(api_key)
446
+
447
+ body_params = nil
448
+ query_params = nil
449
+ case method
450
+ when :get, :head, :delete
451
+ query_params = params
452
+ else
453
+ body_params = params
454
+ end
455
+
456
+ query_params, path = merge_query_params(query_params, path)
457
+
458
+ headers = request_headers(api_key, method)
459
+ .update(Util.normalize_headers(headers))
460
+ url = api_url(path, api_base)
461
+
462
+ # Merge given query parameters with any already encoded in the path.
463
+ query = query_params ? Util.encode_parameters(query_params) : nil
464
+
465
+ # Encoding body parameters is a little more complex because we may have
466
+ # to send a multipart-encoded body. `body_log` is produced separately as
467
+ # a log-friendly variant of the encoded form. File objects are displayed
468
+ # as such instead of as their file contents.
469
+ body, body_log =
470
+ body_params ? encode_body(body_params, headers) : [nil, nil]
471
+
472
+ # stores information on the request we're about to make so that we don't
473
+ # have to pass as many parameters around for logging.
474
+ context = RequestLogContext.new
475
+ context.account = headers["Stripe-Account"]
476
+ context.api_key = api_key
477
+ context.api_version = headers["Stripe-Version"]
478
+ context.body = body_log
479
+ context.idempotency_key = headers["Idempotency-Key"]
480
+ context.method = method
481
+ context.path = path
482
+ context.query = query
483
+
484
+ # A block can be passed in to read the content directly from the response.
485
+ # We want to execute this block only when the response was actually
486
+ # successful. When it wasn't, we defer to the standard error handling as
487
+ # we have to read the body and parse the error JSON.
488
+ response_block =
489
+ if block_given?
490
+ lambda do |response|
491
+ unless should_handle_as_error(response.code.to_i)
492
+ response.read_body(&read_body_chunk_block)
493
+ end
494
+ end
495
+ end
496
+
497
+ http_resp = execute_request_with_rescues(method, api_base, context) do
498
+ self.class
499
+ .default_connection_manager(config)
500
+ .execute_request(method, url,
501
+ body: body,
502
+ headers: headers,
503
+ query: query,
504
+ &response_block)
505
+ end
506
+
507
+ [http_resp, api_key]
508
+ end
509
+
454
510
  private def api_url(url = "", api_base = nil)
455
511
  (api_base || config.api_base) + url
456
512
  end
@@ -490,6 +546,7 @@ module Stripe
490
546
  # that's more condusive to logging.
491
547
  flattened_params =
492
548
  flattened_params.map { |k, v| [k, v.is_a?(String) ? v : v.to_s] }.to_h
549
+
493
550
  else
494
551
  body = Util.encode_parameters(body_params)
495
552
  end
@@ -503,6 +560,10 @@ module Stripe
503
560
  [body, body_log]
504
561
  end
505
562
 
563
+ private def should_handle_as_error(http_status)
564
+ http_status >= 400
565
+ end
566
+
506
567
  private def execute_request_with_rescues(method, api_base, context)
507
568
  num_retries = 0
508
569
 
@@ -520,7 +581,9 @@ module Stripe
520
581
  http_status = resp.code.to_i
521
582
  context = context.dup_from_response_headers(resp)
522
583
 
523
- handle_error_response(resp, context) if http_status >= 400
584
+ if should_handle_as_error(http_status)
585
+ handle_error_response(resp, context)
586
+ end
524
587
 
525
588
  log_response(context, request_start, http_status, resp.body)
526
589
  notify_request_end(context, request_duration, http_status,