Skip to content

Commit 349da7e

Browse files
authored
Merge pull request #132 from wleeaf/zone-id-unreserved-characters
Allow -, . and ~ in IPv6 zone IDs
2 parents 6f1450b + 8aaee2f commit 349da7e

2 files changed

Lines changed: 11 additions & 2 deletions

File tree

‎lib/ipaddr.rb‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -617,7 +617,7 @@ def zone_id
617617
def zone_id=(zid)
618618
if @family == Socket::AF_INET6
619619
case zid
620-
when nil, /\A%(\w+)\z/
620+
when nil, /\A%[-0-9A-Za-z._~]+\z/
621621
@zone_id = zid
622622
else
623623
raise InvalidAddressError, "invalid zone identifier for address"
@@ -758,7 +758,7 @@ def initialize(addr = '::', family = Socket::AF_UNSPEC)
758758
family = Socket::AF_INET6
759759
bracketed = true
760760
end
761-
if prefix =~ /\A(.*)(%\w+)\z/
761+
if prefix =~ /\A(.*)(%[-0-9A-Za-z._~]+)\z/
762762
prefix = $1
763763
zone_id = $2
764764
family = Socket::AF_INET6

‎test/test_ipaddr.rb‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,9 @@ def test_to_s_with_zone_id
302302
assert_equal("::192.168.1.2%eth0", IPAddr.new("::192.168.1.2%eth0").to_s)
303303
assert_equal("fe80::1%0ab", IPAddr.new("fe80::1%0ab").to_s)
304304
assert_equal("fe80::1%0012", IPAddr.new("fe80::1%0012").to_s)
305+
assert_equal("fe80::1%eth0.100", IPAddr.new("fe80::1%eth0.100").to_s)
306+
assert_equal("fe80::1%br-lan", IPAddr.new("fe80::1%br-lan").to_s)
307+
assert_equal("fe80::%a~b/64", IPAddr.new("fe80::1%a~b/64").cidr)
305308
end
306309

307310
def test_to_bits
@@ -389,6 +392,12 @@ def test_zone_id
389392
assert_equal('%ab0', a.zone_id)
390393
assert_equal("1:2:3:4:5:6:7:8%ab0", a.to_s)
391394
assert_raise(IPAddr::InvalidAddressError) { a.zone_id = '%' }
395+
a.zone_id = '%eth0.100'
396+
assert_equal("1:2:3:4:5:6:7:8%eth0.100", a.to_s)
397+
a.zone_id = '%br-lan'
398+
assert_equal('%br-lan', a.zone_id)
399+
assert_raise(IPAddr::InvalidAddressError) { a.zone_id = '%a b' }
400+
assert_raise(IPAddr::InvalidAddressError) { a.zone_id = '%a/b' }
392401
end
393402

394403
def test_to_range

0 commit comments

Comments
 (0)