1
0
mirror of https://github.com/v2fly/v2ray-core.git synced 2025-01-02 23:47:07 -05:00

AnyCondition

This commit is contained in:
v2ray 2016-01-24 14:40:46 +01:00
parent ee72984f78
commit 4f5743604a
5 changed files with 68 additions and 22 deletions

View File

@ -5,21 +5,8 @@ package rules
import ( import (
"encoding/json" "encoding/json"
"github.com/v2ray/v2ray-core/common/log" "github.com/v2ray/v2ray-core/common/log"
v2net "github.com/v2ray/v2ray-core/common/net"
) )
type ChinaSitesCondition struct {
}
func (this *ChinaSitesCondition) Apply(dest v2net.Destination) bool {
for _, cond := range chinaSitesConds {
if cond.Apply(dest) {
return true
}
}
return false
}
func parseChinaSitesRule(data []byte) (*Rule, error) { func parseChinaSitesRule(data []byte) (*Rule, error) {
rawRule := new(JsonRule) rawRule := new(JsonRule)
err := json.Unmarshal(data, rawRule) err := json.Unmarshal(data, rawRule)
@ -29,7 +16,7 @@ func parseChinaSitesRule(data []byte) (*Rule, error) {
} }
return &Rule{ return &Rule{
Tag: rawRule.OutboundTag, Tag: rawRule.OutboundTag,
Condition: &ChinaSitesCondition{}, Condition: ChinaSitesConds,
}, nil }, nil
} }
@ -48,7 +35,7 @@ const (
) )
var ( var (
chinaSitesConds []Condition ChinaSitesConds Condition
) )
func init() { func init() {
@ -360,12 +347,15 @@ func init() {
anySubDomain + "zhubajie" + dotCom, anySubDomain + "zhubajie" + dotCom,
} }
chinaSitesConds = make([]Condition, len(regexpDomains)) conds := make([]Condition, len(regexpDomains))
for idx, pattern := range regexpDomains { for idx, pattern := range regexpDomains {
matcher, err := NewRegexpDomainMatcher(pattern) matcher, err := NewRegexpDomainMatcher(pattern)
if err != nil { if err != nil {
panic(err) panic(err)
} }
chinaSitesConds[idx] = matcher conds[idx] = matcher
} }
anyConds := AnyCondition(conds)
ChinaSitesConds = &anyConds
} }

View File

@ -17,7 +17,7 @@ func makeDomainDestination(domain string) v2net.Destination {
func TestChinaSites(t *testing.T) { func TestChinaSites(t *testing.T) {
v2testing.Current(t) v2testing.Current(t)
rule := new(ChinaSitesCondition) rule := ChinaSitesConds
assert.Bool(rule.Apply(makeDomainDestination("v.qq.com"))).IsTrue() assert.Bool(rule.Apply(makeDomainDestination("v.qq.com"))).IsTrue()
assert.Bool(rule.Apply(makeDomainDestination("www.163.com"))).IsTrue() assert.Bool(rule.Apply(makeDomainDestination("www.163.com"))).IsTrue()
assert.Bool(rule.Apply(makeDomainDestination("ngacn.cc"))).IsTrue() assert.Bool(rule.Apply(makeDomainDestination("ngacn.cc"))).IsTrue()

View File

@ -37,6 +37,31 @@ func (this *ConditionChan) Len() int {
return len(*this) return len(*this)
} }
type AnyCondition []Condition
func NewAnyCondition() *AnyCondition {
var anyCond AnyCondition = make([]Condition, 0, 8)
return &anyCond
}
func (this *AnyCondition) Add(cond Condition) *AnyCondition {
*this = append(*this, cond)
return this
}
func (this *AnyCondition) Apply(dest v2net.Destination) bool {
for _, cond := range *this {
if cond.Apply(dest) {
return true
}
}
return false
}
func (this *AnyCondition) Len() int {
return len(*this)
}
type PlainDomainMatcher struct { type PlainDomainMatcher struct {
pattern serial.StringLiteral pattern serial.StringLiteral
} }

View File

@ -34,6 +34,7 @@ func parseFieldRule(msg json.RawMessage) (*Rule, error) {
conds := NewConditionChan() conds := NewConditionChan()
if rawFieldRule.Domain != nil && rawFieldRule.Domain.Len() > 0 { if rawFieldRule.Domain != nil && rawFieldRule.Domain.Len() > 0 {
anyCond := NewAnyCondition()
for _, rawDomain := range *(rawFieldRule.Domain) { for _, rawDomain := range *(rawFieldRule.Domain) {
var matcher Condition var matcher Condition
if strings.HasPrefix(rawDomain.String(), "regexp:") { if strings.HasPrefix(rawDomain.String(), "regexp:") {
@ -45,19 +46,22 @@ func parseFieldRule(msg json.RawMessage) (*Rule, error) {
} else { } else {
matcher = NewPlainDomainMatcher(rawDomain.String()) matcher = NewPlainDomainMatcher(rawDomain.String())
} }
conds.Add(matcher) anyCond.Add(matcher)
} }
conds.Add(anyCond)
} }
if rawFieldRule.IP != nil && rawFieldRule.IP.Len() > 0 { if rawFieldRule.IP != nil && rawFieldRule.IP.Len() > 0 {
anyCond := NewAnyCondition()
for _, ipStr := range *(rawFieldRule.IP) { for _, ipStr := range *(rawFieldRule.IP) {
cidrMatcher, err := NewCIDRMatcher(ipStr.String()) cidrMatcher, err := NewCIDRMatcher(ipStr.String())
if err != nil { if err != nil {
log.Error("Router: Invalid IP range in router rule: ", err) log.Error("Router: Invalid IP range in router rule: ", err)
return nil, err return nil, err
} }
conds.Add(cidrMatcher) anyCond.Add(cidrMatcher)
} }
conds.Add(anyCond)
} }
if rawFieldRule.Port != nil { if rawFieldRule.Port != nil {
conds.Add(NewPortMatcher(*rawFieldRule.Port)) conds.Add(NewPortMatcher(*rawFieldRule.Port))
@ -74,7 +78,7 @@ func parseFieldRule(msg json.RawMessage) (*Rule, error) {
}, nil }, nil
} }
func parseRule(msg json.RawMessage) *Rule { func ParseRule(msg json.RawMessage) *Rule {
rawRule := new(JsonRule) rawRule := new(JsonRule)
err := json.Unmarshal(msg, rawRule) err := json.Unmarshal(msg, rawRule)
if err != nil { if err != nil {
@ -121,7 +125,7 @@ func init() {
} }
config := NewRouterRuleConfig() config := NewRouterRuleConfig()
for _, rawRule := range jsonConfig.RuleList { for _, rawRule := range jsonConfig.RuleList {
rule := parseRule(rawRule) rule := ParseRule(rawRule)
config.Add(rule) config.Add(rule)
} }
return config, nil return config, nil

View File

@ -0,0 +1,27 @@
// +build json
package rules_test
import (
"testing"
. "github.com/v2ray/v2ray-core/app/router/rules"
v2net "github.com/v2ray/v2ray-core/common/net"
v2testing "github.com/v2ray/v2ray-core/testing"
"github.com/v2ray/v2ray-core/testing/assert"
)
func TestFieldRule(t *testing.T) {
v2testing.Current(t)
rule := ParseRule([]byte(`{
"type": "field",
"domain": [
"ooxx.com",
"oxox.com"
],
"outboundTag": "direct"
}`))
assert.Pointer(rule).IsNotNil()
assert.Bool(rule.Apply(v2net.TCPDestination(v2net.DomainAddress("www.ooxx.com"), 80))).IsTrue()
}