@@ -5,6 +5,7 @@ package eskip
5
5
import (
6
6
"errors"
7
7
"fmt"
8
+ "maps"
8
9
"math/rand"
9
10
"net/url"
10
11
"regexp"
@@ -209,8 +210,31 @@ const (
209
210
LoopBackend
210
211
DynamicBackend
211
212
LBBackend
213
+ ForwardBackend
212
214
)
213
215
216
+ type fwdBackend struct {
217
+ target string
218
+ }
219
+
220
+ func ForwardPreProcessor (s string ) * fwdBackend {
221
+ return & fwdBackend {
222
+ target : s ,
223
+ }
224
+ }
225
+
226
+ func (fb * fwdBackend ) Do (routes []* Route ) []* Route {
227
+ for i := range routes {
228
+ switch routes [i ].BackendType {
229
+ case ForwardBackend :
230
+ routes [i ].Backend = fb .target
231
+ routes [i ].BackendType = NetworkBackend
232
+ }
233
+ }
234
+
235
+ return routes
236
+ }
237
+
214
238
var errMixedProtocols = errors .New ("loadbalancer endpoints cannot have mixed protocols" )
215
239
216
240
// Route definition used during the parser processes the raw routing
@@ -223,6 +247,7 @@ type parsedRoute struct {
223
247
loopback bool
224
248
dynamic bool
225
249
lbBackend bool
250
+ forward bool
226
251
backend string
227
252
lbAlgorithm string
228
253
lbEndpoints []string
@@ -372,9 +397,7 @@ func (r *Route) Copy() *Route {
372
397
373
398
if len (r .Headers ) > 0 {
374
399
c .Headers = make (map [string ]string )
375
- for k , v := range r .Headers {
376
- c .Headers [k ] = v
377
- }
400
+ maps .Copy (c .Headers , r .Headers )
378
401
}
379
402
380
403
if len (r .HeaderRegexps ) > 0 {
@@ -420,6 +443,8 @@ func BackendTypeFromString(s string) (BackendType, error) {
420
443
return DynamicBackend , nil
421
444
case "lb" :
422
445
return LBBackend , nil
446
+ case "forward" :
447
+ return ForwardBackend , nil
423
448
default :
424
449
return - 1 , fmt .Errorf ("unsupported backend type: %s" , s )
425
450
}
@@ -438,6 +463,8 @@ func (t BackendType) String() string {
438
463
return "dynamic"
439
464
case LBBackend :
440
465
return "lb"
466
+ case ForwardBackend :
467
+ return "forward"
441
468
default :
442
469
return "unknown"
443
470
}
@@ -578,6 +605,8 @@ func newRouteDefinition(r *parsedRoute) (*Route, error) {
578
605
rd .BackendType = DynamicBackend
579
606
case r .lbBackend :
580
607
rd .BackendType = LBBackend
608
+ case r .forward :
609
+ rd .BackendType = ForwardBackend
581
610
default :
582
611
rd .BackendType = NetworkBackend
583
612
}
@@ -630,7 +659,7 @@ func parse(start int, code string) ([]*parsedRoute, []*Predicate, []*Filter, err
630
659
return lexer .routes , lexer .predicates , lexer .filters , lexer .err
631
660
}
632
661
633
- // Parses a route expression or a routing document to a set of route definitions.
662
+ // Parse a route expression or a routing document to a set of route definitions.
634
663
func Parse (code string ) ([]* Route , error ) {
635
664
parsedRoutes , err := parseDocument (code )
636
665
if err != nil {
@@ -680,7 +709,7 @@ func MustParseFilters(s string) []*Filter {
680
709
return p
681
710
}
682
711
683
- // Parses a filter chain into a list of parsed filter definitions.
712
+ // ParseFilters parses a filter chain into a list of parsed filter definitions.
684
713
func ParseFilters (f string ) ([]* Filter , error ) {
685
714
f = strings .TrimSpace (f )
686
715
if f == "" {
@@ -726,7 +755,7 @@ const (
726
755
alphabet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
727
756
)
728
757
729
- // generate weak random id for a route if
758
+ // GenerateIfNeeded generates a weak random id for a route if
730
759
// it doesn't have one.
731
760
//
732
761
// Deprecated: do not use, generate valid route id that matches [a-zA-Z_] yourself.
0 commit comments