URI::Generic.use_proxy? cannot match IPv6 literal addresses in no_proxy
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 3/5
- Thời gian dự kiến
- 1-2 ngày
- Mức phù hợp với người mới
- 68/100
- Loại issue
- Lỗi
- Độ rõ ràng
- Khá rõ ràng
- Mức độ hoạt động
- Ít trao đổi
- Công nghệ
- ruby
- Lĩnh vực
- networking
Hướng nghiên cứu
Bắt đầu tại URI::Generic.use_proxy? và kiểm tra regex phân tích no_proxy được hiển thị trong issue. Tái hiện hành vi bằng ví dụ Ruby được cung cấp, sau đó xác minh rằng các mục IPv6 dạng trần, được đặt trong ngoặc vuông, được đặt trong ngoặc vuông kèm cổng và ở dạng CIDR đều được nhận diện, đồng thời việc so khớp proxy hiện có vẫn hoạt động.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
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::1are never correctly captured intop_host - Bracketed entries like
[2001:db8::1]are captured literally (with brackets) and never reach theIPAddr.new(p_host).include?(addr)check sinceIPAddr.new("[2001:db8::1]")raisesInvalidAddressError - Bracketed entries with port like
[2001:db8::1]:8080are 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 |
- Ngôn ngữ chính
- Ruby
- Star
- 125
- Fork
- 65
- Merge trung bình
- 6 giờ 4 phút
- Pull request đã merge (30 ngày)
- 2
Hướng dẫn đóng góp
Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của ruby/uri
-
Độ khó 3/5 1-2 ngày Mức phù hợp với người mới 48/100
-
upstream contact for Debian Đang mở
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 25/100
-
Độ khó 3/5 1-2 ngày Mức phù hợp với người mới 68/100
-
Độ khó 3/5 1-2 ngày Mức phù hợp với người mới 52/100
-
Độ khó 5/5 Hơn một tuần Mức phù hợp với người mới 35/100
Issue tương tự
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
simp/pupmod-simp-simp#395 ·
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 80/100
simp/pupmod-simp-rsyslog#219 ·
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 90/100
simp/pupmod-simp-pupmod#256 ·
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 90/100
simp/pupmod-simp-sudo#150 ·
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 90/100