我正在尝试使用Ruby std完成一些RESTful的东西。图书馆,'uri'和'net / https'。我想通过明确指定的传出接口来访问链接本地IPv6地址,例如fe80::cba7:32b1:741d:5c41%ens192
。
当我试图创建一个新的URI实例时 - 我仍然收到相同的错误(对于下面两个例子):
URI("https://[fe80::cba7:32b1:741d:5c41%ens192]/")
URI("https://[fe80::cba7:32b1:741d:5c41%25ens192]/")
返回
URI::InvalidURIError: bad URI(is not URI?)
请您知道如何处理这些IPv6链路本地地址吗? 仅供参考,我试图做一个简单的HTTP请求,它的工作原理。所以一般来说,Ruby对IPv6没有任何问题:)
require 'net/https'
request = Net::HTTP.new('fe80::cba7:32b1:741d:5c41%ens192', 443)
request.use_ssl = true
request.verify_mode = OpenSSL::SSL::VERIFY_NONE
request.get('/')
提前致谢!
答案 0 :(得分:1)
我刚刚找到答案... URI规范RFC3986不支持IPv6作用域寻址区域。 Ruby URI实现遵循标准。这就是为什么:) 唯一的方法是:
URI::DEFAULT_PARSER = URI::RFC6874_Parser.new
我发现那个标准。 Go library net / url支持RFC6874,所以至少有一些灵感来编写Ruby RFC6874_Parser
:)
package main
import (
"fmt"
"log"
"net/url"
)
func main() {
fmt.Println("Hello, playground")
u, err := url.Parse("https://[fe80::250:56ff:fe9e:76d9%25ens192]")
if err != nil {
log.Fatal(err)
}
fmt.Println(u.Hostname())
}
返回
fe80::250:56ff:fe9e:76d9%ens192