Skip to content

Commit 3589191

Browse files
committed
Unified similar exceptions, exceptions inherit from IPAddr::Error
1 parent 006aaa7 commit 3589191

File tree

1 file changed

+48
-53
lines changed

1 file changed

+48
-53
lines changed

lib/ipaddr.rb

Lines changed: 48 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -82,31 +82,26 @@ class IPAddr
8282
\z
8383
}xi
8484

85-
# Raised when the provided IP address is an invalid address.
86-
class InvalidAddress < ArgumentError; end
87-
88-
# Raised when the provided IP address is of an unsupported address family.
89-
class UnsupportedAddressFamily < ArgumentError; end
85+
# Generic IPAddr related error. Exceptions raised in this class should
86+
# inherit from Error.
87+
class Error < ArgumentError; end
9088

91-
# Raised when an octet contains a zero-filled number.
92-
# Example: 192.162.022.001
93-
class ZeroFilledNumber < ArgumentError; end
94-
95-
# Raised when an address is a mix of address families.
96-
class InconsistentAddressFamily < ArgumentError; end
89+
# Raised when the provided IP address is an invalid address.
90+
class InvalidAddressError < Error; end
9791

98-
# Raised when an address family is unspecified and cannot be reliability
99-
# determined (for example: if an Integer is provided instead of a string).
100-
class UnspecifiedAddressFamily < ArgumentError; end
92+
# Raised when the address family is invalid such as an address with an
93+
# unsupported family, an address with an inconsistent family, or an address
94+
# who's family cannot be determined.
95+
class AddressFamilyError < Error; end
10196

10297
# Raised when the address is an invalid IPv4 address.
103-
class InvalidIPv4 < ArgumentError; end
98+
class InvalidIPv4Error < Error; end
10499

105100
# Raised when the address is an invalid IPv6 address.
106-
class InvalidIPv6 < ArgumentError; end
101+
class InvalidIPv6Error < Error; end
107102

108103
# Raised when the address is an invalid length.
109-
class InvalidLength < ArgumentError; end
104+
class InvalidPrefixError < Error; end
110105

111106
# Returns the address family of this IP address.
112107
attr_reader :family
@@ -126,7 +121,7 @@ def IPAddr::ntop(addr)
126121
when 16
127122
s = IN6FORMAT % addr.unpack('n8')
128123
else
129-
raise UnsupportedAddressFamily, "unsupported address family"
124+
raise AddressFamilyError, "unsupported address family"
130125
end
131126
return s
132127
end
@@ -252,7 +247,7 @@ def hton
252247
(@addr >> (112 - 16 * i)) & 0xffff
253248
}.pack('n8')
254249
else
255-
raise UnsupportedAddressFamily, "unsupported address family"
250+
raise AddressFamilyError, "unsupported address family"
256251
end
257252
end
258253

@@ -284,7 +279,7 @@ def ipv4_compat?
284279
# into an IPv4-mapped IPv6 address.
285280
def ipv4_mapped
286281
if !ipv4?
287-
raise InvalidIPv4, "not an IPv4 address"
282+
raise InvalidIPv4Error, "not an IPv4 address"
288283
end
289284
return self.clone.set(@addr | 0xffff00000000, Socket::AF_INET6)
290285
end
@@ -293,7 +288,7 @@ def ipv4_mapped
293288
# into an IPv4-compatible IPv6 address.
294289
def ipv4_compat
295290
if !ipv4?
296-
raise InvalidIPv4, "not an IPv4 address"
291+
raise InvalidIPv4Error, "not an IPv4 address"
297292
end
298293
return self.clone.set(@addr, Socket::AF_INET6)
299294
end
@@ -317,22 +312,22 @@ def reverse
317312
when Socket::AF_INET6
318313
return ip6_arpa
319314
else
320-
raise UnsupportedAddressFamily, "unsupported address family"
315+
raise AddressFamilyError, "unsupported address family"
321316
end
322317
end
323318

324319
# Returns a string for DNS reverse lookup compatible with RFC3172.
325320
def ip6_arpa
326321
if !ipv6?
327-
raise InvalidIPv6, "not an IPv6 address"
322+
raise InvalidIPv6Error, "not an IPv6 address"
328323
end
329324
return _reverse + ".ip6.arpa"
330325
end
331326

332327
# Returns a string for DNS reverse lookup compatible with RFC1886.
333328
def ip6_int
334329
if !ipv6?
335-
raise InvalidIPv6, "not an IPv6 address"
330+
raise InvalidIPv6Error, "not an IPv6 address"
336331
end
337332
return _reverse + ".ip6.int"
338333
end
@@ -372,7 +367,7 @@ def to_range
372367
when Socket::AF_INET6
373368
end_addr = (@addr | (IN6MASK ^ @mask_addr))
374369
else
375-
raise UnsupportedAddressFamily, "unsupported address family"
370+
raise AddressFamilyError, "unsupported address family"
376371
end
377372

378373
return clone.set(begin_addr, @family)..clone.set(end_addr, @family)
@@ -387,7 +382,7 @@ def inspect
387382
when Socket::AF_INET6
388383
af = "IPv6"
389384
else
390-
raise UnsupportedAddressFamily, "unsupported address family"
385+
raise AddressFamilyError, "unsupported address family"
391386
end
392387
return sprintf("#<%s: %s:%s/%s>", self.class.name,
393388
af, _to_string(@addr), _to_string(@mask_addr))
@@ -404,14 +399,14 @@ def set(addr, *family)
404399
case family[0] ? family[0] : @family
405400
when Socket::AF_INET
406401
if addr < 0 || addr > IN4MASK
407-
raise InvalidAddress, "invalid address"
402+
raise InvalidAddressError, "invalid address"
408403
end
409404
when Socket::AF_INET6
410405
if addr < 0 || addr > IN6MASK
411-
raise InvalidAddress, "invalid address"
406+
raise InvalidAddressError, "invalid address"
412407
end
413408
else
414-
raise UnsupportedAddressFamily, "unsupported address family"
409+
raise AddressFamilyError, "unsupported address family"
415410
end
416411
@addr = addr
417412
if family[0]
@@ -428,7 +423,7 @@ def mask!(mask)
428423
else
429424
m = IPAddr.new(mask)
430425
if m.family != @family
431-
raise InconsistentAddressFamily, "address family is not same"
426+
raise AddressFamilyError, "address family is not same"
432427
end
433428
@mask_addr = m.to_i
434429
@addr &= @mask_addr
@@ -440,18 +435,18 @@ def mask!(mask)
440435
case @family
441436
when Socket::AF_INET
442437
if prefixlen < 0 || prefixlen > 32
443-
raise InvalidLength, "invalid length"
438+
raise InvalidPrefixError, "invalid length"
444439
end
445440
masklen = 32 - prefixlen
446441
@mask_addr = ((IN4MASK >> masklen) << masklen)
447442
when Socket::AF_INET6
448443
if prefixlen < 0 || prefixlen > 128
449-
raise InvalidLength, "invalid length"
444+
raise InvalidPrefixError, "invalid length"
450445
end
451446
masklen = 128 - prefixlen
452447
@mask_addr = ((IN6MASK >> masklen) << masklen)
453448
else
454-
raise UnsupportedAddressFamily, "unsupported address family"
449+
raise AddressFamilyError, "unsupported address family"
455450
end
456451
@addr = ((@addr >> masklen) << masklen)
457452
return self
@@ -485,9 +480,9 @@ def initialize(addr = '::', family = Socket::AF_UNSPEC)
485480
@mask_addr = (family == Socket::AF_INET) ? IN4MASK : IN6MASK
486481
return
487482
when Socket::AF_UNSPEC
488-
raise UnspecifiedAddressFamily, "address family must be specified"
483+
raise AddressFamilyError, "address family must be specified"
489484
else
490-
raise UnsupportedAddressFamily, "unsupported address family: #{family}"
485+
raise AddressFamilyError, "unsupported address family: #{family}"
491486
end
492487
end
493488
prefix, prefixlen = addr.split('/')
@@ -510,7 +505,7 @@ def initialize(addr = '::', family = Socket::AF_UNSPEC)
510505
@family = Socket::AF_INET6
511506
end
512507
if family != Socket::AF_UNSPEC && @family != family
513-
raise InconsistentAddressFamily, "address family mismatch"
508+
raise AddressFamilyError, "address family mismatch"
514509
end
515510
if prefixlen
516511
mask!(prefixlen)
@@ -539,8 +534,8 @@ def in_addr(addr)
539534
octets = m.captures
540535
end
541536
octets.inject(0) { |i, s|
542-
(n = s.to_i) < 256 or raise InvalidAddress, "invalid address"
543-
s.match(/\A0./) and raise ZeroFilledNumber, "zero-filled number is ambiguous"
537+
(n = s.to_i) < 256 or raise InvalidAddressError, "invalid address"
538+
s.match(/\A0./) and raise InvalidIPv4Error, "zero-filled number is ambiguous"
544539
i << 8 | n
545540
}
546541
end
@@ -557,18 +552,18 @@ def in6_addr(left)
557552
right = ''
558553
when RE_IPV6ADDRLIKE_COMPRESSED
559554
if $4
560-
left.count(':') <= 6 or raise InvalidAddress, "invalid address"
555+
left.count(':') <= 6 or raise InvalidAddressError, "invalid address"
561556
addr = in_addr($~[4,4])
562557
left = $1
563558
right = $3 + '0:0'
564559
else
565-
left.count(':') <= 7 or raise InvalidAddress, "invalid address"
560+
left.count(':') <= 7 or raise InvalidAddressError, "invalid address"
566561
left = $1
567562
right = $2
568563
addr = 0
569564
end
570565
else
571-
raise InvalidAddress, "invalid address"
566+
raise InvalidAddressError, "invalid address"
572567
end
573568
l = left.split(':')
574569
r = right.split(':')
@@ -588,7 +583,7 @@ def addr_mask(addr)
588583
when Socket::AF_INET6
589584
return addr & IN6MASK
590585
else
591-
raise UnsupportedAddressFamily, "unsupported address family"
586+
raise AddressFamilyError, "unsupported address family"
592587
end
593588
end
594589

@@ -601,7 +596,7 @@ def _reverse
601596
when Socket::AF_INET6
602597
return ("%.32x" % @addr).reverse!.gsub!(/.(?!$)/, '\&.')
603598
else
604-
raise UnsupportedAddressFamily, "unsupported address family"
599+
raise AddressFamilyError, "unsupported address family"
605600
end
606601
end
607602

@@ -614,7 +609,7 @@ def _to_string(addr)
614609
when Socket::AF_INET6
615610
return (("%.32x" % addr).gsub!(/.{4}(?!$)/, '\&:'))
616611
else
617-
raise UnsupportedAddressFamily, "unsupported address family"
612+
raise AddressFamilyError, "unsupported address family"
618613
end
619614
end
620615

@@ -741,13 +736,13 @@ def test_s_new
741736

742737
assert_equal("2001:200:300::", IPAddr.new("[2001:200:300::]/48").to_s)
743738

744-
assert_raises(IPAddr::InvalidAddress) { IPAddr.new('192.168.0.256') }
745-
assert_raises(IPAddr::ZeroFilledNumber) { IPAddr.new('192.168.0.011') }
746-
assert_raises(IPAddr::InvalidAddress) { IPAddr.new("fe80::1%fxp0") }
747-
assert_raises(IPAddr::InconsistentAddressFamily) { IPAddr.new("::1/255.255.255.0") }
748-
assert_raises(IPAddr::UnspecifiedAddressFamily) { IPAddr.new(1) }
749-
assert_raises(IPAddr::InconsistentAddressFamily) { IPAddr.new("::ffff:192.168.1.2/120", Socket::AF_INET) }
750-
assert_raises(IPAddr::InvalidAddress) { IPAddr.new("[192.168.1.2]/120") }
739+
assert_raises(IPAddr::InvalidAddressError) { IPAddr.new('192.168.0.256') }
740+
assert_raises(IPAddr::InvalidIPv4Error) { IPAddr.new('192.168.0.011') }
741+
assert_raises(IPAddr::InvalidAddressError) { IPAddr.new("fe80::1%fxp0") }
742+
assert_raises(IPAddr::AddressFamilyError) { IPAddr.new("::1/255.255.255.0") }
743+
assert_raises(IPAddr::AddressFamilyError) { IPAddr.new(1) }
744+
assert_raises(IPAddr::AddressFamilyError) { IPAddr.new("::ffff:192.168.1.2/120", Socket::AF_INET) }
745+
assert_raises(IPAddr::InvalidAddressError) { IPAddr.new("[192.168.1.2]/120") }
751746
end
752747

753748
def test_s_new_ntoh
@@ -808,14 +803,14 @@ def test_reverse
808803

809804
def test_ip6_arpa
810805
assert_equal("f.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.0.0.5.0.5.0.e.f.f.3.ip6.arpa", IPAddr.new("3ffe:505:2::f").ip6_arpa)
811-
assert_raises(IPAddr::InvalidIPv6) {
806+
assert_raises(IPAddr::InvalidIPv6Error) {
812807
IPAddr.new("192.168.2.1").ip6_arpa
813808
}
814809
end
815810

816811
def test_ip6_int
817812
assert_equal("f.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.0.0.5.0.5.0.e.f.f.3.ip6.int", IPAddr.new("3ffe:505:2::f").ip6_int)
818-
assert_raises(IPAddr::InvalidIPv6) {
813+
assert_raises(IPAddr::InvalidIPv6Error) {
819814
IPAddr.new("192.168.2.1").ip6_int
820815
}
821816
end

0 commit comments

Comments
 (0)