@@ -21,7 +21,15 @@ import (
21
21
"testing"
22
22
)
23
23
24
- func TestLoopbackHostPort (t * testing.T ) {
24
+ func TestLoopbackHostPortIPv4 (t * testing.T ) {
25
+ _ , ipv6only , err := isIPv6LoopbackSupported ()
26
+ if err != nil {
27
+ t .Fatalf ("fail to enumerate network interface, %s" , err )
28
+ }
29
+ if ipv6only {
30
+ t .Fatalf ("no ipv4 loopback interface" )
31
+ }
32
+
25
33
host , port , err := LoopbackHostPort ("1.2.3.4:443" )
26
34
if err != nil {
27
35
t .Fatalf ("unexpected error: %v" , err )
@@ -43,8 +51,17 @@ func TestLoopbackHostPort(t *testing.T) {
43
51
if port != "443" {
44
52
t .Fatalf ("expected 443 as port, got %q" , port )
45
53
}
54
+ }
55
+ func TestLoopbackHostPortIPv6 (t * testing.T ) {
56
+ ipv6 , _ , err := isIPv6LoopbackSupported ()
57
+ if err != nil {
58
+ t .Fatalf ("fail to enumerate network interface, %s" , err )
59
+ }
60
+ if ! ipv6 {
61
+ t .Fatalf ("no ipv6 loopback interface" )
62
+ }
46
63
47
- host , port , err = LoopbackHostPort ("[ff06:0:0:0:0:0:0:c3]:443" )
64
+ host , port , err : = LoopbackHostPort ("[ff06:0:0:0:0:0:0:c3]:443" )
48
65
if err != nil {
49
66
t .Fatalf ("unexpected error: %v" , err )
50
67
}
@@ -62,8 +79,28 @@ func TestLoopbackHostPort(t *testing.T) {
62
79
if ip := net .ParseIP (host ); ip == nil || ! ip .IsLoopback () || ip .To4 () != nil {
63
80
t .Fatalf ("expected IPv6 host to be loopback, got %q" , host )
64
81
}
65
-
66
82
if port != "443" {
67
83
t .Fatalf ("expected 443 as port, got %q" , port )
68
84
}
69
85
}
86
+
87
+ func isIPv6LoopbackSupported () (ipv6 bool , ipv6only bool , err error ) {
88
+ addrs , err := net .InterfaceAddrs ()
89
+ if err != nil {
90
+ return false , false , err
91
+ }
92
+ ipv4 := false
93
+ for _ , address := range addrs {
94
+ ipnet , ok := address .(* net.IPNet )
95
+ if ! ok || ! ipnet .IP .IsLoopback () {
96
+ continue
97
+ }
98
+ if ipnet .IP .To4 () == nil {
99
+ ipv6 = true
100
+ continue
101
+ }
102
+ ipv4 = true
103
+ }
104
+ ipv6only = ipv6 && ! ipv4
105
+ return ipv6 , ipv6only , nil
106
+ }
0 commit comments