* refs #1526: Add tests for trailing slash requests with nested any routes
* refs #1526: Handle specual router case with trailing slash for non-root any route
* refs #1526: Fix accidential lookup for any route without trailing slash in request
* Add test for issue #1509 for dynamic routes and multiple static routes with common prefix
* Fix#1509: routing conflict for dynamic routes and static route with common prefix
* Improve routing performance for static only route trees
* set parameter value in the pvalues slice
* update echo version
* update travis yml to fix failing build and add go modules support
* Add tests
* Update router_test.go
Co-authored-by: Vishal Rana <vr@labstack.com>
This is a follow-up to #1101. It turns out that that patch is
incomplete, as a similar check also needs to be added in the
`Router.Add()` method.
I don't understand why the test works fine, but when using it in a real
application. For example with this example:
func main() {
e := echo.New()
e.GET("/xxx/:id.json", func(c echo.Context) error {
return c.String(200, fmt.Sprintf("%#v: names: %#v; vals: %#v",
c.Path(), c.ParamNames(), c.ParamValues()))
})
log.Fatal(e.Start(":8000"))
}
Gives a 404 on `/xxx/42.json`, and for `/xxx/42` it gives the output:
/xxx/:id.json": names: []string{"id.json"}; vals: []string{"42"}
It makes sense to add the test there too; I just don't get why the test
cases that I added in ##1101 *does* produce the correct output :-/
Currently a route in the form of `/foo/:id.json` means echo will detect
the parameter name `id.json` instead of the expected `id`. I think this
is rather counter-intuitive, as adding an extension to paths is a fairly
common use case.
With this change both a `/` and a `.` will be treated as the end of a
parameter name.
Benchmark before this change:
$ go test -bench .
[..]
goos: linux
goarch: amd64
pkg: github.com/labstack/echo
BenchmarkRouterStaticRoutes-4 100000 17743 ns/op 0 B/op 0 allocs/op
BenchmarkRouterGitHubAPI-4 50000 33081 ns/op 1 B/op 0 allocs/op
BenchmarkRouterParseAPI-4 300000 5370 ns/op 0 B/op 0 allocs/op
BenchmarkRouterGooglePlusAPI-4 200000 9183 ns/op 0 B/op 0 allocs/op
PASS
ok github.com/labstack/echo 8.565s
After this change:
goos: linux
goarch: amd64
pkg: github.com/labstack/echo
BenchmarkRouterStaticRoutes-4 100000 17699 ns/op 0 B/op 0 allocs/op
BenchmarkRouterGitHubAPI-4 50000 32962 ns/op 1 B/op 0 allocs/op
BenchmarkRouterParseAPI-4 300000 5450 ns/op 0 B/op 0 allocs/op
BenchmarkRouterGooglePlusAPI-4 200000 9205 ns/op 0 B/op 0 allocs/op
PASS
ok github.com/labstack/echo 8.590s
Fixes#599