diff --git a/gin.go b/gin.go index d2887ed..cf48c33 100644 --- a/gin.go +++ b/gin.go @@ -60,6 +60,11 @@ type ( // handler. HandleMethodNotAllowed bool } + + RouteInfo struct { + Method string + Path string + } ) // Returns a new blank Engine instance without any middleware attached. @@ -169,6 +174,29 @@ func (engine *Engine) addRoute(method, path string, handlers HandlersChain) { root.addRoute(path, handlers) } +func (engine *Engine) Routes() (routes []RouteInfo) { + for _, tree := range engine.trees { + for _, path := range iterate("", nil, tree.root) { + routes = append(routes, RouteInfo{ + Method: tree.method, + Path: path, + }) + } + } + return routes +} + +func iterate(path string, routes []string, root *node) []string { + path += root.path + if root.handlers != nil { + routes = append(routes, path) + } + for _, node := range root.children { + routes = iterate(path, routes, node) + } + return routes +} + // The router is attached to a http.Server and starts listening and serving HTTP requests. // It is a shortcut for http.ListenAndServe(addr, router) // Note: this method will block the calling goroutine undefinitelly unless an error happens. diff --git a/gin_test.go b/gin_test.go index 28bba73..76be3b9 100644 --- a/gin_test.go +++ b/gin_test.go @@ -14,7 +14,6 @@ import ( //TODO // func (engine *Engine) LoadHTMLGlob(pattern string) { // func (engine *Engine) LoadHTMLFiles(files ...string) { -// func (engine *Engine) Run(addr string) error { // func (engine *Engine) RunTLS(addr string, cert string, key string) error { func init() { @@ -180,3 +179,50 @@ func compareFunc(t *testing.T, a, b interface{}) { t.Error("different functions") } } + +func TestListOfRoutes(t *testing.T) { + handler := func(c *Context){} + router := New() + router.GET("/favicon.ico", handler) + router.GET("/", handler) + group := router.Group("/users") + { + group.GET("/", handler) + group.GET("/:id", handler) + group.POST("/:id", handler) + } + router.Static("/static", ".") + + list := router.Routes() + + assert.Len(t, list, 7) + assert.Contains(t, list, RouteInfo{ + Method: "GET", + Path: "/favicon.ico", + }) + assert.Contains(t, list, RouteInfo{ + Method: "GET", + Path: "/", + }) + assert.Contains(t, list, RouteInfo{ + Method: "GET", + Path: "/users/", + }) + assert.Contains(t, list, RouteInfo{ + Method: "GET", + Path: "/users/:id", + }) + assert.Contains(t, list, RouteInfo{ + Method: "POST", + Path: "/users/:id", + }) + assert.Contains(t, list, RouteInfo{ + Method: "GET", + Path: "/static/*filepath", + }) + assert.Contains(t, list, RouteInfo{ + Method: "HEAD", + Path: "/static/*filepath", + }) + +}