From daf0fdb977d97a71d1703237e96f922584aac1f1 Mon Sep 17 00:00:00 2001 From: ksw2000 <13825170+ksw2000@users.noreply.github.com> Date: Tue, 25 Mar 2025 21:26:47 +0800 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8FRefactor:=20remove=20redundan?= =?UTF-8?q?t=20field=20method=20in=20defaultCtx?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.go | 30 +++++++++++++++++++++--------- ctx.go | 24 ++++++++++-------------- helpers.go | 31 ++++++++++++++----------------- router.go | 8 ++++---- 4 files changed, 49 insertions(+), 44 deletions(-) diff --git a/app.go b/app.go index d4d89d92..43ccaf9a 100644 --- a/app.go +++ b/app.go @@ -456,17 +456,29 @@ const ( DefaultWriteBufferSize = 4096 ) +const ( + methodGet = iota + methodHead + methodPost + methodPut + methodDelete + methodConnect + methodOptions + methodTrace + methodPatch +) + // HTTP methods enabled by default var DefaultMethods = []string{ - MethodGet, - MethodHead, - MethodPost, - MethodPut, - MethodDelete, - MethodConnect, - MethodOptions, - MethodTrace, - MethodPatch, + methodGet: MethodGet, + methodHead: MethodHead, + methodPost: MethodPost, + methodPut: MethodPut, + methodDelete: MethodDelete, + methodConnect: MethodConnect, + methodOptions: MethodOptions, + methodTrace: MethodTrace, + methodPatch: MethodPatch, } // DefaultErrorHandler that process return errors from handlers diff --git a/ctx.go b/ctx.go index b959a48f..dd55ad97 100644 --- a/ctx.go +++ b/ctx.go @@ -61,7 +61,6 @@ type DefaultCtx struct { res *DefaultRes // Default response api reference values [maxParams]string // Route parameter values viewBindMap sync.Map // Default view map to bind template engine - method string // HTTP method baseURI string // HTTP base uri pathOriginal string // Original HTTP path flashMessages redirectionMsgs // Flash messages @@ -70,7 +69,7 @@ type DefaultCtx struct { treePathHash int // Hash of the path for the search in the tree indexRoute int // Index of the current route indexHandler int // Index of the current handler - methodINT int // HTTP method INT equivalent + methodInt int // HTTP method INT equivalent matched bool // Non use route matched } @@ -1006,19 +1005,17 @@ func (c *DefaultCtx) Location(path string) { func (c *DefaultCtx) Method(override ...string) string { if len(override) == 0 { // Nothing to override, just return current method from context - return c.method + return c.app.method(c.methodInt) } method := utils.ToUpper(override[0]) - mINT := c.app.methodInt(method) - if mINT == -1 { + methodInt := c.app.methodInt(method) + if methodInt == -1 { // Provided override does not valid HTTP method, no override, return current method - return c.method + return c.app.method(c.methodInt) } - - c.method = method - c.methodINT = mINT - return c.method + c.methodInt = methodInt + return method } // MultipartForm parse form entries from binary. @@ -1486,7 +1483,7 @@ func (c *DefaultCtx) Route() *Route { return &Route{ path: c.pathOriginal, Path: c.pathOriginal, - Method: c.method, + Method: c.Method(), Handlers: make([]Handler, 0), Params: make([]string, 0), } @@ -1919,8 +1916,7 @@ func (c *DefaultCtx) Reset(fctx *fasthttp.RequestCtx) { // Set paths c.pathOriginal = c.app.getString(fctx.URI().PathOriginal()) // Set method - c.method = c.app.getString(fctx.Request.Header.Method()) - c.methodINT = c.app.methodInt(c.method) + c.methodInt = c.app.methodInt(utils.UnsafeString(fctx.Request.Header.Method())) // Attach *fasthttp.RequestCtx to ctx c.fasthttp = fctx // reset base uri @@ -1952,7 +1948,7 @@ func (c *DefaultCtx) getBody() []byte { // Methods to use with next stack. func (c *DefaultCtx) getMethodINT() int { - return c.methodINT + return c.methodInt } func (c *DefaultCtx) getIndexRoute() int { diff --git a/helpers.go b/helpers.go index 3f1685b1..bbaa1805 100644 --- a/helpers.go +++ b/helpers.go @@ -14,6 +14,7 @@ import ( "os" "path/filepath" "reflect" + "slices" "strconv" "strings" "sync" @@ -652,39 +653,35 @@ func getBytesImmutable(s string) []byte { func (app *App) methodInt(s string) int { // For better performance if len(app.configured.RequestMethods) == 0 { - // TODO: Use iota instead switch s { case MethodGet: - return 0 + return methodGet case MethodHead: - return 1 + return methodHead case MethodPost: - return 2 + return methodPost case MethodPut: - return 3 + return methodPut case MethodDelete: - return 4 + return methodDelete case MethodConnect: - return 5 + return methodConnect case MethodOptions: - return 6 + return methodOptions case MethodTrace: - return 7 + return methodTrace case MethodPatch: - return 8 + return methodPatch default: return -1 } } - // For method customization - for i, v := range app.config.RequestMethods { - if s == v { - return i - } - } + return slices.Index(app.config.RequestMethods, s) +} - return -1 +func (app *App) method(methodInt int) string { + return app.config.RequestMethods[methodInt] } // IsMethodSafe reports whether the HTTP method is considered safe. diff --git a/router.go b/router.go index 0aec6509..0fc9b455 100644 --- a/router.go +++ b/router.go @@ -158,9 +158,9 @@ func (app *App) nextCustom(c CustomCtx) (bool, error) { //nolint:unparam // bool func (app *App) next(c *DefaultCtx) (bool, error) { // Get stack length - tree, ok := app.treeStack[c.methodINT][c.treePathHash] + tree, ok := app.treeStack[c.methodInt][c.treePathHash] if !ok { - tree = app.treeStack[c.methodINT][0] + tree = app.treeStack[c.methodInt][0] } lenTree := len(tree) - 1 @@ -202,7 +202,7 @@ func (app *App) next(c *DefaultCtx) (bool, error) { } // If c.Next() does not match, return 404 - err := NewError(StatusNotFound, "Cannot "+c.method+" "+html.EscapeString(c.pathOriginal)) + err := NewError(StatusNotFound, "Cannot "+c.Method()+" "+html.EscapeString(c.pathOriginal)) if !c.matched && app.methodExist(c) { // If no match, scan stack again if other methods match the request // Moved from app.handler because middleware may break the route chain @@ -221,7 +221,7 @@ func (app *App) defaultRequestHandler(rctx *fasthttp.RequestCtx) { defer app.ReleaseCtx(ctx) // Check if the HTTP method is valid - if ctx.methodINT == -1 { + if ctx.methodInt == -1 { _ = ctx.SendStatus(StatusNotImplemented) //nolint:errcheck // Always return nil return }