feature: add multiple-prefix support to app.Use() and group.Use() (#2205)

pull/2215/head
M. Efe Çetin 2022-11-13 18:56:34 +03:00 committed by GitHub
parent 20109922aa
commit 8aeb147c75
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 72 additions and 3 deletions

13
app.go
View File

@ -669,19 +669,30 @@ func (app *App) GetRoutes(filterUseOption ...bool) []Route {
// This method will match all HTTP verbs: GET, POST, PUT, HEAD etc...
func (app *App) Use(args ...interface{}) Router {
var prefix string
var prefixes []string
var handlers []Handler
for i := 0; i < len(args); i++ {
switch arg := args[i].(type) {
case string:
prefix = arg
case []string:
prefixes = arg
case Handler:
handlers = append(handlers, arg)
default:
panic(fmt.Sprintf("use: invalid handler %v\n", reflect.TypeOf(arg)))
}
}
app.register(methodUse, prefix, nil, handlers...)
if len(prefixes) == 0 {
prefixes = append(prefixes, prefix)
}
for _, prefix := range prefixes {
app.register(methodUse, prefix, nil, handlers...)
}
return app
}

View File

@ -401,6 +401,52 @@ func Test_App_Not_Use_StrictRouting(t *testing.T) {
utils.AssertEqual(t, StatusOK, resp.StatusCode, "Status code")
}
func Test_App_Use_MultiplePrefix(t *testing.T) {
app := New()
app.Use([]string{"/john", "/doe"}, func(c *Ctx) error {
return c.SendString(c.Path())
})
g := app.Group("/test")
g.Use([]string{"/john", "/doe"}, func(c *Ctx) error {
return c.SendString(c.Path())
})
resp, err := app.Test(httptest.NewRequest(MethodGet, "/john", nil))
utils.AssertEqual(t, nil, err, "app.Test(req)")
utils.AssertEqual(t, StatusOK, resp.StatusCode, "Status code")
body, err := io.ReadAll(resp.Body)
utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, "/john", string(body))
resp, err = app.Test(httptest.NewRequest(MethodGet, "/doe", nil))
utils.AssertEqual(t, nil, err, "app.Test(req)")
utils.AssertEqual(t, StatusOK, resp.StatusCode, "Status code")
body, err = io.ReadAll(resp.Body)
utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, "/doe", string(body))
resp, err = app.Test(httptest.NewRequest(MethodGet, "/test/john", nil))
utils.AssertEqual(t, nil, err, "app.Test(req)")
utils.AssertEqual(t, StatusOK, resp.StatusCode, "Status code")
body, err = io.ReadAll(resp.Body)
utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, "/test/john", string(body))
resp, err = app.Test(httptest.NewRequest(MethodGet, "/test/doe", nil))
utils.AssertEqual(t, nil, err, "app.Test(req)")
utils.AssertEqual(t, StatusOK, resp.StatusCode, "Status code")
body, err = io.ReadAll(resp.Body)
utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, "/test/doe", string(body))
}
func Test_App_Use_StrictRouting(t *testing.T) {
app := New(Config{StrictRouting: true})

View File

@ -51,19 +51,31 @@ func (grp *Group) Name(name string) Router {
//
// This method will match all HTTP verbs: GET, POST, PUT, HEAD etc...
func (grp *Group) Use(args ...interface{}) Router {
prefix := ""
var prefix string
var prefixes []string
var handlers []Handler
for i := 0; i < len(args); i++ {
switch arg := args[i].(type) {
case string:
prefix = arg
case []string:
prefixes = arg
case Handler:
handlers = append(handlers, arg)
default:
panic(fmt.Sprintf("use: invalid handler %v\n", reflect.TypeOf(arg)))
}
}
grp.app.register(methodUse, getGroupPath(grp.Prefix, prefix), grp, handlers...)
if len(prefixes) == 0 {
prefixes = append(prefixes, prefix)
}
for _, prefix := range prefixes {
grp.app.register(methodUse, getGroupPath(grp.Prefix, prefix), grp, handlers...)
}
return grp
}