@@ -63,13 +63,13 @@ func IsIPLoopback(m ma.Multiaddr) bool {
6363 if m == nil {
6464 return false
6565 }
66- c , _ := ma . SplitFirst (m )
67- if c == nil {
66+ head , _ := splitFirstSlice (m )
67+ if len ( head ) == 0 {
6868 return false
6969 }
70- switch c . Protocol (). Code {
70+ switch head [ 0 ]. Code () {
7171 case ma .P_IP4 , ma .P_IP6 :
72- return net .IP (c .RawValue ()).IsLoopback ()
72+ return net .IP (head [ 0 ] .RawValue ()).IsLoopback ()
7373 }
7474 return false
7575}
@@ -82,39 +82,52 @@ func IsIP6LinkLocal(m ma.Multiaddr) bool {
8282 if m == nil {
8383 return false
8484 }
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 {
8787 return false
8888 }
89- ip := net .IP (c .RawValue ())
89+ ip := net .IP (head [ 0 ] .RawValue ())
9090 return ip .IsLinkLocalMulticast () || ip .IsLinkLocalUnicast ()
9191}
9292
9393// IsIPUnspecified returns whether a Multiaddr starts with an Unspecified IP address
9494// This means either /ip4/0.0.0.0/* or /ip6/::/*
9595func IsIPUnspecified (m ma.Multiaddr ) bool {
9696 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 {
98102 return false
99103 }
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+ }
102116}
103117
104118// If m matches [zone,ip6,...], return [ip6,...]
105119// else if m matches [], [zone], or [zone,...], return nil
106120// else return m
107121func 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 {
110124 return nil
111125 }
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 {
114128 return nil
115129 }
116- tailhead , _ := ma .SplitFirst (tail )
117- if tailhead .Protocol ().Code != ma .P_IP6 {
130+ if tail [0 ].Code () != ma .P_IP6 {
118131 return nil
119132 }
120133 return tail
@@ -126,7 +139,7 @@ func zoneless(m ma.Multiaddr) ma.Multiaddr {
126139// IsNAT64IPv4ConvertedIPv6Addr returns whether addr is a well-known prefix "64:ff9b::/96" addr
127140// used for NAT64 Translation. See RFC 6052
128141func 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 ) > 0 && head [ 0 ]. Code () == ma .P_IP6 &&
144+ inAddrRange (head [ 0 ] .RawValue (), nat64 )
132145}
0 commit comments