mirror of
https://github.com/HoneyryderChuck/httpx.git
synced 2025-07-19 00:00:47 -04:00
Compare commits
No commits in common. "7ed7eec2dc9f40945651fa3ac06452e44d271aaf" and "325f7141c846f95b2d4ee773d5a91cdf76b10abf" have entirely different histories.
7ed7eec2dc
...
325f7141c8
2
Gemfile
2
Gemfile
@ -17,7 +17,7 @@ group :test do
|
|||||||
gem "minitest-proveit"
|
gem "minitest-proveit"
|
||||||
gem "ruby-ntlm"
|
gem "ruby-ntlm"
|
||||||
gem "sentry-ruby" if RUBY_VERSION >= "2.4.0"
|
gem "sentry-ruby" if RUBY_VERSION >= "2.4.0"
|
||||||
gem "spy", "< 1.0.4" # TODO: remove this once upstream fixes bug
|
gem "spy"
|
||||||
if RUBY_VERSION < "2.3.0"
|
if RUBY_VERSION < "2.3.0"
|
||||||
gem "webmock", "< 3.15.0"
|
gem "webmock", "< 3.15.0"
|
||||||
else
|
else
|
||||||
|
@ -1,13 +0,0 @@
|
|||||||
# 0.22.0
|
|
||||||
|
|
||||||
## Improvements
|
|
||||||
|
|
||||||
### Happy Eyeballs v2 finalized
|
|
||||||
|
|
||||||
Until now, httpx was issuing concurrent DNS requests, but it'd only start connecting to the first, and then on the following by the right order, but sequentially.
|
|
||||||
|
|
||||||
`httpx` will now establish connections concurrently to both IPv6 and IPv4 addresses of a given domain; the first one to succeed terminates the other. Successful connection means completion of both TCP and TLS (when applicable) handshakes.
|
|
||||||
|
|
||||||
### HTTPX::Response::Body#encoding
|
|
||||||
|
|
||||||
A new method, `#encoding`, can be called on response bodies. It'll return the encoding of the response payload.
|
|
@ -76,13 +76,6 @@ module HTTPX
|
|||||||
self.addresses = @options.addresses if @options.addresses
|
self.addresses = @options.addresses if @options.addresses
|
||||||
end
|
end
|
||||||
|
|
||||||
def clone_new_connection
|
|
||||||
new_conn = self.class.new(@type, @origin, @options)
|
|
||||||
once(:open, &new_conn.method(:reset))
|
|
||||||
new_conn.once(:open, &method(:close))
|
|
||||||
new_conn
|
|
||||||
end
|
|
||||||
|
|
||||||
# this is a semi-private method, to be used by the resolver
|
# this is a semi-private method, to be used by the resolver
|
||||||
# to initiate the io object.
|
# to initiate the io object.
|
||||||
def addresses=(addrs)
|
def addresses=(addrs)
|
||||||
|
@ -129,7 +129,6 @@ module HTTPX
|
|||||||
end
|
end
|
||||||
|
|
||||||
def on_resolver_connection(connection)
|
def on_resolver_connection(connection)
|
||||||
@connections << connection unless @connections.include?(connection)
|
|
||||||
found_connection = @connections.find do |ch|
|
found_connection = @connections.find do |ch|
|
||||||
ch != connection && ch.mergeable?(connection)
|
ch != connection && ch.mergeable?(connection)
|
||||||
end
|
end
|
||||||
|
@ -69,8 +69,7 @@ module HTTPX
|
|||||||
@building_connection = true
|
@building_connection = true
|
||||||
connection = @options.connection_class.new("ssl", @uri, @options.merge(ssl: { alpn_protocols: %w[h2] }))
|
connection = @options.connection_class.new("ssl", @uri, @options.merge(ssl: { alpn_protocols: %w[h2] }))
|
||||||
@pool.init_connection(connection, @options)
|
@pool.init_connection(connection, @options)
|
||||||
# only explicity emit addresses if connection didn't pre-resolve, i.e. it's not an IP.
|
emit_addresses(connection, @family, @uri_addresses)
|
||||||
emit_addresses(connection, @family, @uri_addresses) unless connection.addresses
|
|
||||||
@building_connection = false
|
@building_connection = false
|
||||||
connection
|
connection
|
||||||
end
|
end
|
||||||
|
@ -63,26 +63,20 @@ module HTTPX
|
|||||||
log { "resolver: A response, applying resolution delay..." }
|
log { "resolver: A response, applying resolution delay..." }
|
||||||
@pool.after(0.05) do
|
@pool.after(0.05) do
|
||||||
# double emission check
|
# double emission check
|
||||||
emit_resolved_connection(connection, addresses) unless connection.addresses && addresses.intersect?(connection.addresses)
|
unless connection.addresses && addresses.intersect?(connection.addresses)
|
||||||
|
|
||||||
|
connection.addresses = addresses
|
||||||
|
emit(:resolve, connection)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
emit_resolved_connection(connection, addresses)
|
connection.addresses = addresses
|
||||||
|
emit(:resolve, connection)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def emit_resolved_connection(connection, addresses)
|
|
||||||
if connection.io && connection.connecting? && @pool
|
|
||||||
new_connection = connection.clone_new_connection
|
|
||||||
@pool.init_connection(new_connection, connection.options)
|
|
||||||
connection = new_connection
|
|
||||||
end
|
|
||||||
connection.addresses = addresses
|
|
||||||
|
|
||||||
emit(:resolve, connection)
|
|
||||||
end
|
|
||||||
|
|
||||||
def early_resolve(connection, hostname: connection.origin.host)
|
def early_resolve(connection, hostname: connection.origin.host)
|
||||||
addresses = @resolver_options[:cache] && (connection.addresses || HTTPX::Resolver.nolookup_resolve(hostname))
|
addresses = @resolver_options[:cache] && (connection.addresses || HTTPX::Resolver.nolookup_resolve(hostname))
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
module HTTPX
|
module HTTPX
|
||||||
VERSION = "0.22.0"
|
VERSION = "0.21.1"
|
||||||
end
|
end
|
||||||
|
@ -36,8 +36,6 @@ module HTTPX
|
|||||||
@keep_alive_timeout: Numeric?
|
@keep_alive_timeout: Numeric?
|
||||||
@total_timeout: Numeric?
|
@total_timeout: Numeric?
|
||||||
|
|
||||||
def clone_new_connection: () -> instance
|
|
||||||
|
|
||||||
def addresses: () -> Array[ipaddr]?
|
def addresses: () -> Array[ipaddr]?
|
||||||
|
|
||||||
def addresses=: (Array[ipaddr]) -> void
|
def addresses=: (Array[ipaddr]) -> void
|
||||||
|
Loading…
x
Reference in New Issue
Block a user