mirror of
https://github.com/TeaOSLab/EdgeNode.git
synced 2025-11-08 19:40:25 +08:00
优化WAF中前缀和后缀相关操作符性能
This commit is contained in:
@@ -510,13 +510,27 @@ func (this *Rule) Test(value any) bool {
|
|||||||
}
|
}
|
||||||
case RuleOperatorPrefix:
|
case RuleOperatorPrefix:
|
||||||
if this.IsCaseInsensitive {
|
if this.IsCaseInsensitive {
|
||||||
return strings.HasPrefix(strings.ToLower(this.stringifyValue(value)), strings.ToLower(this.Value))
|
var s = this.stringifyValue(value)
|
||||||
|
var sl = len(s)
|
||||||
|
var vl = len(this.Value)
|
||||||
|
if sl < vl {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
s = s[:vl]
|
||||||
|
return strings.HasPrefix(strings.ToLower(s), strings.ToLower(this.Value))
|
||||||
} else {
|
} else {
|
||||||
return strings.HasPrefix(this.stringifyValue(value), this.Value)
|
return strings.HasPrefix(this.stringifyValue(value), this.Value)
|
||||||
}
|
}
|
||||||
case RuleOperatorSuffix:
|
case RuleOperatorSuffix:
|
||||||
if this.IsCaseInsensitive {
|
if this.IsCaseInsensitive {
|
||||||
return strings.HasSuffix(strings.ToLower(this.stringifyValue(value)), strings.ToLower(this.Value))
|
var s = this.stringifyValue(value)
|
||||||
|
var sl = len(s)
|
||||||
|
var vl = len(this.Value)
|
||||||
|
if sl < vl {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
s = s[sl-vl:]
|
||||||
|
return strings.HasSuffix(strings.ToLower(s), strings.ToLower(this.Value))
|
||||||
} else {
|
} else {
|
||||||
return strings.HasSuffix(this.stringifyValue(value), this.Value)
|
return strings.HasSuffix(this.stringifyValue(value), this.Value)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,10 +49,10 @@ func TestRule_Init_Composite(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestRule_Test(t *testing.T) {
|
func TestRule_Test(t *testing.T) {
|
||||||
a := assert.NewAssertion(t)
|
var a = assert.NewAssertion(t)
|
||||||
|
|
||||||
{
|
{
|
||||||
rule := NewRule()
|
var rule = NewRule()
|
||||||
rule.Operator = RuleOperatorGt
|
rule.Operator = RuleOperatorGt
|
||||||
rule.Value = "123"
|
rule.Value = "123"
|
||||||
err := rule.Init()
|
err := rule.Init()
|
||||||
@@ -66,7 +66,7 @@ func TestRule_Test(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
rule := NewRule()
|
var rule = NewRule()
|
||||||
rule.Operator = RuleOperatorGte
|
rule.Operator = RuleOperatorGte
|
||||||
rule.Value = "123"
|
rule.Value = "123"
|
||||||
err := rule.Init()
|
err := rule.Init()
|
||||||
@@ -79,7 +79,7 @@ func TestRule_Test(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
rule := NewRule()
|
var rule = NewRule()
|
||||||
rule.Operator = RuleOperatorLt
|
rule.Operator = RuleOperatorLt
|
||||||
rule.Value = "123"
|
rule.Value = "123"
|
||||||
err := rule.Init()
|
err := rule.Init()
|
||||||
@@ -92,7 +92,7 @@ func TestRule_Test(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
rule := NewRule()
|
var rule = NewRule()
|
||||||
rule.Operator = RuleOperatorLte
|
rule.Operator = RuleOperatorLte
|
||||||
rule.Value = "123"
|
rule.Value = "123"
|
||||||
err := rule.Init()
|
err := rule.Init()
|
||||||
@@ -105,7 +105,7 @@ func TestRule_Test(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
rule := NewRule()
|
var rule = NewRule()
|
||||||
rule.Operator = RuleOperatorEq
|
rule.Operator = RuleOperatorEq
|
||||||
rule.Value = "123"
|
rule.Value = "123"
|
||||||
err := rule.Init()
|
err := rule.Init()
|
||||||
@@ -118,7 +118,7 @@ func TestRule_Test(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
rule := NewRule()
|
var rule = NewRule()
|
||||||
rule.Operator = RuleOperatorNeq
|
rule.Operator = RuleOperatorNeq
|
||||||
rule.Value = "123"
|
rule.Value = "123"
|
||||||
err := rule.Init()
|
err := rule.Init()
|
||||||
@@ -131,7 +131,7 @@ func TestRule_Test(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
rule := NewRule()
|
var rule = NewRule()
|
||||||
rule.Operator = RuleOperatorEqString
|
rule.Operator = RuleOperatorEqString
|
||||||
rule.Value = "123"
|
rule.Value = "123"
|
||||||
err := rule.Init()
|
err := rule.Init()
|
||||||
@@ -144,7 +144,7 @@ func TestRule_Test(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
rule := NewRule()
|
var rule = NewRule()
|
||||||
rule.Operator = RuleOperatorEqString
|
rule.Operator = RuleOperatorEqString
|
||||||
rule.Value = "abc"
|
rule.Value = "abc"
|
||||||
err := rule.Init()
|
err := rule.Init()
|
||||||
@@ -156,7 +156,7 @@ func TestRule_Test(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
rule := NewRule()
|
var rule = NewRule()
|
||||||
rule.Operator = RuleOperatorEqString
|
rule.Operator = RuleOperatorEqString
|
||||||
rule.IsCaseInsensitive = true
|
rule.IsCaseInsensitive = true
|
||||||
rule.Value = "abc"
|
rule.Value = "abc"
|
||||||
@@ -169,7 +169,7 @@ func TestRule_Test(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
rule := NewRule()
|
var rule = NewRule()
|
||||||
rule.Operator = RuleOperatorNeqString
|
rule.Operator = RuleOperatorNeqString
|
||||||
rule.Value = "abc"
|
rule.Value = "abc"
|
||||||
err := rule.Init()
|
err := rule.Init()
|
||||||
@@ -182,7 +182,7 @@ func TestRule_Test(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
rule := NewRule()
|
var rule = NewRule()
|
||||||
rule.Operator = RuleOperatorNeqString
|
rule.Operator = RuleOperatorNeqString
|
||||||
rule.IsCaseInsensitive = true
|
rule.IsCaseInsensitive = true
|
||||||
rule.Value = "abc"
|
rule.Value = "abc"
|
||||||
@@ -194,7 +194,7 @@ func TestRule_Test(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
rule := NewRule()
|
var rule = NewRule()
|
||||||
rule.Operator = RuleOperatorMatch
|
rule.Operator = RuleOperatorMatch
|
||||||
rule.Value = "^\\d+"
|
rule.Value = "^\\d+"
|
||||||
err := rule.Init()
|
err := rule.Init()
|
||||||
@@ -230,7 +230,7 @@ func TestRule_Test(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
rule := NewRule()
|
var rule = NewRule()
|
||||||
rule.Operator = RuleOperatorMatch
|
rule.Operator = RuleOperatorMatch
|
||||||
rule.Value = "abc"
|
rule.Value = "abc"
|
||||||
rule.IsCaseInsensitive = true
|
rule.IsCaseInsensitive = true
|
||||||
@@ -242,7 +242,7 @@ func TestRule_Test(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
rule := NewRule()
|
var rule = NewRule()
|
||||||
rule.Operator = RuleOperatorMatch
|
rule.Operator = RuleOperatorMatch
|
||||||
rule.Value = "^\\d+"
|
rule.Value = "^\\d+"
|
||||||
err := rule.Init()
|
err := rule.Init()
|
||||||
@@ -254,7 +254,7 @@ func TestRule_Test(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
rule := NewRule()
|
var rule = NewRule()
|
||||||
rule.Operator = RuleOperatorNotMatch
|
rule.Operator = RuleOperatorNotMatch
|
||||||
rule.Value = "\\d+"
|
rule.Value = "\\d+"
|
||||||
err := rule.Init()
|
err := rule.Init()
|
||||||
@@ -266,7 +266,7 @@ func TestRule_Test(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
rule := NewRule()
|
var rule = NewRule()
|
||||||
rule.Operator = RuleOperatorNotMatch
|
rule.Operator = RuleOperatorNotMatch
|
||||||
rule.Value = "abc"
|
rule.Value = "abc"
|
||||||
rule.IsCaseInsensitive = true
|
rule.IsCaseInsensitive = true
|
||||||
@@ -278,7 +278,7 @@ func TestRule_Test(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
rule := NewRule()
|
var rule = NewRule()
|
||||||
rule.Operator = RuleOperatorNotMatch
|
rule.Operator = RuleOperatorNotMatch
|
||||||
rule.Value = "^\\d+"
|
rule.Value = "^\\d+"
|
||||||
err := rule.Init()
|
err := rule.Init()
|
||||||
@@ -303,7 +303,7 @@ func TestRule_Test(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
rule := NewRule()
|
var rule = NewRule()
|
||||||
rule.Operator = RuleOperatorMatch
|
rule.Operator = RuleOperatorMatch
|
||||||
rule.Value = "^(?i)[a-z]+$"
|
rule.Value = "^(?i)[a-z]+$"
|
||||||
err := rule.Init()
|
err := rule.Init()
|
||||||
@@ -314,7 +314,7 @@ func TestRule_Test(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
rule := NewRule()
|
var rule = NewRule()
|
||||||
rule.Operator = RuleOperatorContains
|
rule.Operator = RuleOperatorContains
|
||||||
rule.Value = "Hello"
|
rule.Value = "Hello"
|
||||||
err := rule.Init()
|
err := rule.Init()
|
||||||
@@ -325,7 +325,7 @@ func TestRule_Test(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
rule := NewRule()
|
var rule = NewRule()
|
||||||
rule.Operator = RuleOperatorContains
|
rule.Operator = RuleOperatorContains
|
||||||
rule.Value = "hello"
|
rule.Value = "hello"
|
||||||
rule.IsCaseInsensitive = true
|
rule.IsCaseInsensitive = true
|
||||||
@@ -337,7 +337,7 @@ func TestRule_Test(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
rule := NewRule()
|
var rule = NewRule()
|
||||||
rule.Operator = RuleOperatorContains
|
rule.Operator = RuleOperatorContains
|
||||||
rule.Value = "Hello"
|
rule.Value = "Hello"
|
||||||
err := rule.Init()
|
err := rule.Init()
|
||||||
@@ -354,7 +354,7 @@ func TestRule_Test(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
rule := NewRule()
|
var rule = NewRule()
|
||||||
rule.Operator = RuleOperatorNotContains
|
rule.Operator = RuleOperatorNotContains
|
||||||
rule.Value = "Hello"
|
rule.Value = "Hello"
|
||||||
err := rule.Init()
|
err := rule.Init()
|
||||||
@@ -366,7 +366,7 @@ func TestRule_Test(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
rule := NewRule()
|
var rule = NewRule()
|
||||||
rule.Operator = RuleOperatorNotContains
|
rule.Operator = RuleOperatorNotContains
|
||||||
rule.Value = "hello"
|
rule.Value = "hello"
|
||||||
rule.IsCaseInsensitive = true
|
rule.IsCaseInsensitive = true
|
||||||
@@ -379,7 +379,7 @@ func TestRule_Test(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
rule := NewRule()
|
var rule = NewRule()
|
||||||
rule.Operator = RuleOperatorPrefix
|
rule.Operator = RuleOperatorPrefix
|
||||||
rule.Value = "Hello"
|
rule.Value = "Hello"
|
||||||
err := rule.Init()
|
err := rule.Init()
|
||||||
@@ -387,11 +387,12 @@ func TestRule_Test(t *testing.T) {
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
a.IsTrue(rule.Test("Hello, World"))
|
a.IsTrue(rule.Test("Hello, World"))
|
||||||
|
a.IsFalse(rule.Test("hello"))
|
||||||
a.IsFalse(rule.Test("World, Hello"))
|
a.IsFalse(rule.Test("World, Hello"))
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
rule := NewRule()
|
var rule = NewRule()
|
||||||
rule.Operator = RuleOperatorPrefix
|
rule.Operator = RuleOperatorPrefix
|
||||||
rule.Value = "hello"
|
rule.Value = "hello"
|
||||||
rule.IsCaseInsensitive = true
|
rule.IsCaseInsensitive = true
|
||||||
@@ -400,11 +401,13 @@ func TestRule_Test(t *testing.T) {
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
a.IsTrue(rule.Test("Hello, World"))
|
a.IsTrue(rule.Test("Hello, World"))
|
||||||
|
a.IsTrue(rule.Test("hello, World"))
|
||||||
|
a.IsFalse(rule.Test("hell"))
|
||||||
a.IsFalse(rule.Test("World, Hello"))
|
a.IsFalse(rule.Test("World, Hello"))
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
rule := NewRule()
|
var rule = NewRule()
|
||||||
rule.Operator = RuleOperatorSuffix
|
rule.Operator = RuleOperatorSuffix
|
||||||
rule.Value = "Hello"
|
rule.Value = "Hello"
|
||||||
err := rule.Init()
|
err := rule.Init()
|
||||||
@@ -416,7 +419,7 @@ func TestRule_Test(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
rule := NewRule()
|
var rule = NewRule()
|
||||||
rule.Operator = RuleOperatorSuffix
|
rule.Operator = RuleOperatorSuffix
|
||||||
rule.Value = "hello"
|
rule.Value = "hello"
|
||||||
rule.IsCaseInsensitive = true
|
rule.IsCaseInsensitive = true
|
||||||
@@ -425,11 +428,13 @@ func TestRule_Test(t *testing.T) {
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
a.IsFalse(rule.Test("Hello, World"))
|
a.IsFalse(rule.Test("Hello, World"))
|
||||||
|
a.IsTrue(rule.Test("Hello"))
|
||||||
|
a.IsFalse(rule.Test("llo"))
|
||||||
a.IsTrue(rule.Test("World, Hello"))
|
a.IsTrue(rule.Test("World, Hello"))
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
rule := NewRule()
|
var rule = NewRule()
|
||||||
rule.Operator = RuleOperatorHasKey
|
rule.Operator = RuleOperatorHasKey
|
||||||
rule.Value = "Hello"
|
rule.Value = "Hello"
|
||||||
err := rule.Init()
|
err := rule.Init()
|
||||||
@@ -446,7 +451,7 @@ func TestRule_Test(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
rule := NewRule()
|
var rule = NewRule()
|
||||||
rule.Operator = RuleOperatorHasKey
|
rule.Operator = RuleOperatorHasKey
|
||||||
rule.Value = "hello"
|
rule.Value = "hello"
|
||||||
rule.IsCaseInsensitive = true
|
rule.IsCaseInsensitive = true
|
||||||
@@ -464,7 +469,7 @@ func TestRule_Test(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
rule := NewRule()
|
var rule = NewRule()
|
||||||
rule.Operator = RuleOperatorHasKey
|
rule.Operator = RuleOperatorHasKey
|
||||||
rule.Value = "3"
|
rule.Value = "3"
|
||||||
err := rule.Init()
|
err := rule.Init()
|
||||||
@@ -477,6 +482,32 @@ func TestRule_Test(t *testing.T) {
|
|||||||
}))
|
}))
|
||||||
a.IsTrue(rule.Test([]int{1, 2, 3, 4}))
|
a.IsTrue(rule.Test([]int{1, 2, 3, 4}))
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
var rule = NewRule()
|
||||||
|
rule.Operator = RuleOperatorContainsAnyWord
|
||||||
|
rule.Value = "How\nare\nyou"
|
||||||
|
rule.IsCaseInsensitive = true
|
||||||
|
err := rule.Init()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
a.IsTrue(rule.Test("how"))
|
||||||
|
a.IsTrue(rule.Test("How doing"))
|
||||||
|
a.IsFalse(rule.Test("doing"))
|
||||||
|
}
|
||||||
|
{
|
||||||
|
var rule = NewRule()
|
||||||
|
rule.Operator = RuleOperatorContainsAllWords
|
||||||
|
rule.Value = "How\nare\nyou"
|
||||||
|
rule.IsCaseInsensitive = true
|
||||||
|
err := rule.Init()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
a.IsTrue(rule.Test("how are you"))
|
||||||
|
a.IsTrue(rule.Test("How are you doing"))
|
||||||
|
a.IsFalse(rule.Test("How are dare"))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRule_MatchStar(t *testing.T) {
|
func TestRule_MatchStar(t *testing.T) {
|
||||||
|
|||||||
Reference in New Issue
Block a user