|
24 | 24 | IP6Unspecified = ma.StringCast("/ip6/::")
|
25 | 25 | )
|
26 | 26 |
|
| 27 | +// Loopback multiaddr prefixes. Any multiaddr beginning with one of the |
| 28 | +// following byte sequences is considered a loopback multiaddr. |
| 29 | +var loopbackPrefixes = [][]byte{ |
| 30 | + {ma.P_IP4, 127}, // 127.* |
| 31 | + IP6LinkLocalLoopback.Bytes(), |
| 32 | + IP6Loopback.Bytes(), |
| 33 | +} |
| 34 | + |
27 | 35 | // IsThinWaist returns whether a Multiaddr starts with "Thin Waist" Protocols.
|
28 | 36 | // This means: /{IP4, IP6}[/{TCP, UDP}]
|
29 | 37 | func IsThinWaist(m ma.Multiaddr) bool {
|
@@ -52,21 +60,14 @@ func IsThinWaist(m ma.Multiaddr) bool {
|
52 | 60 | }
|
53 | 61 |
|
54 | 62 | // IsIPLoopback returns whether a Multiaddr is a "Loopback" IP address
|
55 |
| -// This means either /ip4/127.0.0.1 or /ip6/::1 |
56 |
| -// TODO: differentiate IsIPLoopback and OverIPLoopback |
| 63 | +// This means either /ip4/127.*.*.*, /ip6/::1, or /ip6/fe80::1 |
57 | 64 | func IsIPLoopback(m ma.Multiaddr) bool {
|
58 | 65 | b := m.Bytes()
|
59 |
| - |
60 |
| - // /ip4/127 prefix (_entire_ /8 is loopback...) |
61 |
| - if bytes.HasPrefix(b, []byte{ma.P_IP4, 127}) { |
62 |
| - return true |
| 66 | + for _, prefix := range loopbackPrefixes { |
| 67 | + if bytes.HasPrefix(b, prefix) { |
| 68 | + return true |
| 69 | + } |
63 | 70 | }
|
64 |
| - |
65 |
| - // /ip6/::1 |
66 |
| - if !m.Decapsulate(IP6Loopback).Equal(m) || !m.Decapsulate(IP6LinkLocalLoopback).Equal(m) { |
67 |
| - return true |
68 |
| - } |
69 |
| - |
70 | 71 | return false
|
71 | 72 | }
|
72 | 73 |
|
|
0 commit comments