From 6055efa537ca791b604d8ff5071630bec1f0de03 Mon Sep 17 00:00:00 2001 From: nadoo <287492+nadoo@users.noreply.github.com> Date: Wed, 23 Aug 2017 21:11:08 +0800 Subject: [PATCH] rule: parse cidr once --- rule.go | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/rule.go b/rule.go index 10802b7..4ec0320 100644 --- a/rule.go +++ b/rule.go @@ -44,9 +44,12 @@ func NewRuleDialer(rules []*RuleConf, gDialer Dialer) *RuleDialer { rd.ipMap.Store(ip, sd) } - for _, cidr := range r.CIDR { - rd.cidrMap.Store(cidr, sd) + for _, s := range r.CIDR { + if _, cidr, err := net.ParseCIDR(s); err == nil { + rd.cidrMap.Store(cidr, sd) + } } + } return rd @@ -73,13 +76,11 @@ func (p *RuleDialer) NextDialer(dstAddr string) Dialer { var ret Dialer // check cidr - // TODO: do not parse cidr every time p.cidrMap.Range(func(key, value interface{}) bool { - if _, net, err := net.ParseCIDR(key.(string)); err == nil { - if net.Contains(ip) { - ret = value.(Dialer) - return false - } + cidr := key.(*net.IPNet) + if cidr.Contains(ip) { + ret = value.(Dialer) + return false } return true