diff --git a/gin.go b/gin.go index 0761c14d..a0758a30 100644 --- a/gin.go +++ b/gin.go @@ -299,6 +299,22 @@ func (engine *Engine) SetFuncMap(funcMap template.FuncMap) { engine.FuncMap = funcMap } +// GetHandlerPath takes a name of a handler and returns a slice of matched paths associated with that handler. +func (engine *Engine) GetHandlerPath(handlerName string) []string { + handlers := engine.Routes() + var paths []string + + for _, f := range handlers { + handler := strings.Split(f.Handler, ".") + + if handler[len(handler)-1] == handlerName { + paths = append(paths, f.Path) + } + } + + return paths +} + // NoRoute adds handlers for NoRoute. It returns a 404 code by default. func (engine *Engine) NoRoute(handlers ...HandlerFunc) { engine.noRoute = handlers diff --git a/gin_test.go b/gin_test.go index 850ae09b..0379948c 100644 --- a/gin_test.go +++ b/gin_test.go @@ -716,6 +716,24 @@ func TestPrepareTrustedCIRDsWith(t *testing.T) { } } +func TestGetHandlerPath(t *testing.T) { + r := New() + r.GET("/foo", handlerTest1) + r.POST("/bar", handlerTest2) + + v := r.Group("/users") + { + v.GET("/:id1", handlerTest1) + v.POST("/:id2", handlerTest2) + } + + p1 := r.GetHandlerPath("handlerTest1") + assert.Equal(t, p1, []string{"/foo", "/users/:id1"}) + + p2 := r.GetHandlerPath("handlerTest2") + assert.Equal(t, p2, []string{"/bar", "/users/:id2"}) +} + func parseCIDR(cidr string) *net.IPNet { _, parsedCIDR, err := net.ParseCIDR(cidr) if err != nil {