excon 1.9.1 → 1.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 92c10c40bd4ae5913caef9236145d027dc83f7ae9bf3942a91590f8b57024788
4
- data.tar.gz: fa4d2d738e0cad415c7857773df9e8bfdaef62c13c13169f576037f602b3d9ff
3
+ metadata.gz: a8f339eac15303582618d7c092e0c31facc11e717477d11676ddf1cece1f4df8
4
+ data.tar.gz: f1225a0e544fb64eed9411d5f0c5028103a853e07acfa5df5b9c8d1057101297
5
5
  SHA512:
6
- metadata.gz: '048afa1b1b171dc7f39c0423030b4ebe3b02fdc8ad321e10c42ee13b51937b66122252ccd8aa9172c3562a9c0344937c4a8031f511f55bc160d188c360e0b061'
7
- data.tar.gz: 82949f5756c66d7f027f417d78b71bbaa7941954e71f6fee9925d4eccaa6f64f3e2939f7b6273cf76556c9172a2d8fcbaddbb4aca1b4a9211f110f51f9a46f83
6
+ metadata.gz: 37951c154ffa841570e55ec4bd9bd6894ccd4617cbf51f03e2606d341defde41e114d85b78af7cb67ffc9f46ba4fb8ca59398dcd219f4aeb0267ee79f5a20649
7
+ data.tar.gz: bf5f8bb104fcdcc6fe87d8f9a221775214af61b81df535f603ff1c1c47b44b5bfd441aef1bb35ede8761cdb2badd5ff52be93ecd2a3639a4809cf0fc3371f383
@@ -234,6 +234,12 @@ module Excon
234
234
  # @option params [String] :path appears after 'scheme://host:port/'
235
235
  # @option params [Hash] :query appended to the 'scheme://host:port/path/' in the form of '?key=value'
236
236
  def request(params={}, &block)
237
+ # Set once the socket is left fit for the next request. Leaving early
238
+ # without passing through the rescue below (Timeout.timeout,
239
+ # Thread#raise, Thread#kill, Interrupt, throw) can leave a request
240
+ # half-written or a response unread on it, so ensure then resets it.
241
+ socket_reusable = false
242
+
237
243
  # @data has defaults, merge in new params to override
238
244
  datum = @data.merge(params)
239
245
 
@@ -295,11 +301,6 @@ module Excon
295
301
 
296
302
  datum[:connection] = self
297
303
 
298
- # cleanup data left behind on persistent connection after interrupt
299
- if datum[:persistent] && !@persistent_socket_reusable
300
- reset
301
- end
302
-
303
304
  datum[:stack] = datum[:middlewares].map do |middleware|
304
305
  lambda {|stack| middleware.new(stack)}
305
306
  end.reverse.inject(self) do |middlewares, middleware|
@@ -308,9 +309,7 @@ module Excon
308
309
  datum = datum[:stack].request_call(datum)
309
310
 
310
311
  unless datum[:pipeline]
311
- @persistent_socket_reusable = false
312
312
  datum = response(datum)
313
- @persistent_socket_reusable = true
314
313
 
315
314
  if datum[:persistent]
316
315
  if (key = datum[:response][:headers].keys.detect {|k| k.casecmp?('Connection') })
@@ -322,12 +321,16 @@ module Excon
322
321
  reset
323
322
  end
324
323
 
324
+ socket_reusable = true
325
325
  Excon::Response.new(datum[:response])
326
326
  else
327
+ # the response is read later, by #requests
328
+ socket_reusable = true
327
329
  datum
328
330
  end
329
331
  rescue => error
330
332
  reset
333
+ socket_reusable = true
331
334
 
332
335
  # If we didn't get far enough to initialize datum and the middleware stack, just raise
333
336
  raise error if !datum
@@ -338,11 +341,16 @@ module Excon
338
341
  else
339
342
  raise error
340
343
  end
344
+ ensure
345
+ reset unless socket_reusable
341
346
  end
342
347
 
343
348
  # Sends the supplied requests to the destination host using pipelining.
344
349
  # @param pipeline_params [Array<Hash>] An array of one or more optional params, override defaults set in Connection.new, see #request for details
345
350
  def requests(pipeline_params)
351
+ # as in #request: reset unless every response was read
352
+ socket_reusable = false
353
+
346
354
  pipeline_params.each {|params| params.merge!(:pipeline => true, :persistent => true) }
347
355
  pipeline_params.last[:persistent] = @data[:persistent]
348
356
 
@@ -362,7 +370,10 @@ module Excon
362
370
  reset
363
371
  end
364
372
 
373
+ socket_reusable = true
365
374
  responses
375
+ ensure
376
+ reset unless socket_reusable
366
377
  end
367
378
 
368
379
  # Sends the supplied requests to the destination host using pipelining in
@@ -384,7 +395,6 @@ module Excon
384
395
  if (old_socket = sockets.delete(@socket_key))
385
396
  old_socket.close rescue nil
386
397
  end
387
- @persistent_socket_reusable = true
388
398
  end
389
399
 
390
400
  # Generate HTTP request verb methods
data/lib/excon/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Excon
4
- VERSION = "1.9.1"
4
+ VERSION = "1.10.0"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: excon
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.9.1
4
+ version: 1.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - dpiddy (Dan Peterson)