package waf import ( "bytes" "github.com/iwind/TeaGo/assert" "github.com/iwind/TeaGo/lists" "github.com/iwind/TeaGo/logs" "mime/multipart" "net/http" "net/url" "strings" "testing" "time" ) func Test_Template(t *testing.T) { a := assert.NewAssertion(t) template := Template() err := template.Init() if err != nil { t.Fatal(err) } template.OnAction(func(action ActionString) (goNext bool) { return action != ActionBlock }) testTemplate1001(a, t, template) testTemplate1002(a, t, template) testTemplate1003(a, t, template) testTemplate2001(a, t, template) testTemplate3001(a, t, template) testTemplate4001(a, t, template) testTemplate5001(a, t, template) testTemplate6001(a, t, template) testTemplate7001(a, t, template) testTemplate20001(a, t, template) } func Test_Template2(t *testing.T) { reader := bytes.NewReader([]byte(strings.Repeat("HELLO", 1024))) req, err := http.NewRequest(http.MethodGet, "http://example.com/index.php?id=123", reader) if err != nil { t.Fatal(err) } waf := Template() err = waf.Init() if err != nil { t.Fatal(err) } now := time.Now() goNext, _, set, err := waf.MatchRequest(req, nil) if err != nil { t.Fatal(err) } t.Log(time.Since(now).Seconds()*1000, "ms") if goNext { t.Log("ok") return } logs.PrintAsJSON(set, t) } func BenchmarkTemplate(b *testing.B) { waf := Template() err := waf.Init() if err != nil { b.Fatal(err) } for i := 0; i < b.N; i++ { reader := bytes.NewReader([]byte(strings.Repeat("Hello", 1024))) req, err := http.NewRequest(http.MethodGet, "http://example.com/index.php?id=123", reader) if err != nil { b.Fatal(err) } _, _, _, _ = waf.MatchRequest(req, nil) } } func testTemplate1001(a *assert.Assertion, t *testing.T, template *WAF) { req, err := http.NewRequest(http.MethodGet, "http://example.com/index.php?id=onmousedown%3D123", nil) if err != nil { t.Fatal(err) } _, _, result, err := template.MatchRequest(req, nil) if err != nil { t.Fatal(err) } a.IsNotNil(result) if result != nil { a.IsTrue(result.Code == "1001") } } func testTemplate1002(a *assert.Assertion, t *testing.T, template *WAF) { req, err := http.NewRequest(http.MethodGet, "http://example.com/index.php?id=eval%28", nil) if err != nil { t.Fatal(err) } _, _, result, err := template.MatchRequest(req, nil) if err != nil { t.Fatal(err) } a.IsNotNil(result) if result != nil { a.IsTrue(result.Code == "1002") } } func testTemplate1003(a *assert.Assertion, t *testing.T, template *WAF) { req, err := http.NewRequest(http.MethodGet, "http://example.com/index.php?id=