diff --git a/context.go b/context.go index cf79e2f1..681f564e 100644 --- a/context.go +++ b/context.go @@ -553,7 +553,8 @@ func (c *context) Reset(r *http.Request, w http.ResponseWriter) { c.query = nil c.handler = NotFoundHandler c.store = nil - c.pnames = nil - // WARNING: Don't reset because it has to have length c.echo.maxParam at all times: c.pvalues = nil c.path = "" + c.pnames = nil + // NOTE: Don't reset because it has to have length c.echo.maxParam at all times + // c.pvalues = nil } diff --git a/router.go b/router.go index 933a91a7..876fc5d8 100644 --- a/router.go +++ b/router.go @@ -296,18 +296,19 @@ func (n *node) checkMethodNotAllowed() HandlerFunc { // - Get context from `Echo#AcquireContext()` // - Reset it `Context#Reset()` // - Return it `Echo#ReleaseContext()`. -func (r *Router) Find(method, path string, ctx Context) { - ctx.SetPath(path) +func (r *Router) Find(method, path string, c Context) { + ctx := c.(*context) + ctx.path = path cn := r.tree // Current node as root var ( search = path - c *node // Child node - n int // Param counter - nk kind // Next kind - nn *node // Next node - ns string // Next search - pvalues = ctx.(*context).pvalues // use the internal slice so the interface can keep the illusion of a dynamic slice + child *node // Child node + n int // Param counter + nk kind // Next kind + nn *node // Next node + ns string // Next search + pvalues = ctx.pvalues // Use the internal slice so the interface can keep the illusion of a dynamic slice ) // Search order static > param > any @@ -352,20 +353,20 @@ func (r *Router) Find(method, path string, ctx Context) { } // Static node - if c = cn.findChild(search[0], skind); c != nil { + if child = cn.findChild(search[0], skind); child != nil { // Save next if cn.prefix[len(cn.prefix)-1] == '/' { // Issue #623 nk = pkind nn = cn ns = search } - cn = c + cn = child continue } // Param node Param: - if c = cn.findChildByKind(pkind); c != nil { + if child = cn.findChildByKind(pkind); child != nil { // Issue #378 if len(pvalues) == n { continue @@ -378,7 +379,7 @@ func (r *Router) Find(method, path string, ctx Context) { ns = search } - cn = c + cn = child i, l := 0, len(search) for ; i < l && search[i] != '/'; i++ { } @@ -409,13 +410,13 @@ func (r *Router) Find(method, path string, ctx Context) { } End: - ctx.SetHandler(cn.findHandler(method)) - ctx.SetPath(cn.ppath) - ctx.SetParamNames(cn.pnames...) + ctx.handler = cn.findHandler(method) + ctx.path = cn.ppath + ctx.pnames = cn.pnames // NOTE: Slow zone... - if ctx.Handler() == nil { - ctx.SetHandler(cn.checkMethodNotAllowed()) + if ctx.handler == nil { + ctx.handler = cn.checkMethodNotAllowed() // Dig further for any, might have an empty value for *, e.g. // serving a directory. Issue #207. @@ -423,12 +424,12 @@ End: return } if h := cn.findHandler(method); h != nil { - ctx.SetHandler(h) + ctx.handler = h } else { - ctx.SetHandler(cn.checkMethodNotAllowed()) + ctx.handler = cn.checkMethodNotAllowed() } - ctx.SetPath(cn.ppath) - ctx.SetParamNames(cn.pnames...) + ctx.path = cn.ppath + ctx.pnames = cn.pnames pvalues[len(cn.pnames)-1] = "" }