From e9df04014231b763495ecbb7a63d78bc70b16a74 Mon Sep 17 00:00:00 2001 From: Ming Deng Date: Tue, 27 Apr 2021 23:48:11 +0800 Subject: [PATCH] Fix 4590: Forget to check URL when FilterChain invoke next() --- server/web/filter_chain_test.go | 25 ++++++++++++++++++++++++- server/web/router.go | 6 +++++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/server/web/filter_chain_test.go b/server/web/filter_chain_test.go index 2a428b78..29a6d82a 100644 --- a/server/web/filter_chain_test.go +++ b/server/web/filter_chain_test.go @@ -15,16 +15,18 @@ package web import ( + "github.com/beego/beego/v2/core/logs" "net/http" "net/http/httptest" "testing" + "time" "github.com/stretchr/testify/assert" "github.com/beego/beego/v2/server/web/context" ) -func TestControllerRegister_InsertFilterChain(t *testing.T) { +func TestControllerRegisterInsertFilterChain(t *testing.T) { InsertFilterChain("/*", func(next FilterFunc) FilterFunc { return func(ctx *context.Context) { @@ -46,3 +48,24 @@ func TestControllerRegister_InsertFilterChain(t *testing.T) { assert.Equal(t, "filter-chain", w.Header().Get("filter")) } + +func TestFilterChainRouter(t *testing.T) { + InsertFilterChain("/app/hello1/*", func(next FilterFunc) FilterFunc { + return func(ctx *context.Context) { + logs.Info("aaa") + next(ctx) + } + }) + + InsertFilterChain("/app/*", func(next FilterFunc) FilterFunc { + return func(ctx *context.Context) { + start := time.Now() + ctx.Input.SetData("start", start) + logs.Info("start_time", start) + next(ctx) + logs.Info("run_time", time.Since(start).String()) + } + }) + + Run() +} diff --git a/server/web/router.go b/server/web/router.go index 7e78c76c..93c77e7d 100644 --- a/server/web/router.go +++ b/server/web/router.go @@ -486,7 +486,11 @@ func (p *ControllerRegister) InsertFilter(pattern string, pos int, filter Filter // } func (p *ControllerRegister) InsertFilterChain(pattern string, chain FilterChain, opts ...FilterOpt) { root := p.chainRoot - filterFunc := chain(root.filterFunc) + //filterFunc := chain(root.filterFunc) + filterFunc := chain(func(ctx *beecontext.Context) { + var preFilterParams map[string]string + root.filter(ctx, p.getUrlPath(ctx), preFilterParams) + }) opts = append(opts, WithCaseSensitive(p.cfg.RouterCaseSensitive)) p.chainRoot = newFilterRouter(pattern, filterFunc, opts...) p.chainRoot.next = root