Ruby URI无法使用显式指定的传出接口处理链接本地IPv6地址?

时间:2017-06-28 07:50:49

标签: ruby uri ipv6 link-local

我正在尝试使用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('/')

提前致谢!

1 个答案:

答案 0 :(得分:1)

我刚刚找到答案... URI规范RFC3986不支持IPv6作用域寻址区域。 Ruby URI实现遵循标准。这就是为什么:) 唯一的方法是:

我发现那个标准。 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

http://godoc.burntsushi.net/src/net/url/url.go