IPAddr cannot parse link-local IPv6 address.
1.9.3p374 :001 > require 'ipaddr'
1.9.3p374 :002 > IPAddr.new("0:0:0:0:0:0:0:1%0")
ArgumentError: invalid address
in6_addr' from /Users/andrew/.rvm/rubies/ruby-2.0.0-p195/lib/ruby/2.0.0/ipaddr.rb:496:in initialize'
new' from (irb):2 from /Users/andrew/.rvm/rubies/ruby-2.0.0-p195/bin/irb:16:in '
Same behavior in Ruby 1.9.3 all patch levels
Updated by cedric.brancourt (Cedric Brancourt) over 10 years ago
Not sure this need a fix.
The %0 part of the example is the scope ( zone ) and should not be part of the address.
It is appended by operating system in the textual representation of the endpoint ( for interface identification ), and format depend on the operating system.
But it is not part of the address , see http://www.ietf.org/rfc/rfc4007.txt
This is the way I understand it. If I am right , this is not a bug.
Updated by knu (Akinori MUSHA) about 10 years ago
- Category set to lib
- Status changed from Open to Feedback
- Assignee set to knu (Akinori MUSHA)
IPAddr currently does not support scope ID's.
Making IPAddr deal with scope ID's would mean a lot more than just ignoring it (starting with adding #scope_id).
If you are going to request such a feature, you'll have to investigate, for example, in what contexts (libraries/methods/commands) an IPv6 address with a scope ID is valid and accepted, if #to_s should include it or another method should be added for that, how it would affect the backward compatibility, etc.
On the other hand, you can use
str.sub(/%.*/m, '') or
str[/[^%]*/m] if you just want to drop the scope ID part.