@@ -63,13 +63,13 @@ func IsIPLoopback(m ma.Multiaddr) bool {
63
63
if m == nil {
64
64
return false
65
65
}
66
- c , _ := ma . SplitFirst (m )
67
- if c == nil {
66
+ head , _ := splitFirstSlice (m )
67
+ if len ( head ) == 0 {
68
68
return false
69
69
}
70
- switch c . Protocol (). Code {
70
+ switch head [ 0 ]. Code () {
71
71
case ma .P_IP4 , ma .P_IP6 :
72
- return net .IP (c .RawValue ()).IsLoopback ()
72
+ return net .IP (head [ 0 ] .RawValue ()).IsLoopback ()
73
73
}
74
74
return false
75
75
}
@@ -82,39 +82,52 @@ func IsIP6LinkLocal(m ma.Multiaddr) bool {
82
82
if m == nil {
83
83
return false
84
84
}
85
- c , _ := ma . SplitFirst (m )
86
- if c == nil || c . Protocol (). Code != ma .P_IP6 {
85
+ head , _ := splitFirstSlice (m )
86
+ if len ( head ) == 0 || head [ 0 ]. Code () != ma .P_IP6 {
87
87
return false
88
88
}
89
- ip := net .IP (c .RawValue ())
89
+ ip := net .IP (head [ 0 ] .RawValue ())
90
90
return ip .IsLinkLocalMulticast () || ip .IsLinkLocalUnicast ()
91
91
}
92
92
93
93
// IsIPUnspecified returns whether a Multiaddr starts with an Unspecified IP address
94
94
// This means either /ip4/0.0.0.0/* or /ip6/::/*
95
95
func IsIPUnspecified (m ma.Multiaddr ) bool {
96
96
m = zoneless (m )
97
- if m == nil {
97
+ if len (m ) == 0 {
98
+ return false
99
+ }
100
+ head , _ := splitFirstSlice (m )
101
+ if len (head ) == 0 {
98
102
return false
99
103
}
100
- c , _ := ma .SplitFirst (m )
101
- return net .IP (c .RawValue ()).IsUnspecified ()
104
+ return net .IP (head [0 ].RawValue ()).IsUnspecified ()
105
+ }
106
+
107
+ func splitFirstSlice (m ma.Multiaddr ) (ma.Multiaddr , ma.Multiaddr ) {
108
+ switch len (m ) {
109
+ case 0 :
110
+ return nil , nil
111
+ case 1 :
112
+ return m , nil
113
+ default :
114
+ return m [:1 ], m [1 :]
115
+ }
102
116
}
103
117
104
118
// If m matches [zone,ip6,...], return [ip6,...]
105
119
// else if m matches [], [zone], or [zone,...], return nil
106
120
// else return m
107
121
func zoneless (m ma.Multiaddr ) ma.Multiaddr {
108
- head , tail := ma . SplitFirst (m )
109
- if head == nil {
122
+ head , tail := splitFirstSlice (m )
123
+ if len ( head ) == 0 {
110
124
return nil
111
125
}
112
- if head . Protocol (). Code == ma .P_IP6ZONE {
113
- if tail == nil {
126
+ if head [ 0 ]. Code () == ma .P_IP6ZONE {
127
+ if len ( tail ) == 0 {
114
128
return nil
115
129
}
116
- tailhead , _ := ma .SplitFirst (tail )
117
- if tailhead .Protocol ().Code != ma .P_IP6 {
130
+ if tail [0 ].Code () != ma .P_IP6 {
118
131
return nil
119
132
}
120
133
return tail
@@ -126,7 +139,7 @@ func zoneless(m ma.Multiaddr) ma.Multiaddr {
126
139
// IsNAT64IPv4ConvertedIPv6Addr returns whether addr is a well-known prefix "64:ff9b::/96" addr
127
140
// used for NAT64 Translation. See RFC 6052
128
141
func IsNAT64IPv4ConvertedIPv6Addr (addr ma.Multiaddr ) bool {
129
- c , _ := ma . SplitFirst (addr )
130
- return c != nil && c . Protocol (). Code == ma .P_IP6 &&
131
- inAddrRange (c .RawValue (), nat64 )
142
+ head , _ := splitFirstSlice (addr )
143
+ return len ( head ) == 1 && head [ 0 ]. Code () == ma .P_IP6 &&
144
+ inAddrRange (head [ 0 ] .RawValue (), nat64 )
132
145
}
0 commit comments