From: ben@... Date: 2020-07-31T18:46:27+00:00 Subject: [ruby-core:99423] [Ruby master Bug#15773] Net::HTTP doesn't try next IP address in case of timeout Issue #15773 has been updated by benlangfeld (Ben Langfeld). naruse (Yui NARUSE) wrote in #note-1: > In general resolving DNS is done by libc (getaddrinfo) and Ruby just uses their result. > Therefore it is not a bug and won't be a small feature. RFC3484 (https://www.ietf.org/rfc/rfc3484.txt) very clearly states: ``` Well-behaved applications SHOULD iterate through the list of addresses returned from getaddrinfo() until they find a working address. ``` That Ruby does not do this should be considered a bug, and I would ask that you please re-open this ticket on that basis. Ruby is in contravention of the RFC and the documentation of `getaddrinfo(3)`. This is not a missing feature; Ruby is broken. Note that I am not asking that anyone fix this; I will prepare a fix. All I ask is that this ticket be acknowledged as valid and not rejected based on misunderstanding it. ---------------------------------------- Bug #15773: Net::HTTP doesn't try next IP address in case of timeout https://bugs.ruby-lang.org/issues/15773#change-86876 * Author: nicolasnoble (Nicolas Noble) * Status: Rejected * Priority: Normal * Backport: 2.4: UNKNOWN, 2.5: UNKNOWN, 2.6: UNKNOWN ---------------------------------------- This example requires to have a working IPv6 address. Since IPv6 is used in first priority, I am using it to demonstrate the problem, but it exists with plain IPv4, which will be more round-robin-style, so less deterministic to show a reproduction case. I have made two URLs that have both IPv4 and IPv6 addresses: http://ipv6.grumpycoder.net/ and http://bad-ipv6.grumpycoder.net/ - both URLs should work in an IPv6-enabled web browser, as well as curl or wget for instance. The difference is that the bad-ipv6 subdomain doesn't have an IPv6 that will actually connect. Therefore, browsers, curl and wget will fallback to using the IPv4 when the initial IPv6 connection attempt failed: ``` $ wget -T1 http://bad-ipv6.grumpycoder.net -O - # demonstrating using wget because its output is more clear than curl's verbose --2019-04-16 15:56:52-- http://bad-ipv6.grumpycoder.net/ Resolving bad-ipv6.grumpycoder.net (bad-ipv6.grumpycoder.net)... 2001:bc8:3690:200::2, 62.210.214.144 Connecting to bad-ipv6.grumpycoder.net (bad-ipv6.grumpycoder.net)|2001:bc8:3690:200::2|:80... failed: Connection timed out. Connecting to bad-ipv6.grumpycoder.net (bad-ipv6.grumpycoder.net)|62.210.214.144|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 45 [text/html] Saving to: ���STDOUT��� - 0%[ ] 0 --.-KB/s