@@ -7,30 +7,6 @@ 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-
3410// Listener wraps a net.Listener automatically wrapping new connections with PROXY protocol support.
3511type Listener struct {
3612 net.Listener
@@ -124,7 +100,23 @@ func (l *Listener) Filter() []Rule {
124100func (l * Listener ) SetFilter (filter []Rule ) {
125101 newFilter := make ([]Rule , len (filter ))
126102 copy (newFilter , filter )
127- sort .Sort (rules (newFilter ))
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+ })
128120 if len (newFilter ) > 0 {
129121 // dedup
130122 last := newFilter [0 ]
0 commit comments