mirror of
https://github.com/HoneyryderChuck/httpx.git
synced 2025-07-14 00:00:49 -04:00
Compare commits
4 Commits
b1c59c45eb
...
5448037912
Author | SHA1 | Date | |
---|---|---|---|
|
5448037912 | ||
|
70511846cc | ||
|
3729fc7de4 | ||
|
eb34c823f7 |
@ -160,7 +160,6 @@ module HTTPX
|
|||||||
module URIExtensions
|
module URIExtensions
|
||||||
# uri 0.11 backport, ships with ruby 3.1
|
# uri 0.11 backport, ships with ruby 3.1
|
||||||
refine URI::Generic do
|
refine URI::Generic do
|
||||||
public :set_host
|
|
||||||
|
|
||||||
def non_ascii_hostname
|
def non_ascii_hostname
|
||||||
@non_ascii_hostname
|
@non_ascii_hostname
|
||||||
|
@ -6,11 +6,10 @@ module HTTPX
|
|||||||
class UDP
|
class UDP
|
||||||
include Loggable
|
include Loggable
|
||||||
|
|
||||||
def initialize(uri, _, options)
|
def initialize(ip, port, options)
|
||||||
ip = IPAddr.new(uri.host)
|
@host = ip
|
||||||
@host = ip.to_s
|
@port = port
|
||||||
@port = uri.port
|
@io = UDPSocket.new(IPAddr.new(ip).family)
|
||||||
@io = UDPSocket.new(ip.family)
|
|
||||||
@options = options
|
@options = options
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -132,9 +132,7 @@ module HTTPX
|
|||||||
def try_clone_connection(connection, family)
|
def try_clone_connection(connection, family)
|
||||||
connection.family ||= family
|
connection.family ||= family
|
||||||
|
|
||||||
if connection.family == family
|
return connection if connection.family == family
|
||||||
return connection
|
|
||||||
end
|
|
||||||
|
|
||||||
new_connection = connection.class.new(connection.type, connection.origin, connection.options)
|
new_connection = connection.class.new(connection.type, connection.origin, connection.options)
|
||||||
new_connection.family = family
|
new_connection.family = family
|
||||||
|
@ -21,21 +21,7 @@ module HTTPX
|
|||||||
packet_size: 512,
|
packet_size: 512,
|
||||||
timeouts: Resolver::RESOLVE_TIMEOUT,
|
timeouts: Resolver::RESOLVE_TIMEOUT,
|
||||||
}
|
}
|
||||||
end
|
end.freeze
|
||||||
|
|
||||||
# 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
|
|
||||||
|
|
||||||
DNS_PORT = 53
|
DNS_PORT = 53
|
||||||
|
|
||||||
@ -318,13 +304,8 @@ module HTTPX
|
|||||||
|
|
||||||
ip, port = @nameserver[@ns_index]
|
ip, port = @nameserver[@ns_index]
|
||||||
port ||= DNS_PORT
|
port ||= DNS_PORT
|
||||||
uri = URI::Generic.build(scheme: "udp", port: port)
|
log { "resolver: server: #{ip}:#{port}..." }
|
||||||
# uri.hostname = ip
|
@io = UDP.new(ip, port, @options)
|
||||||
# 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)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def transition(nextstate)
|
def transition(nextstate)
|
||||||
|
48
regression_tests/bug_0_22_2_test.rb
Normal file
48
regression_tests/bug_0_22_2_test.rb
Normal 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
|
@ -94,7 +94,7 @@ if [[ "$RUBY_ENGINE" = "ruby" ]]; then
|
|||||||
COVERAGE_KEY="$RUBY_ENGINE-$RUBY_VERSION-integration-tests" bundle exec rake integration_tests
|
COVERAGE_KEY="$RUBY_ENGINE-$RUBY_VERSION-integration-tests" bundle exec rake integration_tests
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ ${RUBY_VERSION:0:1} = "3" ]] && [[ "$RUBY_ENGINE" = "ruby" ]]; then
|
if [[ ${RUBY_VERSION:0:3} = "3.2" ]] && [[ "$RUBY_ENGINE" = "ruby" ]]; then
|
||||||
# regression tests
|
# regression tests
|
||||||
# Testing them only with main ruby
|
# Testing them only with main ruby
|
||||||
COVERAGE_KEY="$RUBY_ENGINE-$RUBY_VERSION-regression-tests" bundle exec rake regression_tests
|
COVERAGE_KEY="$RUBY_ENGINE-$RUBY_VERSION-regression-tests" bundle exec rake regression_tests
|
||||||
|
Loading…
x
Reference in New Issue
Block a user