httpx 1.1.0 → 1.1.2

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: 7ef9f0a027f7a313547ca11bce6cf2c5a3eb72075b2cee0be13448d4aa7ec2b6
4
- data.tar.gz: 0021a6c5e4968dd68cb23a157c5ce0dd84021bf134eb6c8227c5b145772e5812
3
+ metadata.gz: 118700ac0c350952382970ddb1ed33d74d954e1ddd6c2f82bb032cc24a3a5d22
4
+ data.tar.gz: 160644aeefb2ed61a8bda67b7896bbd2a4a4211cf9283ebe4e9a244ac237e780
5
5
  SHA512:
6
- metadata.gz: 14687b4930aff7fef833058a27d5b26e4a9c327fcbf779f88d3b2b7766a861a26845285054ccde501a5a8296fdfc3c87a5f7e56eafc58fabeecd383512d36e8c
7
- data.tar.gz: 95ee1b01958d2c680e194baa2f3136464c775038e9cd87d7d712d88998f48bbd385d6f3cc1173d2bda023102c4ca4661221aabd03d0d8a0a62e3006a79694851
6
+ metadata.gz: 97d15923bd32a0378bcf54a147b37b308eda78a74f67f339467dd3130cffd0aab7dace5bb368dbf9f5a203f6bc73ea37db394e153107daaf3c81b389f269d849
7
+ data.tar.gz: 16e71f8eb94de6314a77b96620be5db341afa81f2fb026780bd467fa0aaa9aa3d395d3afca5f59ebbd3aae507b33c88d22a4c864e40bfa4b23031162a365bcb8
@@ -0,0 +1,17 @@
1
+ # 1.1.1
2
+
3
+ ## improvements
4
+
5
+ * (Re-)enabling default retries in DNS name queries; this had been disabled as a result of revamping timouts, and resulted in queries only being sent once, which is very little for UDP-related traffic, and breaks if using DNs rate-limiting software. Retries the query just once, for now.
6
+
7
+ ## bugfixes
8
+
9
+ * reset timers when adding new intervals, as these may be added as a result on after-select connection handling, and must wait for the next tick cycle (before the patch, they were triggering too soon).
10
+ * fixed "on close" callback leak on connection reuse, which caused linear performance regression in benchmarks performing one request per connection.
11
+ * fixed hanging connection whan an HTTP/1.1 emitted a "connection: close" header but the server would not emit one (it closes the connection now).
12
+ * fixed recursive dns cached lookups which may have already expired, and created nil entries in the returned address list.
13
+ * dns system resolver is now able to retry on failure.
14
+
15
+ ## chore
16
+
17
+ * remove duplicated callback unregitering connections.
@@ -0,0 +1,12 @@
1
+ # 1.1.2
2
+
3
+ ## improvements
4
+
5
+ * only moving eden connections to idle when they're recycled.
6
+
7
+ ## bugfixes
8
+
9
+ * skip closing a connection which is already closed during reset.
10
+ * sentry adapter: fixed `super` call which didn't have a super method (this prevented usinng sentry-enabled sessions with the `:retries` plugin).
11
+ * sentry adapter: fixing registering of sentry config.
12
+ * sentry adapter: do not propagate traces when relevant sdk options are disabled (such as `propagate_traces`).
@@ -27,6 +27,11 @@ module HTTPX::Plugins
27
27
  def set_sentry_trace_header(request, sentry_span)
28
28
  return unless sentry_span
29
29
 
30
+ config = ::Sentry.configuration
31
+ url = request.uri.to_s
32
+
33
+ return unless config.propagate_traces && config.trace_propagation_targets.any? { |target| url.match?(target) }
34
+
30
35
  trace = ::Sentry.get_current_client.generate_sentry_trace(sentry_span)
31
36
  request.headers[::Sentry::SENTRY_TRACE_HEADER_NAME] = trace if trace
32
37
  end
@@ -91,7 +96,7 @@ module HTTPX::Plugins
91
96
 
92
97
  module RequestMethods
93
98
  def __sentry_enable_trace!
94
- return super if @__sentry_enable_trace
99
+ return if @__sentry_enable_trace
95
100
 
96
101
  Tracer.call(self)
97
102
  @__sentry_enable_trace = true
@@ -108,7 +113,7 @@ module HTTPX::Plugins
108
113
  end
109
114
  end
110
115
 
111
- Sentry.register_patch do
116
+ Sentry.register_patch(:httpx) do
112
117
  sentry_session = HTTPX.plugin(HTTPX::Plugins::Sentry)
113
118
 
114
119
  HTTPX.send(:remove_const, :Session)
@@ -181,7 +181,7 @@ module HTTPX
181
181
  if response.is_a?(ErrorResponse)
182
182
  disable
183
183
  else
184
- manage_connection(response)
184
+ manage_connection(request, response)
185
185
  end
186
186
 
187
187
  if exhausted?
@@ -224,7 +224,7 @@ module HTTPX
224
224
 
225
225
  private
226
226
 
227
- def manage_connection(response)
227
+ def manage_connection(request, response)
228
228
  connection = response.headers["connection"]
229
229
  case connection
230
230
  when /keep-alive/i
@@ -254,7 +254,7 @@ module HTTPX
254
254
  disable
255
255
  when nil
256
256
  # In HTTP/1.1, it's keep alive by default
257
- return if response.version == "1.1"
257
+ return if response.version == "1.1" && request.headers["connection"] != "close"
258
258
 
259
259
  disable
260
260
  end
@@ -90,7 +90,7 @@ module HTTPX
90
90
  end
91
91
 
92
92
  def match?(uri, options)
93
- return false if @state == :closing || @state == :closed
93
+ return false if !used? && (@state == :closing || @state == :closed)
94
94
 
95
95
  return false if exhausted?
96
96
 
@@ -273,7 +273,7 @@ module HTTPX
273
273
  end
274
274
 
275
275
  def timeout
276
- return @timeout if defined?(@timeout)
276
+ return @timeout if @timeout
277
277
 
278
278
  return @options.timeout[:connect_timeout] if @state == :idle
279
279
 
@@ -503,10 +503,12 @@ module HTTPX
503
503
  @origins |= [origin]
504
504
  end
505
505
  parser.on(:close) do |force|
506
- transition(:closing)
507
- if force || @state == :idle
508
- transition(:closed)
509
- emit(:close)
506
+ if @state != :closed
507
+ transition(:closing)
508
+ if force || @state == :idle
509
+ transition(:closed)
510
+ emit(:close)
511
+ end
510
512
  end
511
513
  end
512
514
  parser.on(:close_handshake) do
@@ -518,7 +520,6 @@ module HTTPX
518
520
  else
519
521
  transition(:closing)
520
522
  transition(:closed)
521
- emit(:reset)
522
523
 
523
524
  @parser.reset if @parser
524
525
  transition(:idle)
@@ -617,7 +618,7 @@ module HTTPX
617
618
  def purge_after_closed
618
619
  @io.close if @io
619
620
  @read_buffer.clear
620
- remove_instance_variable(:@timeout) if defined?(@timeout)
621
+ @timeout = nil
621
622
  end
622
623
 
623
624
  def build_socket(addrs = nil)
@@ -76,7 +76,6 @@ module HTTPX
76
76
  else
77
77
  transition(:closing)
78
78
  transition(:closed)
79
- emit(:reset)
80
79
 
81
80
  parser.reset if @parser
82
81
  transition(:idle)
data/lib/httpx/pool.rb CHANGED
@@ -110,6 +110,7 @@ module HTTPX
110
110
  end
111
111
 
112
112
  if conn
113
+ conn.idling
113
114
  @connections << conn
114
115
  select_connection(conn)
115
116
  end
@@ -223,17 +224,11 @@ module HTTPX
223
224
  @connected_connections += 1
224
225
  end
225
226
  select_connection(connection)
226
- connection.on(:close) do
227
- unregister_connection(connection)
228
- end
229
227
  end
230
228
 
231
229
  def unregister_connection(connection)
232
230
  @connections.delete(connection)
233
- if connection.used? && !@eden_connections.include?(connection)
234
- @eden_connections << connection
235
- connection.idling
236
- end
231
+ @eden_connections << connection if connection.used? && !@eden_connections.include?(connection)
237
232
  @connected_connections -= 1 if deselect_connection(connection)
238
233
  end
239
234
 
@@ -62,8 +62,11 @@ module HTTPX
62
62
  addresses.first.to_s != connection.origin.host.to_s
63
63
  log { "resolver: A response, applying resolution delay..." }
64
64
  @pool.after(0.05) do
65
- # double emission check
66
- emit_resolved_connection(connection, addresses) unless connection.addresses && addresses.intersect?(connection.addresses)
65
+ unless connection.state == :closed ||
66
+ # double emission check
67
+ (connection.addresses && addresses.intersect?(connection.addresses))
68
+ emit_resolved_connection(connection, addresses)
69
+ end
67
70
  end
68
71
  else
69
72
  emit_resolved_connection(connection, addresses)
@@ -164,7 +164,8 @@ module HTTPX
164
164
  def async_resolve(connection, hostname, scheme)
165
165
  families = connection.options.ip_families
166
166
  log { "resolver: query for #{hostname}" }
167
- resolve_timeout = @timeouts[connection.origin.host].first
167
+ timeouts = @timeouts[connection.origin.host]
168
+ resolve_timeout = timeouts.first
168
169
 
169
170
  Thread.start do
170
171
  Thread.current.report_on_exception = false
@@ -191,6 +192,8 @@ module HTTPX
191
192
  end
192
193
  rescue StandardError => e
193
194
  if e.is_a?(Timeout::Error)
195
+ timeouts.shift
196
+ retry unless timeouts.empty?
194
197
  e = ResolveTimeoutError.new(resolve_timeout, e.message)
195
198
  e.set_backtrace(e.backtrace)
196
199
  end
@@ -5,7 +5,7 @@ require "ipaddr"
5
5
 
6
6
  module HTTPX
7
7
  module Resolver
8
- RESOLVE_TIMEOUT = 5
8
+ RESOLVE_TIMEOUT = [2, 3].freeze
9
9
 
10
10
  require "httpx/resolver/resolver"
11
11
  require "httpx/resolver/system"
@@ -87,16 +87,18 @@ module HTTPX
87
87
  def lookup(hostname, ttl)
88
88
  return unless @lookups.key?(hostname)
89
89
 
90
- @lookups[hostname] = @lookups[hostname].select do |address|
90
+ entries = @lookups[hostname] = @lookups[hostname].select do |address|
91
91
  address["TTL"] > ttl
92
92
  end
93
- ips = @lookups[hostname].flat_map do |address|
93
+
94
+ ips = entries.flat_map do |address|
94
95
  if address.key?("alias")
95
96
  lookup(address["alias"], ttl)
96
97
  else
97
98
  IPAddr.new(address["data"])
98
99
  end
99
- end
100
+ end.compact
101
+
100
102
  ips unless ips.empty?
101
103
  end
102
104
 
data/lib/httpx/session.rb CHANGED
@@ -260,7 +260,9 @@ module HTTPX
260
260
  connection.on(:open) do
261
261
  emit(:connection_opened, connection.origin, connection.io.socket)
262
262
  # only run close callback if it opened
263
- connection.on(:close) { emit(:connection_closed, connection.origin, connection.io.socket) }
263
+ end
264
+ connection.on(:close) do
265
+ emit(:connection_closed, connection.origin, connection.io.socket) if connection.used?
264
266
  end
265
267
  catch(:coalesced) do
266
268
  pool.init_connection(connection, options)
data/lib/httpx/timers.rb CHANGED
@@ -24,6 +24,8 @@ module HTTPX
24
24
 
25
25
  interval << callback
26
26
 
27
+ @next_interval_at = nil
28
+
27
29
  interval
28
30
  end
29
31
 
data/lib/httpx/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module HTTPX
4
- VERSION = "1.1.0"
4
+ VERSION = "1.1.2"
5
5
  end
@@ -59,13 +59,13 @@ module HTTPX
59
59
 
60
60
  def initialize: (Buffer, options) -> untyped
61
61
 
62
- def manage_connection: (Response) -> void
62
+ def manage_connection: (Request request, Response response) -> void
63
63
 
64
64
  def disable: () -> void
65
65
 
66
66
  def disable_pipelining: () -> void
67
67
 
68
- def set_protocol_headers: (Request) -> _Each[[String, String]]
68
+ def set_protocol_headers: (Request request) -> _Each[[String, String]]
69
69
 
70
70
  def handle: (Request request) -> void
71
71
 
data/sig/resolver.rbs CHANGED
@@ -2,7 +2,7 @@ module HTTPX
2
2
  type ipaddr = IPAddr | String
3
3
 
4
4
  module Resolver
5
- RESOLVE_TIMEOUT: Integer
5
+ RESOLVE_TIMEOUT: Array[Integer]
6
6
 
7
7
  @lookup_mutex: Thread::Mutex
8
8
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: httpx
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tiago Cardoso
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-10-30 00:00:00.000000000 Z
11
+ date: 2023-11-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: http-2-next
@@ -132,6 +132,8 @@ extra_rdoc_files:
132
132
  - doc/release_notes/1_0_1.md
133
133
  - doc/release_notes/1_0_2.md
134
134
  - doc/release_notes/1_1_0.md
135
+ - doc/release_notes/1_1_1.md
136
+ - doc/release_notes/1_1_2.md
135
137
  files:
136
138
  - LICENSE.txt
137
139
  - README.md
@@ -235,6 +237,8 @@ files:
235
237
  - doc/release_notes/1_0_1.md
236
238
  - doc/release_notes/1_0_2.md
237
239
  - doc/release_notes/1_1_0.md
240
+ - doc/release_notes/1_1_1.md
241
+ - doc/release_notes/1_1_2.md
238
242
  - lib/httpx.rb
239
243
  - lib/httpx/adapters/datadog.rb
240
244
  - lib/httpx/adapters/faraday.rb