summary refs log tree commit diff stats
path: root/lib/pure
diff options
context:
space:
mode:
authorMatthias Einwag <matthias.einwag@live.com>2014-03-14 22:17:44 +0100
committerMatthias Einwag <matthias.einwag@live.com>2014-03-14 22:17:44 +0100
commit95e4ab99e7830877fd67844b69640e1e31b705e4 (patch)
treeb799cede2cf96188b09f13dd59636cae60b2bad7 /lib/pure
parent7b055388b7acfc7b7db11dd8102a0de23e3547ae (diff)
downloadNim-95e4ab99e7830877fd67844b69640e1e31b705e4.tar.gz
Make the IP address exceptions more detailed
Diffstat (limited to 'lib/pure')
-rw-r--r--lib/pure/net.nim43
1 files changed, 24 insertions, 19 deletions
diff --git a/lib/pure/net.nim b/lib/pure/net.nim
index 82b24585f..9ee98cbe6 100644
--- a/lib/pure/net.nim
+++ b/lib/pure/net.nim
@@ -139,20 +139,21 @@ proc parseIPv4Address(address_str: string): TIpAddress =
   for i in 0 .. high(address_str):
     if address_str[i] in strutils.Digits: # Character is a number
       currentByte = currentByte * 10 + cast[uint16](ord(address_str[i]) - ord('0'))
-      if currentByte > 255'u16: raise newException(EInvalidValue, "Invalid IP Address")
+      if currentByte > 255'u16:
+        raise newException(EInvalidValue, "Invalid IP Address. Value is out of range")
       seperatorValid = true
     elif address_str[i] == '.': # IPv4 address separator
       if not seperatorValid or byteCount >= 3:
-        raise new EInvalidValue
+        raise newException(EInvalidValue, "Invalid IP Address. The address consists of too many groups")
       result.address_v4[byteCount] = cast[uint8](currentByte)
       currentByte = 0
       byteCount.inc
       seperatorValid = false
     else:
-      raise newException(EInvalidValue, "Invalid IP Address") # Invalid character
+      raise newException(EInvalidValue, "Invalid IP Address. Address contains an invalid character")
 
   if byteCount != 3 or not seperatorValid:
-    raise new EInvalidValue
+    raise newException(EInvalidValue, "Invalid IP Address")
   result.address_v4[byteCount] = cast[uint8](currentByte)
 
 proc parseIPv6Address(address_str: string): TIpAddress =
@@ -173,22 +174,24 @@ proc parseIPv6Address(address_str: string): TIpAddress =
 
   for i,c in address_str:
     if c == ':':
-      if not seperatorValid: raise newException(EInvalidValue, "Invalid IP Address")
+      if not seperatorValid: raise newException(EInvalidValue, "Invalid IP Address. Address contains an invalid seperator")
       if lastWasColon:        
-        if dualColonGroup != -1: raise newException(EInvalidValue, "Invalid IP Address")
+        if dualColonGroup != -1: raise newException(EInvalidValue, "Invalid IP Address. Address contains more than one \"::\" seperator")
         dualColonGroup = groupCount
         seperatorValid = false
       elif i != 0 and i != high(address_str):
-        if groupCount >= 8: raise newException(EInvalidValue, "Invalid IP Address")
+        if groupCount >= 8: raise newException(EInvalidValue, "Invalid IP Address. The address consists of too many groups")
         result.address_v6[groupCount*2] = cast[uint8](currentShort shr 8)
         result.address_v6[groupCount*2+1] = cast[uint8](currentShort and 0xFF)
         currentShort = 0
         groupCount.inc()        
         if dualColonGroup != -1: seperatorValid = false
       elif i == 0: # only valid if address starts with ::
-        if address_str[1] != ':': raise newException(EInvalidValue, "Invalid IP Address")
+        if address_str[1] != ':':
+          raise newException(EInvalidValue, "Invalid IP Address. Address may not start with \":\"")
       else: # i == high(address_str) - only valid if address ends with ::
-        if address_str[high(address_str)-1] != ':': raise newException(EInvalidValue, "Invalid IP Address")
+        if address_str[high(address_str)-1] != ':': 
+          raise newException(EInvalidValue, "Invalid IP Address. Address may not end with \":\"")
       lastWasColon = true
       currentGroupStart = i + 1
     elif c == '.': # Switch to parse IPv4 mode
@@ -204,16 +207,17 @@ proc parseIPv6Address(address_str: string): TIpAddress =
         currentShort = (currentShort shl 4) + cast[uint32](ord(c) - ord('a')) + 10
       else: # Upper case hex
         currentShort = (currentShort shl 4) + cast[uint32](ord(c) - ord('A')) + 10
-      if currentShort > 65535'u32: raise newException(EInvalidValue, "Invalid IP Address")
+      if currentShort > 65535'u32:
+        raise newException(EInvalidValue, "Invalid IP Address. Value is out of range")
       lastWasColon = false
       seperatorValid = true
     else:
-      raise newException(EInvalidValue, "Invalid IP Address")
+      raise newException(EInvalidValue, "Invalid IP Address. Address contains an invalid character")
 
 
   if v4StartPos == -1: # Don't parse v4. Copy the remaining v6 stuff
     if seperatorValid: # Copy remaining data
-      if groupCount >= 8: raise newException(EInvalidValue, "Invalid IP Address")
+      if groupCount >= 8: raise newException(EInvalidValue, "Invalid IP Address. The address consists of too many groups")
       result.address_v6[groupCount*2] = cast[uint8](currentShort shr 8)
       result.address_v6[groupCount*2+1] = cast[uint8](currentShort and 0xFF)
       groupCount.inc()
@@ -221,35 +225,36 @@ proc parseIPv6Address(address_str: string): TIpAddress =
     for i,c in address_str[v4StartPos..high(address_str)]:
       if c in strutils.Digits: # Character is a number
         currentShort = currentShort * 10 + cast[uint32](ord(c) - ord('0'))
-        if currentShort > 255'u32: raise newException(EInvalidValue, "Invalid IP Address")
+        if currentShort > 255'u32:
+          raise newException(EInvalidValue, "Invalid IP Address. Value is out of range")
         seperatorValid = true
       elif c == '.': # IPv4 address separator
         if not seperatorValid or byteCount >= 3:
-          raise new EInvalidValue
+          raise newException(EInvalidValue, "Invalid IP Address")
         result.address_v6[groupCount*2 + byteCount] = cast[uint8](currentShort)
         currentShort = 0
         byteCount.inc()
         seperatorValid = false
       else: # Invalid character
-        raise newException(EInvalidValue, "Invalid IP Address")
+        raise newException(EInvalidValue, "Invalid IP Address. Address contains an invalid character")
 
     if byteCount != 3 or not seperatorValid:
-      raise new EInvalidValue
+      raise newException(EInvalidValue, "Invalid IP Address")
     result.address_v6[groupCount*2 + byteCount] = cast[uint8](currentShort)
     groupCount += 2
 
   # Shift and fill zeros in case of ::
   if groupCount > 8:
-    raise newException(EInvalidValue, "Invalid IP Address")
+    raise newException(EInvalidValue, "Invalid IP Address. The address consists of too many groups")
   elif groupCount < 8: # must fill
-    if dualColonGroup == -1: raise newException(EInvalidValue, "Invalid IP Address")
+    if dualColonGroup == -1: raise newException(EInvalidValue, "Invalid IP Address. The address consists of too few groups")
     var toFill = 8 - groupCount # The number of groups to fill
     var toShift = groupCount - dualColonGroup # Nr of known groups after ::
     for i in 0..2*toShift-1: # shift
       result.address_v6[15-i] = result.address_v6[groupCount*2-i-1]
     for i in 0..2*toFill-1: # fill with 0s
       result.address_v6[dualColonGroup*2+i] = 0
-  elif dualColonGroup != -1: raise newException(EInvalidValue, "Invalid IP Address")
+  elif dualColonGroup != -1: raise newException(EInvalidValue, "Invalid IP Address. The address consists of too many groups")
 
 
 proc parseIpAddress*(address_str: string): TIpAddress =