diff --git a/context.go b/context.go index 798bcc240..681f564e9 100644 --- a/context.go +++ b/context.go @@ -275,7 +275,7 @@ func (c *context) SetParamNames(names ...string) { } func (c *context) ParamValues() []string { - return c.pvalues + return c.pvalues[:len(c.pnames)] } func (c *context) SetParamValues(values ...string) { @@ -553,4 +553,8 @@ func (c *context) Reset(r *http.Request, w http.ResponseWriter) { c.query = nil c.handler = NotFoundHandler c.store = 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/context_test.go b/context_test.go index 892b02ebc..ad4cf892c 100644 --- a/context_test.go +++ b/context_test.go @@ -190,7 +190,16 @@ func TestContext(t *testing.T) { assert.Equal(t, http.StatusInternalServerError, rec.Code) // Reset + c.SetParamNames("foo") + c.SetParamValues("bar") + c.Set("foe", "ban") + c.query = url.Values(map[string][]string{"fon": []string{"baz"}}) c.Reset(req, httptest.NewRecorder()) + assert.Equal(t, 0, len(c.ParamValues())) + assert.Equal(t, 0, len(c.ParamNames())) + assert.Equal(t, 0, len(c.store)) + assert.Equal(t, "", c.Path()) + assert.Equal(t, 0, len(c.QueryParams())) } func TestContextCookie(t *testing.T) { diff --git a/middleware/logger_test.go b/middleware/logger_test.go index f8b09cfdd..ee8e79bca 100644 --- a/middleware/logger_test.go +++ b/middleware/logger_test.go @@ -122,10 +122,10 @@ func TestLoggerTemplate(t *testing.T) { "hexvalue": false, "GET": true, "127.0.0.1": true, - "\"path\":\"/\"": true, - "\"uri\":\"/\"": true, - "\"status\":200": true, - "\"bytes_in\":0": true, + `"path":"/"`: true, + `"uri":"/"`: true, + `"status":200`: true, + `"bytes_in":0`: true, "google.com": true, "echo-tests-agent": true, "6ba7b810-9dad-11d1-80b4-00c04fd430c8": true, diff --git a/router.go b/router.go index a8d1f1aa0..876fc5d8a 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, context Context) { - context.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 = context.ParamValues() + 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, context 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, context 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, context Context) { } End: - context.SetHandler(cn.findHandler(method)) - context.SetPath(cn.ppath) - context.SetParamNames(cn.pnames...) + ctx.handler = cn.findHandler(method) + ctx.path = cn.ppath + ctx.pnames = cn.pnames // NOTE: Slow zone... - if context.Handler() == nil { - context.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 { - context.SetHandler(h) + ctx.handler = h } else { - context.SetHandler(cn.checkMethodNotAllowed()) + ctx.handler = cn.checkMethodNotAllowed() } - context.SetPath(cn.ppath) - context.SetParamNames(cn.pnames...) + ctx.path = cn.ppath + ctx.pnames = cn.pnames pvalues[len(cn.pnames)-1] = "" }