我有一个现有的测试框架,它使用 Ruby 的 HTTPI 库进行 HTTP 调用,并且我正在尝试添加 IPv6(双栈)支持的测试。 代码看起来像这样:
def http_get(request_url, request_headers)
request = HTTPI::Request.new(request_url)
request.headers = request_headers
# TODO: how to I configure this to force IPv6?
return HTTPI.get(request)
end
如果
request_url
同时支持 IPv4 和 IPv6,是否有某种方法可以强制 HTTPI 使用 IPv6 来处理请求,以便我可以验证我们的 IPv6 端点设置是否正常工作?
最终,任何此类测试都将通过将主机名解析为单独的 IPv4 和 IPv6 地址并尝试向它们发出请求来进行。 HTTPI 似乎没有内置此功能。
幸运的是,使用
Addrinfo
自己动手很容易。以下是如何将 www.google.com
解析为 IPv6 地址的示例。
require 'socket'
addrinfos = Addrinfo.getaddrinfo("www.google.com", 80, nil, :STREAM)
ipv4_address = addrinfos.select(&:ipv4?).first&.ip_address
ipv6_address = addrinfos.select(&:ipv6?).first&.ip_address
# => "2607:f8b0:4006:81e::2004"
如果
ipv6_address
不是 nil
(对于 www.google.com
则不是),您可以通过用 request_url
替换主机名(需要方括号)来重建您的 "[#{ipv6_address}]"
(方括号是必需的)并将其传递给您的http_get
方法。