【问题标题】:Ruby URI cannot handle link-local IPv6 addresses with explicitly specified outgoing interface?Ruby URI 无法处理具有明确指定的传出接口的链接本地 IPv6 地址?
【发布时间】:2017-06-28 07:50:49
【问题描述】:

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

提前致谢!

【问题讨论】:

    标签: ruby uri ipv6 link-local


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-29
      • 2011-08-18
      相关资源
      最近更新 更多