Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

URI::Generic.use_proxy? cannot match IPv6 literal addresses in no_proxy

未关闭
#218 0 条评论 2 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

评估

难度
3/5
预计耗时
1-2 天
新手友好度
68/100
Issue 类型
缺陷
描述清晰度
基本清楚
活跃度
冷清
技术栈
ruby
领域
networking

调研方向

从 URI::Generic.use_proxy? 入手,检查 issue 中展示的 no_proxy 解析正则表达式。使用提供的 Ruby 示例重现该行为,然后验证裸 IPv6、带方括号的 IPv6、带端口且带方括号的 IPv6 以及 CIDR IPv6 条目都能被识别,同时现有的代理匹配仍能正常工作。

由索引模型根据 Issue 内容生成。

描述

Summary

URI::Generic.use_proxy? silently ignores IPv6 literal addresses in no_proxy / NO_PROXY, causing IPv6 targets to always be proxied even when they should be excluded.

Root cause

The parsing regex in use_proxy? splits no_proxy entries on colons to extract an optional port:

no_proxy.scan(/([^:,\s]+)(?::(\d+))?/) {|p_host, p_port|

IPv6 addresses contain colons as part of their syntax (e.g. 2001:db8::1), so this regex mangles them; the address is split into fragments rather than parsed as a host. As a result:

  • Bare entries like 2001:db8::1 are never correctly captured into p_host
  • Bracketed entries like [2001:db8::1] are captured literally (with brackets) and never reach the IPAddr.new(p_host).include?(addr) check since IPAddr.new("[2001:db8::1]") raises InvalidAddressError
  • Bracketed entries with port like [2001:db8::1]:8080 are similarly broken

Reproduction

require 'uri'
require 'resolv'

# IPv6 target that should bypass the proxy
no_proxy = "2001:db8::1"
hostname  = "2001:db8::1"
addr      = Resolv.getaddress(hostname) rescue hostname
port      = 80

puts URI::Generic.use_proxy?(hostname, addr, port, no_proxy)
# Expected: false (should bypass proxy)
# Actual:   true  (incorrectly routes through proxy)

Expected behavior

All three real-world no_proxy formats for IPv6 should be recognized:

Format Example
Bare address 2001:db8::1
Bracketed (RFC 2732 / RFC 3986) [2001:db8::1]
Bracketed with port [2001:db8::1]:8080
CIDR 2001:db8::/32
主要语言
Ruby
星标
125
派生
65
平均合并
6 小时 4 分钟
30 天内合并 PR
2

贡献指南

这个仓库没有索引到贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

ruby/uri 的其他 Issue

查看 ruby/uri 的全部 Issue

相似的 Issue

更多 Ruby Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。