瀏覽代碼

added function that returns the private net for an IP

Tobias von Dewitz 6 年之前
父節點
當前提交
80dbbe1894
共有 2 個文件被更改,包括 37 次插入2 次删除
  1. 10 1
      ip.go
  2. 27 1
      ip_test.go

+ 10 - 1
ip.go

@@ -2,7 +2,7 @@ package ip
 
 
 import "net"
 import "net"
 
 
-var PRIVATE_NETWORKS = [...]string{"10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16", "fd00::/8"}
+var PRIVATE_NETWORKS = [...]string{"10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16", "fd00::/8", "127.0.0.0/8"}
 
 
 type IP struct {
 type IP struct {
 	IP               net.IP
 	IP               net.IP
@@ -28,3 +28,12 @@ func (i *IP) IsPrivate(ip net.IP) bool {
 	}
 	}
 	return false
 	return false
 }
 }
+
+func (i *IP) Network(ip net.IP) *net.IPNet {
+	for _, n := range i.private_networks {
+		if n.Contains(ip) {
+			return n
+		}
+	}
+	return nil
+}

+ 27 - 1
ip_test.go

@@ -16,6 +16,11 @@ func TestIPInCidr(t *testing.T) {
 	HandleIP(t, ip, "11.0.0.0", false)
 	HandleIP(t, ip, "11.0.0.0", false)
 	HandleIP(t, ip, "10.10.10.432", false)
 	HandleIP(t, ip, "10.10.10.432", false)
 
 
+	HandleIP(t, ip, "127.0.0.1", true)
+	HandleIP(t, ip, "127.255.255.255", true)
+	HandleIP(t, ip, "128.0.0.1", false)
+	HandleIP(t, ip, "126.255.255.255", false)
+
 	HandleIP(t, ip, "192.167.255.255", false)
 	HandleIP(t, ip, "192.167.255.255", false)
 	HandleIP(t, ip, "192.168.0.0", true)
 	HandleIP(t, ip, "192.168.0.0", true)
 	HandleIP(t, ip, "192.168.122.1", true)
 	HandleIP(t, ip, "192.168.122.1", true)
@@ -33,12 +38,33 @@ func TestIPInCidr(t *testing.T) {
 	HandleIP(t, ip, "fd02::1", true)
 	HandleIP(t, ip, "fd02::1", true)
 	HandleIP(t, ip, "fdff::1", true)
 	HandleIP(t, ip, "fdff::1", true)
 	HandleIP(t, ip, "fe00::1", false)
 	HandleIP(t, ip, "fe00::1", false)
+}
+
+func TestNetwork(t *testing.T) {
+	ip := NewIP()
 
 
+	HandleNetwork(t, ip, "127.0.0.1", "127.0.0.0/8", true)
+	HandleNetwork(t, ip, "127.244.0.1", "127.0.0.1/8", true)
+	HandleNetwork(t, ip, "128.244.0.1", "127.0.0.1/8", false)
+	HandleNetwork(t, ip, "10.145.32.11", "10.0.0.0/8", true)
+	HandleNetwork(t, ip, "172.16.0.1", "172.16.0.0/12", true)
+	HandleNetwork(t, ip, "192.168.21.44", "192.168.0.0/16", true)
+}
+
+func HandleNetwork(t *testing.T, privIP *IP, ip string, n string, assert bool) {
+	_, network, _ := net.ParseCIDR(n)
+	addr := net.ParseIP(ip)
+	res := privIP.Network(addr)
+	chk := (res != nil && res.String() == network.String())
+
+	if chk != assert {
+		t.Errorf("Assertion (have: %t, should be %t) failed on IP %s", chk, assert, ip)
+	}
 }
 }
 
 
 func HandleIP(t *testing.T, ip *IP, addr string, assert bool) {
 func HandleIP(t *testing.T, ip *IP, addr string, assert bool) {
 	res := ip.IsPrivate(net.ParseIP(addr))
 	res := ip.IsPrivate(net.ParseIP(addr))
 	if res != assert {
 	if res != assert {
-		t.Errorf("Assertion (have: %s, should be %s) failed on IP %s", res, assert, addr)
+		t.Errorf("Assertion (have: %t, should be %t) failed on IP %s", res, assert, addr)
 	}
 	}
 }
 }