Browse Source

add errExpectedIPNonMatch and return nil if empty response

weaving118 6 years ago
parent
commit
1345185b81
2 changed files with 23 additions and 20 deletions
  1. 12 9
      app/dns/server.go
  2. 11 11
      infra/conf/dns.go

+ 12 - 9
app/dns/server.go

@@ -12,6 +12,7 @@ import (
 	"v2ray.com/core"
 	"v2ray.com/core/app/router"
 	"v2ray.com/core/common"
+	"v2ray.com/core/common/errors"
 	"v2ray.com/core/common/net"
 	"v2ray.com/core/common/session"
 	"v2ray.com/core/common/strmatcher"
@@ -38,6 +39,8 @@ type MultiGeoIPMatcher struct {
 	matchers []*router.GeoIPMatcher
 }
 
+var errExpectedIPNonMatch = errors.New("expected ip not match")
+
 // Match check ip match
 func (c *MultiGeoIPMatcher) Match(ip net.IP) bool {
 	for _, matcher := range c.matchers {
@@ -178,11 +181,6 @@ func (s *Server) IsOwnLink(ctx context.Context) bool {
 
 // Match check dns ip match geoip
 func (s *Server) Match(idx uint32, client Client, domain string, ips []net.IP) ([]net.IP, error) {
-	if len(ips) == 0 {
-		newError("domain ", domain, " has empty response at server ", client.Name(), " idx:", idx).AtDebug().WriteToLog()
-		return nil, context.Canceled
-	}
-
 	matcher, exist := s.ipIndexMap[idx]
 	if exist == false {
 		newError("domain ", domain, " server not in ipIndexMap: ", client.Name(), " idx:", idx, " just return").AtDebug().WriteToLog()
@@ -190,7 +188,7 @@ func (s *Server) Match(idx uint32, client Client, domain string, ips []net.IP) (
 	}
 
 	if matcher.HasMatcher() == false {
-		newError("domain ", domain, "server has not valid matcher: ", client.Name(), " idx:", idx, " just return").AtDebug().WriteToLog()
+		newError("domain ", domain, " server has not valid matcher: ", client.Name(), " idx:", idx, " just return").AtDebug().WriteToLog()
 		return ips, nil
 	}
 
@@ -204,7 +202,7 @@ func (s *Server) Match(idx uint32, client Client, domain string, ips []net.IP) (
 		}
 	}
 	if len(newIps) == 0 {
-		return nil, context.Canceled
+		return nil, errExpectedIPNonMatch
 	}
 	return newIps, nil
 }
@@ -217,8 +215,13 @@ func (s *Server) queryIPTimeout(idx uint32, client Client, domain string, option
 		})
 	}
 	ips, err := client.QueryIP(ctx, domain, option)
-	ips, err = s.Match(idx, client, domain, ips)
 	cancel()
+
+	if err != nil {
+		return ips, err
+	}
+
+	ips, err = s.Match(idx, client, domain, ips)
 	return ips, err
 }
 
@@ -324,7 +327,7 @@ func (s *Server) lookupIPInternal(domain string, option IPOption) ([]net.IP, err
 			newError("failed to lookup ip for domain ", domain, " at server ", client.Name()).Base(err).WriteToLog()
 			lastErr = err
 		}
-		if err != context.Canceled && err != context.DeadlineExceeded {
+		if err != context.Canceled && err != context.DeadlineExceeded && err != errExpectedIPNonMatch {
 			return nil, err
 		}
 	}

+ 11 - 11
infra/conf/dns.go

@@ -11,10 +11,10 @@ import (
 )
 
 type NameServerConfig struct {
-	Address *Address
-	Port    uint16
-	Domains []string
-	IP      StringList
+	Address   *Address
+	Port      uint16
+	Domains   []string
+	ExpectIPs StringList
 }
 
 func (c *NameServerConfig) UnmarshalJSON(data []byte) error {
@@ -26,16 +26,16 @@ func (c *NameServerConfig) UnmarshalJSON(data []byte) error {
 	}
 
 	var advanced struct {
-		Address *Address   `json:"address"`
-		Port    uint16     `json:"port"`
-		Domains []string   `json:"domains"`
-		IP      StringList `json:"ip"`
+		Address   *Address   `json:"address"`
+		Port      uint16     `json:"port"`
+		Domains   []string   `json:"domains"`
+		ExpectIPs StringList `json:"expectIps"`
 	}
 	if err := json.Unmarshal(data, &advanced); err == nil {
 		c.Address = advanced.Address
 		c.Port = advanced.Port
 		c.Domains = advanced.Domains
-		c.IP = advanced.IP
+		c.ExpectIPs = advanced.ExpectIPs
 		return nil
 	}
 
@@ -78,9 +78,9 @@ func (c *NameServerConfig) Build() (*dns.NameServer, error) {
 		}
 	}
 
-	geoipList, err := toCidrList(c.IP)
+	geoipList, err := toCidrList(c.ExpectIPs)
 	if err != nil {
-		return nil, newError("invalid ip rule: ", c.IP).Base(err)
+		return nil, newError("invalid ip rule: ", c.ExpectIPs).Base(err)
 	}
 
 	return &dns.NameServer{