Make IP address checking more obvious, and add tests for the net module.
This commit is contained in:
parent
d27f40d9b1
commit
5978625c12
2 changed files with 60 additions and 3 deletions
|
|
@ -95,6 +95,7 @@ type
|
||||||
address_v4*: array[0..3, uint8] ## Contains the IP address in bytes in
|
address_v4*: array[0..3, uint8] ## Contains the IP address in bytes in
|
||||||
## case of IPv4
|
## case of IPv4
|
||||||
|
|
||||||
|
proc isIpAddress*(address_str: string): bool
|
||||||
proc parseIpAddress*(address_str: string): TIpAddress
|
proc parseIpAddress*(address_str: string): TIpAddress
|
||||||
|
|
||||||
proc isDisconnectionError*(flags: set[SocketFlag],
|
proc isDisconnectionError*(flags: set[SocketFlag],
|
||||||
|
|
@ -527,9 +528,8 @@ proc connect*(socket: Socket, address: string, port = Port(0),
|
||||||
|
|
||||||
when defined(ssl):
|
when defined(ssl):
|
||||||
if socket.isSSL:
|
if socket.isSSL:
|
||||||
try:
|
# RFC3546 for SNI specifies that IP addresses are not allowed.
|
||||||
discard parseIpAddress(address)
|
if not isIpAddress(address):
|
||||||
except ValueError:
|
|
||||||
# Discard result in case OpenSSL version doesn't support SNI, or we're
|
# Discard result in case OpenSSL version doesn't support SNI, or we're
|
||||||
# not using TLSv1+
|
# not using TLSv1+
|
||||||
discard SSL_set_tlsext_host_name(socket.sslHandle, address)
|
discard SSL_set_tlsext_host_name(socket.sslHandle, address)
|
||||||
|
|
@ -1259,3 +1259,13 @@ proc parseIpAddress*(address_str: string): TIpAddress =
|
||||||
return parseIPv6Address(address_str)
|
return parseIPv6Address(address_str)
|
||||||
else:
|
else:
|
||||||
return parseIPv4Address(address_str)
|
return parseIPv4Address(address_str)
|
||||||
|
|
||||||
|
|
||||||
|
proc isIpAddress*(address_str: string): bool =
|
||||||
|
## Checks if a string is an IP address
|
||||||
|
## Returns true if it is, false otherwise
|
||||||
|
try:
|
||||||
|
discard parseIpAddress(address_str)
|
||||||
|
except ValueError:
|
||||||
|
return false
|
||||||
|
return true
|
||||||
|
|
|
||||||
47
tests/stdlib/tnet.nim
Normal file
47
tests/stdlib/tnet.nim
Normal file
|
|
@ -0,0 +1,47 @@
|
||||||
|
import net
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
suite "isIpAddress tests":
|
||||||
|
test "127.0.0.1 is valid":
|
||||||
|
check isIpAddress("127.0.0.1") == true
|
||||||
|
|
||||||
|
test "ipv6 localhost is valid":
|
||||||
|
check isIpAddress("::1") == true
|
||||||
|
|
||||||
|
test "fqdn is not an ip address":
|
||||||
|
check isIpAddress("example.com") == false
|
||||||
|
|
||||||
|
test "random string is not an ipaddress":
|
||||||
|
check isIpAddress("foo bar") == false
|
||||||
|
|
||||||
|
test "5127.0.0.1 is invalid":
|
||||||
|
check isIpAddress("5127.0.0.1") == false
|
||||||
|
|
||||||
|
test "ipv6 is valid":
|
||||||
|
check isIpAddress("2001:cdba:0000:0000:0000:0000:3257:9652") == true
|
||||||
|
|
||||||
|
test "invalid ipv6":
|
||||||
|
check isIpAddress("gggg:cdba:0000:0000:0000:0000:3257:9652") == false
|
||||||
|
|
||||||
|
|
||||||
|
suite "parseIpAddress tests":
|
||||||
|
test "127.0.0.1 is valid":
|
||||||
|
discard parseIpAddress("127.0.0.1")
|
||||||
|
|
||||||
|
test "ipv6 localhost is valid":
|
||||||
|
discard parseIpAddress("::1")
|
||||||
|
|
||||||
|
test "fqdn is not an ip address":
|
||||||
|
expect(ValueError):
|
||||||
|
discard parseIpAddress("example.com")
|
||||||
|
|
||||||
|
test "random string is not an ipaddress":
|
||||||
|
expect(ValueError):
|
||||||
|
discard parseIpAddress("foo bar")
|
||||||
|
|
||||||
|
test "ipv6 is valid":
|
||||||
|
discard parseIpAddress("2001:cdba:0000:0000:0000:0000:3257:9652")
|
||||||
|
|
||||||
|
test "invalid ipv6":
|
||||||
|
expect(ValueError):
|
||||||
|
discard parseIpAddress("gggg:cdba:0000:0000:0000:0000:3257:9652")
|
||||||
Loading…
Add table
Add a link
Reference in a new issue