diff --git a/README.md b/README.md index 6b8f678af9..15c6ac6599 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -## I'm working hard on the [dev](https://github.com/kataras/iris/tree/dev) branch for the next release of Iris, v9. +## I'm working hard on the [dev](https://github.com/kataras/iris/tree/dev) branch for the next release of Iris. Do you remember, last Christmas? I did publish the version 6 with net/http and HTTP/2 support, and you've embraced Iris with so much love, ultimately it was a successful move. diff --git a/core/router/api_builder.go b/core/router/api_builder.go index 475b68d749..dc1438b7d8 100644 --- a/core/router/api_builder.go +++ b/core/router/api_builder.go @@ -199,14 +199,12 @@ func (api *APIBuilder) Handle(method string, relativePath string, handlers ...co // This method is used behind the scenes at the `Controller` function // in order to handle more than one paths for the same controller instance. func (api *APIBuilder) HandleMany(methodOrMulti string, relativePathorMulti string, handlers ...context.Handler) (routes []*Route) { - trimmedPath := strings.Trim(relativePathorMulti, " ") - trimmedMethod := strings.Trim(methodOrMulti, " ") // at least slash // a space // at least one other slash for the next path // app.Controller("/user /user{id}", new(UserController)) - paths := strings.Split(trimmedPath, " ") - methods := strings.Split(trimmedMethod, " ") + paths := splitPath(relativePathorMulti) + methods := splitMethod(methodOrMulti) for _, p := range paths { if p != "" { for _, method := range methods { diff --git a/core/router/path.go b/core/router/path.go index 914f75e715..5311e4d2c9 100644 --- a/core/router/path.go +++ b/core/router/path.go @@ -45,6 +45,26 @@ func suffix(s string, suffix string) string { return s } +func splitMethod(methodMany string) []string { + methodMany = strings.Trim(methodMany, " ") + return strings.Split(methodMany, " ") +} + +func splitPath(pathMany string) (paths []string) { + pathMany = strings.Trim(pathMany, " ") + pathsWithoutSlashFromFirstAndSoOn := strings.Split(pathMany, " /") + for _, path := range pathsWithoutSlashFromFirstAndSoOn { + if path == "" { + continue + } + if path[0] != '/' { + path = "/" + path + } + paths = append(paths, path) + } + return +} + func joinPath(path1 string, path2 string) string { return path.Join(path1, path2) } diff --git a/core/router/path_test.go b/core/router/path_test.go index 311948717e..28c49b139b 100644 --- a/core/router/path_test.go +++ b/core/router/path_test.go @@ -4,6 +4,44 @@ import ( "testing" ) +func TestSplitPath(t *testing.T) { + tests := []struct { + path string + expected []string + }{ + {"/v2/stores/{id:string format(uuid)} /v3", + []string{"/v2/stores/{id:string format(uuid)}", "/v3"}}, + {"/user/{id:int} /admin/{id:int}", + []string{"/user/{id:int}", "/admin/{id:int}"}}, + {"/user /admin", + []string{"/user", "/admin"}}, + {"/single_no_params", + []string{"/single_no_params"}}, + {"/single/{id:int}", + []string{"/single/{id:int}"}}, + } + + equalSlice := func(s1 []string, s2 []string) bool { + if len(s1) != len(s2) { + return false + } + + for i := range s1 { + if s2[i] != s1[i] { + return false + } + } + + return true + } + + for i, tt := range tests { + paths := splitPath(tt.path) + if expected, got := tt.expected, paths; !equalSlice(expected, got) { + t.Fatalf("[%d] - expected paths '%#v' but got '%#v'", i, expected, got) + } + } +} func TestSplitSubdomainAndPath(t *testing.T) { tests := []struct { original string