1

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

提前致谢!

4

1 回答 1

1

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

我找到了那个标准。Go 库 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

于 2017-06-29T17:24:46.990 回答