stripe 4.7.1 → 4.8.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7c8260e6865f7cede359b5b5ed870afa289df71b22ec9cb54ee2fd4d2ad7180f
4
- data.tar.gz: 7e34b13f458beb6da7efe8860733163e097cb7a0b186ef18aacdf558ec25993d
3
+ metadata.gz: 2f7c24b1f5de9f966aeec73391ac6153cb4c3b44f720c89839b163b3a2d46c4e
4
+ data.tar.gz: 79ec62aece03a2a98858749d1aaff4fc198b130dbd409a18fd7ba2903322d7c8
5
5
  SHA512:
6
- metadata.gz: 23733735e3c7835e743208ee72aff1c0c71bc9c424feace8995d3691f86efb9ce61773adb349b18060bfdb32893dd157c37bffdf7f83785cbec920d9f1520453
7
- data.tar.gz: e63472b1c8a9a16a0c6974c65fae0d5c664a9c7e9ef53c99285641bd95532b5da0de8007946b0490d96f920fa8af7dbd5707505c3af7611f31b8fbd77b80e97a
6
+ metadata.gz: 53be26caee7e296440f78b10e83b87d7ab5e7346932a670b35a92be9bcba9e436812f47e32fc098db76edaada9acde75dcfdc8547d51769a2679609578d32ef5
7
+ data.tar.gz: f1787c95d33004299cf40f469e793ca8af8072b7243ece7addb581056250f15dba338d8f000b2116623075382b031e79c08d4645fb478d7a9d1df342c27683bd
data/.rubocop_todo.yml CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  # Offense count: 19
10
10
  Metrics/AbcSize:
11
- Max: 53.26
11
+ Max: 54
12
12
 
13
13
  # Offense count: 27
14
14
  # Configuration parameters: CountComments, ExcludedMethods.
@@ -18,7 +18,7 @@ Metrics/BlockLength:
18
18
  # Offense count: 8
19
19
  # Configuration parameters: CountComments.
20
20
  Metrics/ClassLength:
21
- Max: 659
21
+ Max: 670
22
22
 
23
23
  # Offense count: 11
24
24
  Metrics/CyclomaticComplexity:
data/CHANGELOG.md CHANGED
@@ -1,5 +1,8 @@
1
1
  # Changelog
2
2
 
3
+ ## 4.8.0 - 2019-02-03
4
+ * [#741](https://github.com/stripe/stripe-ruby/pull/741) Use `FaradayStripeEncoder` to encode all parameter styles
5
+
3
6
  ## 4.7.1 - 2019-02-01
4
7
  * [#740](https://github.com/stripe/stripe-ruby/pull/740) Fix query encoding for integer-indexed maps
5
8
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 4.7.1
1
+ 4.8.0
@@ -123,24 +123,17 @@ module Stripe
123
123
  api_base: nil, api_key: nil, headers: {}, params: {})
124
124
  api_base ||= Stripe.api_base
125
125
  api_key ||= Stripe.api_key
126
+ params = Util.objects_to_ids(params)
126
127
 
127
128
  check_api_key!(api_key)
128
129
 
129
- params = Util.objects_to_ids(params)
130
- url = api_url(path, api_base)
131
-
132
130
  body = nil
133
131
  query_params = nil
134
-
135
132
  case method.to_s.downcase.to_sym
136
133
  when :get, :head, :delete
137
134
  query_params = params
138
135
  else
139
- body = if headers[:content_type] && headers[:content_type] == "multipart/form-data"
140
- params
141
- else
142
- Util.encode_parameters(params)
143
- end
136
+ body = params
144
137
  end
145
138
 
146
139
  # This works around an edge case where we end up with both query
@@ -162,6 +155,8 @@ module Stripe
162
155
 
163
156
  headers = request_headers(api_key, method)
164
157
  .update(Util.normalize_headers(headers))
158
+ params_encoder = FaradayStripeEncoder.new
159
+ url = api_url(path, api_base)
165
160
 
166
161
  # stores information on the request we're about to make so that we don't
167
162
  # have to pass as many parameters around for logging.
@@ -169,19 +164,19 @@ module Stripe
169
164
  context.account = headers["Stripe-Account"]
170
165
  context.api_key = api_key
171
166
  context.api_version = headers["Stripe-Version"]
172
- context.body = body
167
+ context.body = body ? params_encoder.encode(body) : nil
173
168
  context.idempotency_key = headers["Idempotency-Key"]
174
169
  context.method = method
175
170
  context.path = path
176
- context.query_params = query_params ? Util.encode_parameters(query_params) : nil
171
+ context.query_params = query_params ? params_encoder.encode(query_params) : nil
177
172
 
173
+ # note that both request body and query params will be passed through
174
+ # `FaradayStripeEncoder`
178
175
  http_resp = execute_request_with_rescues(api_base, context) do
179
176
  conn.run_request(method, url, body, headers) do |req|
180
177
  req.options.open_timeout = Stripe.open_timeout
181
- req.options.params_encoder = FaradayStripeEncoder
178
+ req.options.params_encoder = params_encoder
182
179
  req.options.timeout = Stripe.read_timeout
183
-
184
- # note that these will be passed through `FaradayStripeEncoder`
185
180
  req.params = query_params unless query_params.nil?
186
181
  end
187
182
  end
@@ -205,16 +200,53 @@ module Stripe
205
200
  # -- in particular when we send our integer-indexed maps (i.e. arrays),
206
201
  # Faraday ends up stripping out the integer indexes.
207
202
  #
208
- # We work around the problem by implementing our own simplified decoder and
203
+ # We work around the problem by implementing our own simplified encoder and
209
204
  # telling Faraday to use that.
205
+ #
206
+ # The class also performs simple caching so that we don't have to encode
207
+ # parameters twice for every request (once to build the request and once
208
+ # for logging).
209
+ #
210
+ # When initialized with `multipart: true`, the encoder just inspects the
211
+ # hash instead to get a decent representation for logging. In the case of a
212
+ # multipart request, Faraday won't use the result of this encoder.
210
213
  class FaradayStripeEncoder
211
- def self.encode(hash)
212
- Util.encode_parameters(hash)
214
+ def initialize
215
+ @cache = {}
213
216
  end
214
217
 
215
- def self.decode(_str)
218
+ # This is quite subtle, but for a `multipart/form-data` request Faraday
219
+ # will throw away the result of this encoder and build its body.
220
+ def encode(hash)
221
+ @cache.fetch(hash) do |k|
222
+ @cache[k] = Util.encode_parameters(replace_faraday_io(hash))
223
+ end
224
+ end
225
+
226
+ # We should never need to do this so it's not implemented.
227
+ def decode(_str)
216
228
  raise NotImplementedError, "#{self.class.name} does not implement #decode"
217
229
  end
230
+
231
+ # Replaces instances of `Faraday::UploadIO` with a simple string
232
+ # representation so that they'll log a little better. Faraday won't use
233
+ # these parameters, so it's okay that we did this.
234
+ #
235
+ # Unfortunately the string representation still doesn't look very nice
236
+ # because we still URL-encode special symbols in the final value. It's
237
+ # possible we could stop doing this and just leave it to Faraday to do
238
+ # the right thing.
239
+ private def replace_faraday_io(value)
240
+ if value.is_a?(Array)
241
+ value.each_with_index { |v, i| value[i] = replace_faraday_io(v) }
242
+ elsif value.is_a?(Hash)
243
+ value.each { |k, v| value[k] = replace_faraday_io(v) }
244
+ elsif value.is_a?(Faraday::UploadIO)
245
+ "FILE:#{value.original_filename}"
246
+ else
247
+ value
248
+ end
249
+ end
218
250
  end
219
251
 
220
252
  def api_url(url = "", api_base = nil)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Stripe
4
- VERSION = "4.7.1".freeze
4
+ VERSION = "4.8.0".freeze
5
5
  end
@@ -794,6 +794,16 @@ module Stripe
794
794
  assert(!trace_payload["last_request_metrics"]["request_duration_ms"].nil?)
795
795
  end
796
796
  end
797
+
798
+ context "FaradayStripeEncoder" do
799
+ should "replace Faraday::UploadIO instances in parameters" do
800
+ encoder = StripeClient::FaradayStripeEncoder.new
801
+ encoded = encoder.encode(foo: [
802
+ { file: Faraday::UploadIO.new(::File.new(__FILE__), nil) },
803
+ ])
804
+ assert_equal "foo[0][file]=FILE%3Astripe_client_test.rb", encoded
805
+ end
806
+ end
797
807
  end
798
808
 
799
809
  class SystemProfilerTest < Test::Unit::TestCase
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stripe
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.7.1
4
+ version: 4.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stripe
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-02-01 00:00:00.000000000 Z
11
+ date: 2019-02-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday