From: ben@... Date: 2020-08-03T16:23:24+00:00 Subject: [ruby-core:99456] [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). phluid61 (Matthew Kerwin) wrote in #note-5: > benlangfeld (Ben Langfeld) wrote in #note-4: > > > > RFC3484 (https://www.ietf.org/rfc/rfc3484.txt) very clearly states: > > > > Minor point, I don't think it affects much, but RFC 3484 is obsolete and is replaced by RFC 6724 https://tools.ietf.org/html/rfc6724 > > Cheers Thank you for pointing that out. RFC 6724 is even more explicit: ``` Well-behaved applications SHOULD NOT simply use the first address returned from an API such as getaddrinfo() and then give up if it fails. For many applications, it is appropriate to iterate through the list of addresses returned from getaddrinfo() until a working address is found. For other applications, it might be appropriate to try multiple addresses in parallel (e.g., with some small delay in between) and use the first one to succeed. ``` ---------------------------------------- Bug #15773: Net::HTTP doesn't try next IP address in case of timeout https://bugs.ruby-lang.org/issues/15773#change-86913 * 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