@@ -18,34 +18,35 @@ import (
1818 "github.com/buglloc/rip/v2/pkg/handlers/notify"
1919 "github.com/buglloc/rip/v2/pkg/handlers/proxy"
2020 "github.com/buglloc/rip/v2/pkg/handlers/random"
21+ "github.com/buglloc/rip/v2/pkg/handlers/slices"
2122 "github.com/buglloc/rip/v2/pkg/handlers/sticky"
2223)
2324
2425var _ handlers.Parser = (* Parser )(nil )
2526
2627type Parser struct {
27- cur int
28- maxPart int
29- parts []string
28+ cur int
29+ maxLabel int
30+ labels []string
3031}
3132
3233func NewParser (req string ) * Parser {
33- parts := strings .Split (req , "." )
34- reverse ( parts )
34+ labels := strings .Split (req , "." )
35+ slices . StringsReverse ( labels )
3536 return & Parser {
36- cur : 0 ,
37- maxPart : len (parts ),
38- parts : parts ,
37+ cur : 0 ,
38+ maxLabel : len (labels ),
39+ labels : labels ,
3940 }
4041}
4142
4243func (p * Parser ) Next () (handlers.Handler , error ) {
43- if p .cur >= p .maxPart {
44+ if p .cur >= p .maxLabel {
4445 return nil , handlers .ErrEOF
4546 }
4647
47- part := p .parts [p .cur ]
48- h := parsePart (part )
48+ part := p .labels [p .cur ]
49+ h := parseHandler (part )
4950 if h == nil {
5051 return nil , handlers .ErrEOF
5152 }
@@ -60,11 +61,11 @@ func (p *Parser) Next() (handlers.Handler, error) {
6061}
6162
6263func (p * Parser ) NextRaw () (string , error ) {
63- if p .cur >= p .maxPart {
64+ if p .cur >= p .maxLabel {
6465 return "" , handlers .ErrEOF
6566 }
6667
67- ret := p .parts [p .cur ]
68+ ret := p .labels [p .cur ]
6869 if strings .HasPrefix (ret , "b32-" ) {
6970 decoded , err := base32 .StdEncoding .WithPadding (base32 .NoPadding ).DecodeString (strings .ToUpper (ret [4 :]))
7071 if err == nil {
@@ -75,6 +76,22 @@ func (p *Parser) NextRaw() (string, error) {
7576 return ret , nil
7677}
7778
79+ func (p * Parser ) RestValues () ([]string , error ) {
80+ var out []string
81+ for {
82+ v , err := p .NextValue ()
83+ if v == "" {
84+ return out , nil
85+ }
86+
87+ if err != nil {
88+ return nil , err
89+ }
90+
91+ out = append (out , v )
92+ }
93+ }
94+
7895func (p * Parser ) All () ([]handlers.Handler , error ) {
7996 var out []handlers.Handler
8097 for {
@@ -91,13 +108,55 @@ func (p *Parser) All() ([]handlers.Handler, error) {
91108 }
92109}
93110
94- func parsePart (part string ) handlers.Handler {
95- if len (part ) == 0 {
111+ func (p * Parser ) NextValue () (string , error ) {
112+ if p .cur >= p .maxLabel {
113+ return "" , handlers .ErrEOF
114+ }
115+
116+ label := p .labels [p .cur ]
117+ handlerName := label
118+ if indx := strings .IndexByte (handlerName , '-' ); indx > 0 {
119+ handlerName = handlerName [:indx ]
120+ }
121+
122+ switch handlerName {
123+ case ipv4 .ShortName , ipv4 .Name :
124+ fallthrough
125+ case ipv6 .ShortName , ipv6 .Name :
126+ fallthrough
127+ case cname .ShortName , cname .Name :
128+ fallthrough
129+ case proxy .ShortName , proxy .Name :
130+ fallthrough
131+ case random .ShortName , random .Name :
132+ fallthrough
133+ case loop .ShortName , loop .Name :
134+ fallthrough
135+ case sticky .ShortName , sticky .Name :
136+ fallthrough
137+ case notify .ShortName , notify .Name :
138+ fallthrough
139+ case defaultip .ShortName , defaultip .Name :
140+ return "" , handlers .ErrEOF
141+ }
142+
143+ if strings .HasPrefix (label , "b32-" ) {
144+ decoded , err := base32 .StdEncoding .WithPadding (base32 .NoPadding ).DecodeString (strings .ToUpper (label [4 :]))
145+ if err == nil {
146+ label = string (decoded )
147+ }
148+ }
149+ p .cur ++
150+ return label , nil
151+ }
152+
153+ func parseHandler (label string ) handlers.Handler {
154+ if len (label ) == 0 {
96155 return nil
97156 }
98157
99- parts := strings .Split (part , "-" )
100- parseModifiers := func () []limiter.Limiter {
158+ parts := strings .Split (label , "-" )
159+ parseLimiters := func () []limiter.Limiter {
101160 if len (parts ) <= 1 {
102161 return nil
103162 }
@@ -109,7 +168,7 @@ func parsePart(part string) handlers.Handler {
109168
110169 ret , err := limiter .ParseLimiters (opts )
111170 if err != nil {
112- log .Error ("can't parse modifiers " , "part " , part , "err" , err )
171+ log .Error ("can't parse limiter " , "label " , label , "err" , err )
113172 return nil
114173 }
115174
@@ -118,25 +177,25 @@ func parsePart(part string) handlers.Handler {
118177
119178 switch parts [0 ] {
120179 case ipv4 .ShortName , ipv4 .Name :
121- return ipv4 .NewHandler (parseModifiers ()... )
180+ return ipv4 .NewHandler (parseLimiters ()... )
122181 case ipv6 .ShortName , ipv6 .Name :
123- return ipv6 .NewHandler (parseModifiers ()... )
182+ return ipv6 .NewHandler (parseLimiters ()... )
124183 case cname .ShortName , cname .Name :
125- return cname .NewHandler (parseModifiers ()... )
184+ return cname .NewHandler (parseLimiters ()... )
126185 case proxy .ShortName , proxy .Name :
127- return proxy .NewHandler (parseModifiers ()... )
186+ return proxy .NewHandler (parseLimiters ()... )
128187 case random .ShortName , random .Name :
129- return random .NewHandler (parseModifiers ()... )
188+ return random .NewHandler (parseLimiters ()... )
130189 case loop .ShortName , loop .Name :
131- return loop .NewHandler (parseModifiers ()... )
190+ return loop .NewHandler (parseLimiters ()... )
132191 case sticky .ShortName , sticky .Name :
133- return sticky .NewHandler (parseModifiers ()... )
192+ return sticky .NewHandler (parseLimiters ()... )
134193 case notify .ShortName , notify .Name :
135194 return notify .NewHandler ()
136195 case defaultip .ShortName , defaultip .Name :
137- return defaultip .NewHandler (parseModifiers ()... )
196+ return defaultip .NewHandler (parseLimiters ()... )
138197 default :
139- return parseIPHandler (part )
198+ return parseIPHandler (label )
140199 }
141200}
142201
@@ -151,10 +210,3 @@ func parseIPHandler(part string) handlers.Handler {
151210 return nil
152211 }
153212}
154-
155- func reverse (ss []string ) {
156- last := len (ss ) - 1
157- for i := 0 ; i < len (ss )/ 2 ; i ++ {
158- ss [i ], ss [last - i ] = ss [last - i ], ss [i ]
159- }
160- }
0 commit comments