httpx 0.18.0 → 0.18.1

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: 372f89cdf05727a32d23467503299ae77831cb5d23356467dc0c7f3a22bbfd0c
4
- data.tar.gz: bbb3df9079bf4f5a449f37f34dd6b1d3208a978e8a8eaa7fdd69ea9d1829ac6c
3
+ metadata.gz: dc0ed6728252132961087b7747743f0011f2f8100eb9b242080b7ac29ce68752
4
+ data.tar.gz: 68c3c8f592d2e7599b7a5dcca4e9f73e7d61aba743bacb17d4c276c404203f5e
5
5
  SHA512:
6
- metadata.gz: 38211af1e56fbc823ad0780198579ff11d4fa4b5b64677af95e78361f8b274d0dc43b124697358f1a0b17c2d45e4cdd620f97ca983af7fa60ce59515e9b51785
7
- data.tar.gz: 2c9d48f3ad7a499046ab94ac3ee1831f1623ce44990de0f08320ac6e5ce3767ca938381cd7b96c3799477f201a811aa5c446d62f88bd58c6e1e0afd84c53af75
6
+ metadata.gz: 162b4b96df5b3b76bccdbe5940ed09aac4dea1d4b019321b07f859912d5d9fb770080d69198c70e4fd69a745723e250bcfce34e76baa83fdf3352f63d0b14620
7
+ data.tar.gz: 63099247e157ddd0b1f01bdbd459a51500b5bb7ac0a624a93c09958efbd10ec2c79027c5bb932ccacfa3335a8f9d0c7691b835ac30eabbe1ed6f7ced3a47421d
@@ -0,0 +1,12 @@
1
+ # 0.18.1
2
+
3
+ ## Bugfixes
4
+
5
+ * HTTP/1.1 pipelining logs were logging the previously-buffered requests all together for each triggered request, which created some confusion for users when reporting errors. This has been fixed.
6
+ * HTTP/2 coalescing is now skipped when performing TLS connections with VERIFY_NONE.
7
+ * HTTP/2 peer GOAWAY frames will now result in a (retryable) connection error, instead of being ignored and leaving a "ghost" connection behind.
8
+ * fixed total timeout call which was not raising the exception.
9
+
10
+ ## Chore
11
+
12
+ This gem now requires MFA-based gem releases.
@@ -36,6 +36,8 @@ module HTTPX
36
36
 
37
37
  request = @requests.first
38
38
 
39
+ return unless request
40
+
39
41
  return :w if request.interests == :w || !@buffer.empty?
40
42
 
41
43
  :r
@@ -313,8 +315,9 @@ module HTTPX
313
315
  end
314
316
 
315
317
  def join_headers(request)
316
- @buffer << "#{request.verb.to_s.upcase} #{headline_uri(request)} HTTP/#{@version.join(".")}" << CRLF
317
- log(color: :yellow) { "<- HEADLINE: #{@buffer.to_s.chomp.inspect}" }
318
+ headline = "#{request.verb.to_s.upcase} #{headline_uri(request)} HTTP/#{@version.join(".")}"
319
+ @buffer << headline << CRLF
320
+ log(color: :yellow) { "<- HEADLINE: #{headline.chomp.inspect}" }
318
321
  extra_headers = set_protocol_headers(request)
319
322
  join_headers2(request.headers.each(extra_headers))
320
323
  log { "<- " }
@@ -16,6 +16,12 @@ module HTTPX
16
16
  end
17
17
  end
18
18
 
19
+ class GoawayError < Error
20
+ def initialize
21
+ super(0, :no_error)
22
+ end
23
+ end
24
+
19
25
  attr_reader :streams, :pending
20
26
 
21
27
  def initialize(buffer, options)
@@ -302,7 +308,7 @@ module HTTPX
302
308
  @drains.delete(request)
303
309
  @streams.delete(request)
304
310
 
305
- if error && error != :no_error
311
+ if error
306
312
  ex = Error.new(stream.id, error)
307
313
  ex.set_backtrace(caller)
308
314
  response = ErrorResponse.new(request, ex, request.options)
@@ -344,9 +350,16 @@ module HTTPX
344
350
 
345
351
  def on_close(_last_frame, error, _payload)
346
352
  is_connection_closed = @connection.state == :closed
347
- if error && error != :no_error
353
+ if error
348
354
  @buffer.clear if is_connection_closed
349
- ex = Error.new(0, error)
355
+ if error == :no_error
356
+ ex = GoawayError.new
357
+ @pending.unshift(*@streams.keys)
358
+ @drains.clear
359
+ @streams.clear
360
+ else
361
+ ex = Error.new(0, error)
362
+ end
350
363
  ex.set_backtrace(caller)
351
364
  handle_error(ex)
352
365
  end
@@ -117,7 +117,8 @@ module HTTPX
117
117
  def coalescable?(connection)
118
118
  if @io.protocol == "h2" &&
119
119
  @origin.scheme == "https" &&
120
- connection.origin.scheme == "https"
120
+ connection.origin.scheme == "https" &&
121
+ @io.can_verify_peer?
121
122
  @io.verify_hostname(connection.origin.host)
122
123
  else
123
124
  @origin == connection.origin
@@ -241,7 +242,7 @@ module HTTPX
241
242
  if elapsed_time.negative?
242
243
  ex = TotalTimeoutError.new(@total_timeout, "Timed out after #{@total_timeout} seconds")
243
244
  ex.set_backtrace(caller)
244
- on_error(@total_timeout)
245
+ on_error(ex)
245
246
  return
246
247
  end
247
248
 
@@ -463,6 +464,7 @@ module HTTPX
463
464
  transition(:closing)
464
465
  transition(:closed)
465
466
  emit(:reset)
467
+
466
468
  @parser.reset if @parser
467
469
  transition(:idle)
468
470
  transition(:open)
data/lib/httpx/io/ssl.rb CHANGED
@@ -27,6 +27,10 @@ module HTTPX
27
27
  super
28
28
  end
29
29
 
30
+ def can_verify_peer?
31
+ @ctx.verify_mode == OpenSSL::SSL::VERIFY_PEER
32
+ end
33
+
30
34
  def verify_hostname(host)
31
35
  return false if @ctx.verify_mode == OpenSSL::SSL::VERIFY_NONE
32
36
  return false if !@io.respond_to?(:peer_cert) || @io.peer_cert.nil?
@@ -12,16 +12,19 @@ module HTTPX
12
12
  # TODO: pass max_retries in a configure/load block
13
13
 
14
14
  IDEMPOTENT_METHODS = %i[get options head put delete].freeze
15
- RETRYABLE_ERRORS = [IOError,
16
- EOFError,
17
- Errno::ECONNRESET,
18
- Errno::ECONNABORTED,
19
- Errno::EPIPE,
20
- TLSError,
21
- TimeoutError,
22
- Parser::Error,
23
- Errno::EINVAL,
24
- Errno::ETIMEDOUT].freeze
15
+ RETRYABLE_ERRORS = [
16
+ IOError,
17
+ EOFError,
18
+ Errno::ECONNRESET,
19
+ Errno::ECONNABORTED,
20
+ Errno::EPIPE,
21
+ Errno::EINVAL,
22
+ Errno::ETIMEDOUT,
23
+ Parser::Error,
24
+ TLSError,
25
+ TimeoutError,
26
+ Connection::HTTP2::GoawayError,
27
+ ].freeze
25
28
  DEFAULT_JITTER = ->(interval) { interval * (0.5 * (1 + rand)) }
26
29
 
27
30
  if ENV.key?("HTTPX_NO_JITTER")
data/lib/httpx/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module HTTPX
4
- VERSION = "0.18.0"
4
+ VERSION = "0.18.1"
5
5
  end
@@ -15,6 +15,11 @@ module HTTPX
15
15
  @max_requests: Integer
16
16
  @parser: Parser::HTTP1
17
17
  @buffer: Buffer
18
+ @version: [Integer, Integer]
19
+ @handshake_completed: bool
20
+ @pipelining: bool
21
+
22
+ @request: Request?
18
23
 
19
24
  def interests: () -> io_interests?
20
25
 
@@ -92,5 +92,8 @@ module HTTPX
92
92
 
93
93
  class Error < ::HTTPX::Error
94
94
  end
95
+
96
+ class GoawayError < Error
97
+ end
95
98
  end
96
99
  end
metadata CHANGED
@@ -1,24 +1,24 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: httpx
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.18.0
4
+ version: 0.18.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tiago Cardoso
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-02 00:00:00.000000000 Z
11
+ date: 2021-11-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: http-2-next
15
+ prerelease: false
15
16
  requirement: !ruby/object:Gem::Requirement
16
17
  requirements:
17
18
  - - ">="
18
19
  - !ruby/object:Gem::Version
19
20
  version: 0.4.1
20
21
  type: :runtime
21
- prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
@@ -33,58 +33,59 @@ extra_rdoc_files:
33
33
  - LICENSE.txt
34
34
  - README.md
35
35
  - doc/release_notes/0_0_1.md
36
- - doc/release_notes/0_0_2.md
37
- - doc/release_notes/0_0_3.md
38
- - doc/release_notes/0_0_4.md
36
+ - doc/release_notes/0_15_4.md
37
+ - doc/release_notes/0_14_5.md
38
+ - doc/release_notes/0_18_1.md
39
+ - doc/release_notes/0_1_0.md
39
40
  - doc/release_notes/0_0_5.md
40
- - doc/release_notes/0_10_0.md
41
- - doc/release_notes/0_10_1.md
42
- - doc/release_notes/0_10_2.md
43
- - doc/release_notes/0_11_0.md
44
- - doc/release_notes/0_11_1.md
41
+ - doc/release_notes/0_15_0.md
42
+ - doc/release_notes/0_14_1.md
43
+ - doc/release_notes/0_0_4.md
44
+ - doc/release_notes/0_15_1.md
45
+ - doc/release_notes/0_14_0.md
46
+ - doc/release_notes/0_14_4.md
47
+ - doc/release_notes/0_18_0.md
48
+ - doc/release_notes/0_6_5.md
49
+ - doc/release_notes/0_13_0.md
50
+ - doc/release_notes/0_6_1.md
45
51
  - doc/release_notes/0_11_2.md
52
+ - doc/release_notes/0_7_0.md
53
+ - doc/release_notes/0_6_0.md
54
+ - doc/release_notes/0_10_2.md
46
55
  - doc/release_notes/0_11_3.md
47
- - doc/release_notes/0_12_0.md
48
- - doc/release_notes/0_13_0.md
56
+ - doc/release_notes/0_8_2.md
57
+ - doc/release_notes/0_6_4.md
49
58
  - doc/release_notes/0_13_1.md
59
+ - doc/release_notes/0_12_0.md
60
+ - doc/release_notes/0_9_0.md
61
+ - doc/release_notes/0_6_3.md
62
+ - doc/release_notes/0_10_1.md
63
+ - doc/release_notes/0_11_0.md
64
+ - doc/release_notes/0_8_1.md
65
+ - doc/release_notes/0_5_0.md
66
+ - doc/release_notes/0_6_7.md
50
67
  - doc/release_notes/0_13_2.md
51
- - doc/release_notes/0_14_0.md
52
- - doc/release_notes/0_14_1.md
53
- - doc/release_notes/0_14_2.md
54
- - doc/release_notes/0_14_3.md
55
- - doc/release_notes/0_14_4.md
56
- - doc/release_notes/0_14_5.md
57
- - doc/release_notes/0_15_0.md
58
- - doc/release_notes/0_15_1.md
59
- - doc/release_notes/0_15_2.md
60
- - doc/release_notes/0_15_3.md
61
- - doc/release_notes/0_15_4.md
62
- - doc/release_notes/0_16_0.md
63
- - doc/release_notes/0_16_1.md
64
- - doc/release_notes/0_17_0.md
65
- - doc/release_notes/0_18_0.md
66
- - doc/release_notes/0_1_0.md
67
- - doc/release_notes/0_2_0.md
68
- - doc/release_notes/0_2_1.md
69
- - doc/release_notes/0_3_0.md
70
- - doc/release_notes/0_3_1.md
71
- - doc/release_notes/0_4_0.md
72
68
  - doc/release_notes/0_4_1.md
73
- - doc/release_notes/0_5_0.md
74
69
  - doc/release_notes/0_5_1.md
75
- - doc/release_notes/0_6_0.md
76
- - doc/release_notes/0_6_1.md
77
- - doc/release_notes/0_6_2.md
78
- - doc/release_notes/0_6_3.md
79
- - doc/release_notes/0_6_4.md
80
- - doc/release_notes/0_6_5.md
81
70
  - doc/release_notes/0_6_6.md
82
- - doc/release_notes/0_6_7.md
83
- - doc/release_notes/0_7_0.md
71
+ - doc/release_notes/0_4_0.md
72
+ - doc/release_notes/0_6_2.md
73
+ - doc/release_notes/0_10_0.md
74
+ - doc/release_notes/0_11_1.md
84
75
  - doc/release_notes/0_8_0.md
85
- - doc/release_notes/0_8_1.md
86
- - doc/release_notes/0_8_2.md
87
- - doc/release_notes/0_9_0.md
76
+ - doc/release_notes/0_3_0.md
77
+ - doc/release_notes/0_15_2.md
78
+ - doc/release_notes/0_14_3.md
79
+ - doc/release_notes/0_2_1.md
80
+ - doc/release_notes/0_0_3.md
81
+ - doc/release_notes/0_16_1.md
82
+ - doc/release_notes/0_17_0.md
83
+ - doc/release_notes/0_0_2.md
84
+ - doc/release_notes/0_16_0.md
85
+ - doc/release_notes/0_3_1.md
86
+ - doc/release_notes/0_15_3.md
87
+ - doc/release_notes/0_14_2.md
88
+ - doc/release_notes/0_2_0.md
88
89
  files:
89
90
  - LICENSE.txt
90
91
  - README.md
@@ -119,6 +120,7 @@ files:
119
120
  - doc/release_notes/0_16_1.md
120
121
  - doc/release_notes/0_17_0.md
121
122
  - doc/release_notes/0_18_0.md
123
+ - doc/release_notes/0_18_1.md
122
124
  - doc/release_notes/0_1_0.md
123
125
  - doc/release_notes/0_2_0.md
124
126
  - doc/release_notes/0_2_1.md
@@ -300,7 +302,8 @@ metadata:
300
302
  documentation_uri: https://honeyryderchuck.gitlab.io/httpx/rdoc/
301
303
  source_code_uri: https://gitlab.com/honeyryderchuck/httpx
302
304
  homepage_uri: https://honeyryderchuck.gitlab.io/httpx/
303
- post_install_message:
305
+ rubygems_mfa_required: 'true'
306
+ post_install_message:
304
307
  rdoc_options: []
305
308
  require_paths:
306
309
  - lib
@@ -315,8 +318,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
315
318
  - !ruby/object:Gem::Version
316
319
  version: '0'
317
320
  requirements: []
318
- rubygems_version: 3.2.22
319
- signing_key:
321
+ rubygems_version: 3.1.6
322
+ signing_key:
320
323
  specification_version: 4
321
324
  summary: HTTPX, to the future, and beyond
322
325
  test_files: []