@@ -7,6 +7,30 @@ import (
77 "time"
88)
99
10+ type rules []Rule
11+
12+ func (r rules ) Swap (i , j int ) {
13+ r [i ], r [j ] = r [j ], r [i ]
14+ }
15+ func (r rules ) Len () int { return len (r ) }
16+ func (r rules ) Less (i , j int ) bool {
17+ iOnes , iBits := r [i ].Subnet .Mask .Size ()
18+ jOnes , jBits := r [j ].Subnet .Mask .Size ()
19+ if iOnes != jOnes {
20+ return iOnes > jOnes
21+ }
22+ if iBits != jBits {
23+ return iBits > jBits
24+ }
25+ if r [i ].Timeout != r [j ].Timeout {
26+ if r [j ].Timeout == 0 {
27+ return true
28+ }
29+ return r [i ].Timeout < r [j ].Timeout
30+ }
31+ return r [i ].Timeout < r [j ].Timeout
32+ }
33+
1034// Listener wraps a net.Listener automatically wrapping new connections with PROXY protocol support.
1135type Listener struct {
1236 net.Listener
@@ -100,23 +124,7 @@ func (l *Listener) Filter() []Rule {
100124func (l * Listener ) SetFilter (filter []Rule ) {
101125 newFilter := make ([]Rule , len (filter ))
102126 copy (newFilter , filter )
103- sort .Slice (newFilter , func (i , j int ) bool {
104- iOnes , iBits := newFilter [i ].Subnet .Mask .Size ()
105- jOnes , jBits := newFilter [j ].Subnet .Mask .Size ()
106- if iOnes != jOnes {
107- return iOnes > jOnes
108- }
109- if iBits != jBits {
110- return iBits > jBits
111- }
112- if newFilter [i ].Timeout != newFilter [j ].Timeout {
113- if newFilter [j ].Timeout == 0 {
114- return true
115- }
116- return newFilter [i ].Timeout < newFilter [j ].Timeout
117- }
118- return newFilter [i ].Timeout < newFilter [j ].Timeout
119- })
127+ sort .Sort (rules (newFilter ))
120128 if len (newFilter ) > 0 {
121129 // dedup
122130 last := newFilter [0 ]
0 commit comments