From ac69d340a69dd9a0ec86d6c2fa69bf4fb9a6cf6f Mon Sep 17 00:00:00 2001 From: Eason Lin Date: Sat, 12 Aug 2017 16:32:36 +0800 Subject: [PATCH] feat(routes): Catch-All form should not include the slash before param --- routes_test.go | 21 ++++++++++++++++++++- tree.go | 1 + tree_test.go | 16 ++++++++-------- 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/routes_test.go b/routes_test.go index 41693eed..bbf3c533 100644 --- a/routes_test.go +++ b/routes_test.go @@ -239,7 +239,26 @@ func TestRouteParamsByName(t *testing.T) { assert.Equal(t, w.Code, 200) assert.Equal(t, name, "john") assert.Equal(t, lastName, "smith") - assert.Equal(t, wild, "/is/super/great") + assert.Equal(t, wild, "is/super/great") +} + +func TestRouteEmptyWildcardParam(t *testing.T) { + name := "A" + wild := "A" + router := New() + router.GET("/test/:name/*wild", func(c *Context) { + name = c.Params.ByName("name") + wild = c.Params.ByName("wild") + }) + + // RUN + w := performRequest(router, "GET", "/test/john/") + assert.Equal(t, 200, w.Code) + assert.Equal(t, "john", name) + assert.Empty(t, wild) + + w = performRequest(router, "GET", "/test/john") + assert.Equal(t, 404, w.Code) } // TestHandleStaticFile - ensure the static file handles properly diff --git a/tree.go b/tree.go index 750ffae8..47f7d5ab 100644 --- a/tree.go +++ b/tree.go @@ -448,6 +448,7 @@ walk: // Outer loop for walking the tree i := len(p) p = p[:i+1] // expand slice within preallocated capacity p[i].Key = n.path[2:] + path = path[1:] // not include the slash if unescape { var err error if p[i].Value, err = url.QueryUnescape(path); err != nil { diff --git a/tree_test.go b/tree_test.go index c0edd42b..6e54336b 100644 --- a/tree_test.go +++ b/tree_test.go @@ -186,14 +186,14 @@ func TestTreeWildcard(t *testing.T) { {"/cmd/test/", false, "/cmd/:tool/", Params{Param{"tool", "test"}}}, {"/cmd/test", true, "", Params{Param{"tool", "test"}}}, {"/cmd/test/3", false, "/cmd/:tool/:sub", Params{Param{"tool", "test"}, Param{"sub", "3"}}}, - {"/src/", false, "/src/*filepath", Params{Param{"filepath", "/"}}}, - {"/src/some/file.png", false, "/src/*filepath", Params{Param{"filepath", "/some/file.png"}}}, + {"/src/", false, "/src/*filepath", Params{Param{"filepath", ""}}}, + {"/src/some/file.png", false, "/src/*filepath", Params{Param{"filepath", "some/file.png"}}}, {"/search/", false, "/search/", nil}, {"/search/someth!ng+in+ünìcodé", false, "/search/:query", Params{Param{"query", "someth!ng+in+ünìcodé"}}}, {"/search/someth!ng+in+ünìcodé/", true, "", Params{Param{"query", "someth!ng+in+ünìcodé"}}}, {"/user_gopher", false, "/user_:name", Params{Param{"name", "gopher"}}}, {"/user_gopher/about", false, "/user_:name/about", Params{Param{"name", "gopher"}}}, - {"/files/js/inc/framework.js", false, "/files/:dir/*filepath", Params{Param{"dir", "js"}, Param{"filepath", "/inc/framework.js"}}}, + {"/files/js/inc/framework.js", false, "/files/:dir/*filepath", Params{Param{"dir", "js"}, Param{"filepath", "inc/framework.js"}}}, {"/info/gordon/public", false, "/info/:user/public", Params{Param{"user", "gordon"}}}, {"/info/gordon/project/go", false, "/info/:user/project/:project", Params{Param{"user", "gordon"}, Param{"project", "go"}}}, }) @@ -225,10 +225,10 @@ func TestUnescapeParameters(t *testing.T) { {"/", false, "/", nil}, {"/cmd/test/", false, "/cmd/:tool/", Params{Param{"tool", "test"}}}, {"/cmd/test", true, "", Params{Param{"tool", "test"}}}, - {"/src/some/file.png", false, "/src/*filepath", Params{Param{"filepath", "/some/file.png"}}}, - {"/src/some/file+test.png", false, "/src/*filepath", Params{Param{"filepath", "/some/file test.png"}}}, - {"/src/some/file++++%%%%test.png", false, "/src/*filepath", Params{Param{"filepath", "/some/file++++%%%%test.png"}}}, - {"/src/some/file%2Ftest.png", false, "/src/*filepath", Params{Param{"filepath", "/some/file/test.png"}}}, + {"/src/some/file.png", false, "/src/*filepath", Params{Param{"filepath", "some/file.png"}}}, + {"/src/some/file+test.png", false, "/src/*filepath", Params{Param{"filepath", "some/file test.png"}}}, + {"/src/some/file++++%%%%test.png", false, "/src/*filepath", Params{Param{"filepath", "some/file++++%%%%test.png"}}}, + {"/src/some/file%2Ftest.png", false, "/src/*filepath", Params{Param{"filepath", "some/file/test.png"}}}, {"/search/someth!ng+in+ünìcodé", false, "/search/:query", Params{Param{"query", "someth!ng in ünìcodé"}}}, {"/info/gordon/project/go", false, "/info/:user/project/:project", Params{Param{"user", "gordon"}, Param{"project", "go"}}}, {"/info/slash%2Fgordon", false, "/info/:user", Params{Param{"user", "slash/gordon"}}}, @@ -344,7 +344,7 @@ func TestTreeDupliatePath(t *testing.T) { checkRequests(t, tree, testRequests{ {"/", false, "/", nil}, {"/doc/", false, "/doc/", nil}, - {"/src/some/file.png", false, "/src/*filepath", Params{Param{"filepath", "/some/file.png"}}}, + {"/src/some/file.png", false, "/src/*filepath", Params{Param{"filepath", "some/file.png"}}}, {"/search/someth!ng+in+ünìcodé", false, "/search/:query", Params{Param{"query", "someth!ng+in+ünìcodé"}}}, {"/user_gopher", false, "/user_:name", Params{Param{"name", "gopher"}}}, })