feat(routing): add Network matcher for per-protocol node selection
Add Network() matcher to the routing DSL so nodes can be selected based on
connection network type (tcp/udp). Uses prefix matching so Network("tcp")
matches tcp, tcp4, tcp6 and Network("udp") matches udp, udp4, udp6.
- core/routing: add Network field to Request struct (core v0.4.3)
- x/routing/matcher: add network() matcher registered as "Network"
- x/hop: pass options.Network to routing.Request in Select()
Fixes go-gost/gost#703
This commit is contained in:
@@ -144,6 +144,7 @@ func (m *matchersTree) addRule(rule *rules.Tree, funcs matcherFuncs) error {
|
||||
|
||||
var httpFuncs = map[string]func(*matchersTree, ...string) error{
|
||||
"ClientIP": expectNParameters(clientIP, 1),
|
||||
"Network": expectNParameters(network, 1),
|
||||
"Proto": expectNParameters(proto, 1),
|
||||
"Host": expectNParameters(host, 1),
|
||||
"HostRegexp": expectNParameters(hostRegexp, 1),
|
||||
@@ -206,6 +207,18 @@ func proto(tree *matchersTree, protos ...string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func network(tree *matchersTree, networks ...string) error {
|
||||
network := strings.ToLower(networks[0])
|
||||
|
||||
tree.matcher = func(req *routing.Request) bool {
|
||||
// Use prefix match so Network("tcp") matches "tcp", "tcp4", "tcp6"
|
||||
// and Network("udp") matches "udp", "udp4", "udp6".
|
||||
return strings.HasPrefix(req.Network, network)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func method(tree *matchersTree, methods ...string) error {
|
||||
method := strings.ToUpper(methods[0])
|
||||
|
||||
|
||||
Reference in New Issue
Block a user