|  | @@ -8,39 +8,9 @@ import (
 | 
	
		
			
				|  |  |  	"strings"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	v2net "github.com/v2ray/v2ray-core/common/net"
 | 
	
		
			
				|  |  | +	"github.com/v2ray/v2ray-core/common/serial"
 | 
	
		
			
				|  |  |  )
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -type StringList []string
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -func NewStringList(str ...string) *StringList {
 | 
	
		
			
				|  |  | -	list := StringList(str)
 | 
	
		
			
				|  |  | -	return &list
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -func (this *StringList) UnmarshalJSON(data []byte) error {
 | 
	
		
			
				|  |  | -	var strList []string
 | 
	
		
			
				|  |  | -	err := json.Unmarshal(data, &strList)
 | 
	
		
			
				|  |  | -	if err == nil {
 | 
	
		
			
				|  |  | -		*this = make([]string, len(strList))
 | 
	
		
			
				|  |  | -		copy(*this, strList)
 | 
	
		
			
				|  |  | -		return nil
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	var str string
 | 
	
		
			
				|  |  | -	err = json.Unmarshal(data, &str)
 | 
	
		
			
				|  |  | -	if err == nil {
 | 
	
		
			
				|  |  | -		*this = make([]string, 0, 1)
 | 
	
		
			
				|  |  | -		*this = append(*this, str)
 | 
	
		
			
				|  |  | -		return nil
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	return errors.New("Failed to unmarshal string list: " + string(data))
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -func (this *StringList) Len() int {
 | 
	
		
			
				|  |  | -	return len([]string(*this))
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  type DomainMatcher interface {
 | 
	
		
			
				|  |  |  	Match(domain string) bool
 | 
	
		
			
				|  |  |  }
 | 
	
	
		
			
				|  | @@ -138,10 +108,10 @@ func (this *FieldRule) Apply(dest v2net.Destination) bool {
 | 
	
		
			
				|  |  |  func (this *FieldRule) UnmarshalJSON(data []byte) error {
 | 
	
		
			
				|  |  |  	type RawFieldRule struct {
 | 
	
		
			
				|  |  |  		Rule
 | 
	
		
			
				|  |  | -		Domain  *StringList        `json:"domain"`
 | 
	
		
			
				|  |  | -		IP      *StringList        `json:"ip"`
 | 
	
		
			
				|  |  | -		Port    *v2net.PortRange   `json:"port"`
 | 
	
		
			
				|  |  | -		Network *v2net.NetworkList `json:"network"`
 | 
	
		
			
				|  |  | +		Domain  *serial.StringLiteralList `json:"domain"`
 | 
	
		
			
				|  |  | +		IP      *serial.StringLiteralList `json:"ip"`
 | 
	
		
			
				|  |  | +		Port    *v2net.PortRange          `json:"port"`
 | 
	
		
			
				|  |  | +		Network *v2net.NetworkList        `json:"network"`
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  	rawFieldRule := RawFieldRule{}
 | 
	
		
			
				|  |  |  	err := json.Unmarshal(data, &rawFieldRule)
 | 
	
	
		
			
				|  | @@ -156,14 +126,14 @@ func (this *FieldRule) UnmarshalJSON(data []byte) error {
 | 
	
		
			
				|  |  |  		this.Domain = make([]DomainMatcher, rawFieldRule.Domain.Len())
 | 
	
		
			
				|  |  |  		for idx, rawDomain := range *(rawFieldRule.Domain) {
 | 
	
		
			
				|  |  |  			var matcher DomainMatcher
 | 
	
		
			
				|  |  | -			if strings.HasPrefix(rawDomain, "regexp:") {
 | 
	
		
			
				|  |  | -				rawMatcher, err := NewRegexpDomainMatcher(rawDomain[7:])
 | 
	
		
			
				|  |  | +			if strings.HasPrefix(rawDomain.String(), "regexp:") {
 | 
	
		
			
				|  |  | +				rawMatcher, err := NewRegexpDomainMatcher(rawDomain.String()[7:])
 | 
	
		
			
				|  |  |  				if err != nil {
 | 
	
		
			
				|  |  |  					return err
 | 
	
		
			
				|  |  |  				}
 | 
	
		
			
				|  |  |  				matcher = rawMatcher
 | 
	
		
			
				|  |  |  			} else {
 | 
	
		
			
				|  |  | -				matcher = NewPlainDomainMatcher(rawDomain)
 | 
	
		
			
				|  |  | +				matcher = NewPlainDomainMatcher(rawDomain.String())
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  |  			this.Domain[idx] = matcher
 | 
	
		
			
				|  |  |  		}
 | 
	
	
		
			
				|  | @@ -173,7 +143,7 @@ func (this *FieldRule) UnmarshalJSON(data []byte) error {
 | 
	
		
			
				|  |  |  	if rawFieldRule.IP != nil && rawFieldRule.IP.Len() > 0 {
 | 
	
		
			
				|  |  |  		this.IP = make([]*net.IPNet, 0, rawFieldRule.IP.Len())
 | 
	
		
			
				|  |  |  		for _, ipStr := range *(rawFieldRule.IP) {
 | 
	
		
			
				|  |  | -			_, ipNet, err := net.ParseCIDR(ipStr)
 | 
	
		
			
				|  |  | +			_, ipNet, err := net.ParseCIDR(ipStr.String())
 | 
	
		
			
				|  |  |  			if err != nil {
 | 
	
		
			
				|  |  |  				return errors.New("Invalid IP range in router rule: " + err.Error())
 | 
	
		
			
				|  |  |  			}
 |