Compare commits

..

4 Commits

Author SHA1 Message Date
HoneyryderChuck
5448037912 Merge branch 'improvs' into 'master'
do not patch URI use for zone-identifier ipv6, instead do not use it

See merge request os85/httpx!237
2023-01-22 22:05:37 +00:00
HoneyryderChuck
70511846cc only run regression tests in ruby 3.2 2023-01-22 01:16:05 +00:00
HoneyryderChuck
3729fc7de4 added test for the Happy Eyeballs v2 fix 2023-01-22 01:15:26 +00:00
HoneyryderChuck
eb34c823f7 do not patch URI use for zone-identifier ipv6, instead do not use it
It was clarified in
https://github.com/ruby/ipaddr/issues/52#issuecomment-1399289675 that
there is no bug in `uri`, but rather that ipv6 addresses with
zone-identifier aren't supposed to be used in uris.
2023-01-22 00:35:33 +00:00
6 changed files with 57 additions and 32 deletions

View File

@ -160,7 +160,6 @@ module HTTPX
module URIExtensions
# uri 0.11 backport, ships with ruby 3.1
refine URI::Generic do
public :set_host
def non_ascii_hostname
@non_ascii_hostname

View File

@ -6,11 +6,10 @@ module HTTPX
class UDP
include Loggable
def initialize(uri, _, options)
ip = IPAddr.new(uri.host)
@host = ip.to_s
@port = uri.port
@io = UDPSocket.new(ip.family)
def initialize(ip, port, options)
@host = ip
@port = port
@io = UDPSocket.new(IPAddr.new(ip).family)
@options = options
end

View File

@ -132,9 +132,7 @@ module HTTPX
def try_clone_connection(connection, family)
connection.family ||= family
if connection.family == family
return connection
end
return connection if connection.family == family
new_connection = connection.class.new(connection.type, connection.origin, connection.options)
new_connection.family = family

View File

@ -21,21 +21,7 @@ module HTTPX
packet_size: 512,
timeouts: Resolver::RESOLVE_TIMEOUT,
}
end
# nameservers for ipv6 are misconfigured in certain systems;
# this can use an unexpected endless loop
# https://gitlab.com/honeyryderchuck/httpx/issues/56
DEFAULTS[:nameserver].select! do |nameserver|
begin
IPAddr.new(nameserver)
true
rescue IPAddr::InvalidAddressError
false
end
end if DEFAULTS[:nameserver]
DEFAULTS.freeze
end.freeze
DNS_PORT = 53
@ -318,13 +304,8 @@ module HTTPX
ip, port = @nameserver[@ns_index]
port ||= DNS_PORT
uri = URI::Generic.build(scheme: "udp", port: port)
# uri.hostname = ip
# link-local IPv6 address may have a zone identifier, but URI does not support that yet.
uri.set_host(ip)
type = IO.registry(uri.scheme)
log { "resolver: server: #{uri}..." }
@io = type.new(uri, [IPAddr.new(ip)], @options)
log { "resolver: server: #{ip}:#{port}..." }
@io = UDP.new(ip, port, @options)
end
def transition(nextstate)

View File

@ -0,0 +1,48 @@
# frozen_string_literal: true
require "test_helper"
require "support/http_helpers"
require "support/minitest_extensions"
class Bug_0_22_2_Test < Minitest::Test
include HTTPHelpers
Plugin = Module.new do
@connections = []
def self.connections
@connections
end
self::ConnectionMethods = Module.new do
def initialize(*)
super
on(:tcp_open) { Plugin.connections << self }
end
end
end
def test_happy_eyeballs_v2_use_correct_family
connections = []
HTTPX.plugin(Plugin).wrap do |http|
response_ipv4 = http.get("http://#{ipv4_host}")
response_ipv6 = http.get("http://#{ipv6_host}")
end
assert Plugin.connections.size == 2
connection_ipv4 = Plugin.connections.find { |conn| conn.origin.to_s == "http://#{ipv4_host}" }
connection_ipv6 = Plugin.connections.find { |conn| conn.origin.to_s == "http://#{ipv6_host}" }
assert connection_ipv4.family == Socket::AF_INET
assert connection_ipv6.family == Socket::AF_INET6
end
private
def ipv4_host
"badipv6.test.ipv6friday.org"
end
def ipv6_host
"badipv4.test.ipv6friday.org"
end
end

View File

@ -94,7 +94,7 @@ if [[ "$RUBY_ENGINE" = "ruby" ]]; then
COVERAGE_KEY="$RUBY_ENGINE-$RUBY_VERSION-integration-tests" bundle exec rake integration_tests
fi
if [[ ${RUBY_VERSION:0:1} = "3" ]] && [[ "$RUBY_ENGINE" = "ruby" ]]; then
if [[ ${RUBY_VERSION:0:3} = "3.2" ]] && [[ "$RUBY_ENGINE" = "ruby" ]]; then
# regression tests
# Testing them only with main ruby
COVERAGE_KEY="$RUBY_ENGINE-$RUBY_VERSION-regression-tests" bundle exec rake regression_tests