2021-01-17 21:46:25 +08:00
|
|
|
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
2018-12-19 14:45:39 +08:00
|
|
|
//
|
|
|
|
// This Source Code Form is subject to the terms of the MIT License.
|
|
|
|
// If a copy of the MIT was not distributed with this file,
|
2019-02-02 16:18:25 +08:00
|
|
|
// You can obtain one at https://github.com/gogf/gf.
|
2018-12-19 14:45:39 +08:00
|
|
|
|
|
|
|
package ghttp
|
|
|
|
|
2018-12-20 21:04:43 +08:00
|
|
|
import (
|
2021-09-27 21:27:24 +08:00
|
|
|
"context"
|
2020-03-17 14:48:52 +08:00
|
|
|
"fmt"
|
2021-11-13 23:23:55 +08:00
|
|
|
"reflect"
|
|
|
|
|
2021-10-11 21:41:56 +08:00
|
|
|
"github.com/gogf/gf/v2/debug/gdebug"
|
2022-03-11 10:24:42 +08:00
|
|
|
"github.com/gogf/gf/v2/internal/reflection"
|
2021-11-07 21:31:33 +08:00
|
|
|
"github.com/gogf/gf/v2/internal/utils"
|
2021-10-11 21:41:56 +08:00
|
|
|
"github.com/gogf/gf/v2/text/gstr"
|
|
|
|
"github.com/gogf/gf/v2/util/gconv"
|
2018-12-20 21:04:43 +08:00
|
|
|
)
|
|
|
|
|
2019-12-04 13:55:08 +08:00
|
|
|
type (
|
|
|
|
// RouterGroup is a group wrapping multiple routes and middleware.
|
|
|
|
RouterGroup struct {
|
|
|
|
parent *RouterGroup // Parent group.
|
|
|
|
server *Server // Server.
|
|
|
|
domain *Domain // Domain.
|
|
|
|
prefix string // Prefix for sub-route.
|
|
|
|
middleware []HandlerFunc // Middleware array.
|
|
|
|
}
|
2018-12-20 21:04:43 +08:00
|
|
|
|
2019-12-04 13:55:08 +08:00
|
|
|
// preBindItem is item for lazy registering feature of router group. preBindItem is not really registered
|
|
|
|
// to server when route function of the group called but is lazily registered when server starts.
|
|
|
|
preBindItem struct {
|
|
|
|
group *RouterGroup
|
|
|
|
bindType string
|
|
|
|
pattern string
|
|
|
|
object interface{} // Can be handler, controller or object.
|
|
|
|
params []interface{} // Extra parameters for route registering depending on the type.
|
2020-03-24 19:48:10 +08:00
|
|
|
source string // Handler is register at certain source file path:line.
|
|
|
|
bound bool // Is this item bound to server.
|
2019-12-04 13:55:08 +08:00
|
|
|
}
|
|
|
|
)
|
2019-08-06 20:40:04 +08:00
|
|
|
|
2021-08-19 20:59:08 +08:00
|
|
|
const (
|
|
|
|
groupBindTypeHandler = "HANDLER"
|
|
|
|
groupBindTypeRest = "REST"
|
|
|
|
groupBindTypeHook = "HOOK"
|
|
|
|
groupBindTypeMiddleware = "MIDDLEWARE"
|
|
|
|
)
|
|
|
|
|
2019-08-06 20:40:04 +08:00
|
|
|
var (
|
2020-03-24 19:48:10 +08:00
|
|
|
preBindItems = make([]*preBindItem, 0, 64)
|
2019-08-06 20:40:04 +08:00
|
|
|
)
|
|
|
|
|
2019-12-04 13:55:08 +08:00
|
|
|
// handlePreBindItems is called when server starts, which does really route registering to the server.
|
2021-09-27 21:27:24 +08:00
|
|
|
func (s *Server) handlePreBindItems(ctx context.Context) {
|
2020-01-21 22:18:49 +08:00
|
|
|
if len(preBindItems) == 0 {
|
|
|
|
return
|
|
|
|
}
|
2019-08-06 20:40:04 +08:00
|
|
|
for _, item := range preBindItems {
|
2020-03-24 19:48:10 +08:00
|
|
|
if item.bound {
|
|
|
|
continue
|
|
|
|
}
|
2019-12-04 10:03:03 +08:00
|
|
|
// Handle the items of current server.
|
2019-08-06 20:40:04 +08:00
|
|
|
if item.group.server != nil && item.group.server != s {
|
|
|
|
continue
|
|
|
|
}
|
2020-03-17 14:48:52 +08:00
|
|
|
if item.group.domain != nil && item.group.domain.server != s {
|
2019-08-06 20:40:04 +08:00
|
|
|
continue
|
|
|
|
}
|
2021-09-27 21:27:24 +08:00
|
|
|
item.group.doBindRoutersToServer(ctx, item)
|
2020-03-24 19:48:10 +08:00
|
|
|
item.bound = true
|
2019-08-06 20:40:04 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-12-04 13:55:08 +08:00
|
|
|
// Group creates and returns a RouterGroup object.
|
2019-11-30 20:41:53 +08:00
|
|
|
func (s *Server) Group(prefix string, groups ...func(group *RouterGroup)) *RouterGroup {
|
2019-10-30 23:01:24 +08:00
|
|
|
if len(prefix) > 0 && prefix[0] != '/' {
|
2019-09-14 22:53:28 +08:00
|
|
|
prefix = "/" + prefix
|
|
|
|
}
|
2019-08-06 20:40:04 +08:00
|
|
|
if prefix == "/" {
|
|
|
|
prefix = ""
|
|
|
|
}
|
2019-12-04 10:03:03 +08:00
|
|
|
group := &RouterGroup{
|
2019-06-19 09:06:52 +08:00
|
|
|
server: s,
|
2019-08-06 20:40:04 +08:00
|
|
|
prefix: prefix,
|
2019-04-12 00:19:15 +08:00
|
|
|
}
|
2019-08-06 20:40:04 +08:00
|
|
|
if len(groups) > 0 {
|
|
|
|
for _, v := range groups {
|
2019-12-04 10:03:03 +08:00
|
|
|
v(group)
|
2019-08-06 20:40:04 +08:00
|
|
|
}
|
2019-06-19 09:06:52 +08:00
|
|
|
}
|
2019-12-04 10:03:03 +08:00
|
|
|
return group
|
2018-12-19 14:45:39 +08:00
|
|
|
}
|
|
|
|
|
2019-12-04 13:55:08 +08:00
|
|
|
// Group creates and returns a RouterGroup object, which is bound to a specified domain.
|
2019-11-30 20:41:53 +08:00
|
|
|
func (d *Domain) Group(prefix string, groups ...func(group *RouterGroup)) *RouterGroup {
|
2019-10-30 23:01:24 +08:00
|
|
|
if len(prefix) > 0 && prefix[0] != '/' {
|
|
|
|
prefix = "/" + prefix
|
|
|
|
}
|
2019-08-06 20:40:04 +08:00
|
|
|
if prefix == "/" {
|
|
|
|
prefix = ""
|
|
|
|
}
|
2021-11-07 21:31:33 +08:00
|
|
|
routerGroup := &RouterGroup{
|
2019-07-28 17:37:13 +08:00
|
|
|
domain: d,
|
2021-11-07 21:31:33 +08:00
|
|
|
server: d.server,
|
2019-08-06 20:40:04 +08:00
|
|
|
prefix: prefix,
|
2019-07-28 17:37:13 +08:00
|
|
|
}
|
2019-08-06 20:40:04 +08:00
|
|
|
if len(groups) > 0 {
|
2021-11-07 21:31:33 +08:00
|
|
|
for _, nestedGroup := range groups {
|
|
|
|
nestedGroup(routerGroup)
|
2019-08-06 20:40:04 +08:00
|
|
|
}
|
|
|
|
}
|
2021-11-07 21:31:33 +08:00
|
|
|
return routerGroup
|
2019-08-06 20:40:04 +08:00
|
|
|
}
|
|
|
|
|
2019-12-04 13:55:08 +08:00
|
|
|
// Group creates and returns a sub-group of current router group.
|
2019-11-30 20:41:53 +08:00
|
|
|
func (g *RouterGroup) Group(prefix string, groups ...func(group *RouterGroup)) *RouterGroup {
|
2019-08-06 20:40:04 +08:00
|
|
|
if prefix == "/" {
|
|
|
|
prefix = ""
|
|
|
|
}
|
2019-12-04 10:03:03 +08:00
|
|
|
group := &RouterGroup{
|
2019-08-06 20:40:04 +08:00
|
|
|
parent: g,
|
|
|
|
server: g.server,
|
|
|
|
domain: g.domain,
|
2019-08-10 14:10:47 +08:00
|
|
|
prefix: prefix,
|
2019-08-06 20:40:04 +08:00
|
|
|
}
|
2019-12-04 10:03:03 +08:00
|
|
|
if len(g.middleware) > 0 {
|
|
|
|
group.middleware = make([]HandlerFunc, len(g.middleware))
|
|
|
|
copy(group.middleware, g.middleware)
|
|
|
|
}
|
2019-08-06 20:40:04 +08:00
|
|
|
if len(groups) > 0 {
|
|
|
|
for _, v := range groups {
|
2019-12-04 10:03:03 +08:00
|
|
|
v(group)
|
2019-08-06 20:40:04 +08:00
|
|
|
}
|
2019-06-19 09:06:52 +08:00
|
|
|
}
|
2019-12-04 10:03:03 +08:00
|
|
|
return group
|
2018-12-20 21:04:43 +08:00
|
|
|
}
|
2018-12-19 14:45:39 +08:00
|
|
|
|
2019-12-04 13:55:08 +08:00
|
|
|
// Clone returns a new router group which is a clone of current group.
|
2019-08-06 20:40:04 +08:00
|
|
|
func (g *RouterGroup) Clone() *RouterGroup {
|
2019-12-04 10:03:03 +08:00
|
|
|
newGroup := &RouterGroup{
|
|
|
|
parent: g.parent,
|
|
|
|
server: g.server,
|
|
|
|
domain: g.domain,
|
|
|
|
prefix: g.prefix,
|
|
|
|
middleware: make([]HandlerFunc, len(g.middleware)),
|
2019-08-06 20:40:04 +08:00
|
|
|
}
|
2019-12-04 10:03:03 +08:00
|
|
|
copy(newGroup.middleware, g.middleware)
|
|
|
|
return newGroup
|
2019-08-06 20:40:04 +08:00
|
|
|
}
|
|
|
|
|
2019-12-04 13:55:08 +08:00
|
|
|
// Bind does batch route registering feature for router group.
|
2021-11-07 21:31:33 +08:00
|
|
|
func (g *RouterGroup) Bind(handlerOrObject ...interface{}) *RouterGroup {
|
2021-09-27 21:27:24 +08:00
|
|
|
var (
|
|
|
|
ctx = context.TODO()
|
|
|
|
group = g.Clone()
|
|
|
|
)
|
2021-11-07 21:31:33 +08:00
|
|
|
for _, v := range handlerOrObject {
|
|
|
|
var (
|
|
|
|
item = v
|
2022-03-11 10:24:42 +08:00
|
|
|
originValueAndKind = reflection.OriginValueAndKind(item)
|
2021-11-07 21:31:33 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
switch originValueAndKind.OriginKind {
|
|
|
|
case reflect.Func, reflect.Struct:
|
|
|
|
group = group.preBindToLocalArray(
|
|
|
|
groupBindTypeHandler,
|
|
|
|
"/",
|
|
|
|
item,
|
|
|
|
)
|
2019-08-06 20:40:04 +08:00
|
|
|
default:
|
2021-11-07 21:31:33 +08:00
|
|
|
g.server.Logger().Fatalf(ctx, "invalid bind parameter type: %v", originValueAndKind.InputValue.Type())
|
2019-06-19 09:06:52 +08:00
|
|
|
}
|
|
|
|
}
|
2019-08-06 20:40:04 +08:00
|
|
|
return group
|
2018-12-19 14:45:39 +08:00
|
|
|
}
|
|
|
|
|
2019-12-04 13:55:08 +08:00
|
|
|
// ALL registers a http handler to given route pattern and all http methods.
|
2019-08-06 20:40:04 +08:00
|
|
|
func (g *RouterGroup) ALL(pattern string, object interface{}, params ...interface{}) *RouterGroup {
|
2021-11-07 21:31:33 +08:00
|
|
|
return g.Clone().preBindToLocalArray(
|
|
|
|
groupBindTypeHandler,
|
|
|
|
defaultMethod+":"+pattern,
|
|
|
|
object,
|
|
|
|
params...,
|
|
|
|
)
|
2018-12-19 14:45:39 +08:00
|
|
|
}
|
|
|
|
|
2020-11-24 21:19:01 +08:00
|
|
|
// ALLMap registers http handlers for http methods using map.
|
2020-12-29 13:39:40 +08:00
|
|
|
func (g *RouterGroup) ALLMap(m map[string]interface{}) {
|
2020-11-24 21:19:01 +08:00
|
|
|
for pattern, object := range m {
|
2020-12-29 13:39:40 +08:00
|
|
|
g.ALL(pattern, object)
|
2020-11-24 21:19:01 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-08-19 20:59:08 +08:00
|
|
|
// Map registers http handlers for http methods using map.
|
|
|
|
func (g *RouterGroup) Map(m map[string]interface{}) {
|
|
|
|
for pattern, object := range m {
|
|
|
|
g.preBindToLocalArray(groupBindTypeHandler, pattern, object)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-12-04 13:55:08 +08:00
|
|
|
// GET registers a http handler to given route pattern and http method: GET.
|
2019-08-06 20:40:04 +08:00
|
|
|
func (g *RouterGroup) GET(pattern string, object interface{}, params ...interface{}) *RouterGroup {
|
2021-08-19 20:59:08 +08:00
|
|
|
return g.Clone().preBindToLocalArray(groupBindTypeHandler, "GET:"+pattern, object, params...)
|
2019-08-06 20:40:04 +08:00
|
|
|
}
|
|
|
|
|
2019-12-04 13:55:08 +08:00
|
|
|
// PUT registers a http handler to given route pattern and http method: PUT.
|
2019-08-06 20:40:04 +08:00
|
|
|
func (g *RouterGroup) PUT(pattern string, object interface{}, params ...interface{}) *RouterGroup {
|
2021-08-19 20:59:08 +08:00
|
|
|
return g.Clone().preBindToLocalArray(groupBindTypeHandler, "PUT:"+pattern, object, params...)
|
2019-08-06 20:40:04 +08:00
|
|
|
}
|
|
|
|
|
2019-12-04 13:55:08 +08:00
|
|
|
// POST registers a http handler to given route pattern and http method: POST.
|
2019-08-06 20:40:04 +08:00
|
|
|
func (g *RouterGroup) POST(pattern string, object interface{}, params ...interface{}) *RouterGroup {
|
2021-08-19 20:59:08 +08:00
|
|
|
return g.Clone().preBindToLocalArray(groupBindTypeHandler, "POST:"+pattern, object, params...)
|
2019-01-29 23:01:14 +08:00
|
|
|
}
|
|
|
|
|
2019-12-04 13:55:08 +08:00
|
|
|
// DELETE registers a http handler to given route pattern and http method: DELETE.
|
2019-08-06 20:40:04 +08:00
|
|
|
func (g *RouterGroup) DELETE(pattern string, object interface{}, params ...interface{}) *RouterGroup {
|
2021-08-19 20:59:08 +08:00
|
|
|
return g.Clone().preBindToLocalArray(groupBindTypeHandler, "DELETE:"+pattern, object, params...)
|
2018-12-19 14:45:39 +08:00
|
|
|
}
|
|
|
|
|
2019-12-04 13:55:08 +08:00
|
|
|
// PATCH registers a http handler to given route pattern and http method: PATCH.
|
2019-08-06 20:40:04 +08:00
|
|
|
func (g *RouterGroup) PATCH(pattern string, object interface{}, params ...interface{}) *RouterGroup {
|
2021-08-19 20:59:08 +08:00
|
|
|
return g.Clone().preBindToLocalArray(groupBindTypeHandler, "PATCH:"+pattern, object, params...)
|
2018-12-19 14:45:39 +08:00
|
|
|
}
|
|
|
|
|
2019-12-04 13:55:08 +08:00
|
|
|
// HEAD registers a http handler to given route pattern and http method: HEAD.
|
2019-08-06 20:40:04 +08:00
|
|
|
func (g *RouterGroup) HEAD(pattern string, object interface{}, params ...interface{}) *RouterGroup {
|
2021-08-19 20:59:08 +08:00
|
|
|
return g.Clone().preBindToLocalArray(groupBindTypeHandler, "HEAD:"+pattern, object, params...)
|
2018-12-19 14:45:39 +08:00
|
|
|
}
|
|
|
|
|
2019-12-04 13:55:08 +08:00
|
|
|
// CONNECT registers a http handler to given route pattern and http method: CONNECT.
|
2019-08-06 20:40:04 +08:00
|
|
|
func (g *RouterGroup) CONNECT(pattern string, object interface{}, params ...interface{}) *RouterGroup {
|
2021-08-19 20:59:08 +08:00
|
|
|
return g.Clone().preBindToLocalArray(groupBindTypeHandler, "CONNECT:"+pattern, object, params...)
|
2018-12-19 14:45:39 +08:00
|
|
|
}
|
|
|
|
|
2019-12-04 13:55:08 +08:00
|
|
|
// OPTIONS registers a http handler to given route pattern and http method: OPTIONS.
|
2019-08-06 20:40:04 +08:00
|
|
|
func (g *RouterGroup) OPTIONS(pattern string, object interface{}, params ...interface{}) *RouterGroup {
|
2021-08-19 20:59:08 +08:00
|
|
|
return g.Clone().preBindToLocalArray(groupBindTypeHandler, "OPTIONS:"+pattern, object, params...)
|
2018-12-19 14:45:39 +08:00
|
|
|
}
|
|
|
|
|
2019-12-04 13:55:08 +08:00
|
|
|
// TRACE registers a http handler to given route pattern and http method: TRACE.
|
2019-08-06 20:40:04 +08:00
|
|
|
func (g *RouterGroup) TRACE(pattern string, object interface{}, params ...interface{}) *RouterGroup {
|
2021-08-19 20:59:08 +08:00
|
|
|
return g.Clone().preBindToLocalArray(groupBindTypeHandler, "TRACE:"+pattern, object, params...)
|
2018-12-19 14:45:39 +08:00
|
|
|
}
|
|
|
|
|
2019-12-04 13:55:08 +08:00
|
|
|
// REST registers a http handler to given route pattern according to REST rule.
|
2019-08-06 20:40:04 +08:00
|
|
|
func (g *RouterGroup) REST(pattern string, object interface{}) *RouterGroup {
|
2021-08-19 20:59:08 +08:00
|
|
|
return g.Clone().preBindToLocalArray(groupBindTypeRest, pattern, object)
|
2018-12-19 14:45:39 +08:00
|
|
|
}
|
|
|
|
|
2019-12-04 13:55:08 +08:00
|
|
|
// Hook registers a hook to given route pattern.
|
2019-08-06 20:40:04 +08:00
|
|
|
func (g *RouterGroup) Hook(pattern string, hook string, handler HandlerFunc) *RouterGroup {
|
2021-08-19 20:59:08 +08:00
|
|
|
return g.Clone().preBindToLocalArray(groupBindTypeHandler, pattern, handler, hook)
|
2018-12-19 14:45:39 +08:00
|
|
|
}
|
|
|
|
|
2019-12-04 13:55:08 +08:00
|
|
|
// Middleware binds one or more middleware to the router group.
|
2019-08-06 20:40:04 +08:00
|
|
|
func (g *RouterGroup) Middleware(handlers ...HandlerFunc) *RouterGroup {
|
2019-12-04 10:03:03 +08:00
|
|
|
g.middleware = append(g.middleware, handlers...)
|
|
|
|
return g
|
2019-09-19 19:44:46 +08:00
|
|
|
}
|
|
|
|
|
2020-03-17 14:48:52 +08:00
|
|
|
// preBindToLocalArray adds the route registering parameters to internal variable array for lazily registering feature.
|
|
|
|
func (g *RouterGroup) preBindToLocalArray(bindType string, pattern string, object interface{}, params ...interface{}) *RouterGroup {
|
2021-12-10 18:52:35 +08:00
|
|
|
_, file, line := gdebug.CallerWithFilter([]string{utils.StackFilterKeyForGoFrame})
|
2020-03-24 19:48:10 +08:00
|
|
|
preBindItems = append(preBindItems, &preBindItem{
|
2019-08-06 20:40:04 +08:00
|
|
|
group: g,
|
|
|
|
bindType: bindType,
|
|
|
|
pattern: pattern,
|
|
|
|
object: object,
|
|
|
|
params: params,
|
2020-03-17 14:48:52 +08:00
|
|
|
source: fmt.Sprintf(`%s:%d`, file, line),
|
2019-08-06 20:40:04 +08:00
|
|
|
})
|
|
|
|
return g
|
2018-12-20 21:04:43 +08:00
|
|
|
}
|
2018-12-19 14:45:39 +08:00
|
|
|
|
2019-12-04 13:55:08 +08:00
|
|
|
// getPrefix returns the route prefix of the group, which recursively retrieves its parent's prefixo.
|
2019-08-06 20:40:04 +08:00
|
|
|
func (g *RouterGroup) getPrefix() string {
|
|
|
|
prefix := g.prefix
|
|
|
|
parent := g.parent
|
|
|
|
for parent != nil {
|
|
|
|
prefix = parent.prefix + prefix
|
|
|
|
parent = parent.parent
|
|
|
|
}
|
|
|
|
return prefix
|
2018-12-19 14:45:39 +08:00
|
|
|
}
|
|
|
|
|
2021-08-19 11:28:25 +08:00
|
|
|
// doBindRoutersToServer does really register for the group.
|
2021-09-27 21:27:24 +08:00
|
|
|
func (g *RouterGroup) doBindRoutersToServer(ctx context.Context, item *preBindItem) *RouterGroup {
|
2020-03-17 14:48:52 +08:00
|
|
|
var (
|
|
|
|
bindType = item.bindType
|
|
|
|
pattern = item.pattern
|
|
|
|
object = item.object
|
|
|
|
params = item.params
|
|
|
|
source = item.source
|
|
|
|
)
|
2019-08-06 20:40:04 +08:00
|
|
|
prefix := g.getPrefix()
|
2019-12-04 13:55:08 +08:00
|
|
|
// Route check.
|
2019-08-06 20:40:04 +08:00
|
|
|
if len(prefix) > 0 {
|
2019-06-19 09:06:52 +08:00
|
|
|
domain, method, path, err := g.server.parsePattern(pattern)
|
|
|
|
if err != nil {
|
2021-12-21 22:59:14 +08:00
|
|
|
g.server.Logger().Fatalf(ctx, "invalid route pattern: %s", pattern)
|
2019-06-19 09:06:52 +08:00
|
|
|
}
|
2021-08-19 11:28:25 +08:00
|
|
|
// If there is already a domain, unset the domain field in the pattern.
|
2019-10-24 19:44:30 +08:00
|
|
|
if g.domain != nil {
|
|
|
|
domain = ""
|
|
|
|
}
|
2021-08-19 20:59:08 +08:00
|
|
|
if bindType == groupBindTypeRest {
|
2021-11-07 21:31:33 +08:00
|
|
|
pattern = path
|
2019-06-25 23:03:29 +08:00
|
|
|
} else {
|
2020-03-17 14:48:52 +08:00
|
|
|
pattern = g.server.serveHandlerKey(
|
2021-11-07 21:31:33 +08:00
|
|
|
method, path, domain,
|
2020-03-17 14:48:52 +08:00
|
|
|
)
|
2019-06-19 09:06:52 +08:00
|
|
|
}
|
|
|
|
}
|
2019-12-04 13:55:08 +08:00
|
|
|
// Filter repeated char '/'.
|
2019-08-06 20:40:04 +08:00
|
|
|
pattern = gstr.Replace(pattern, "//", "/")
|
2021-08-19 20:59:08 +08:00
|
|
|
|
2019-12-04 13:55:08 +08:00
|
|
|
// Convert params to string array.
|
2019-08-06 20:40:04 +08:00
|
|
|
extras := gconv.Strings(params)
|
2021-08-19 20:59:08 +08:00
|
|
|
|
2019-12-04 13:55:08 +08:00
|
|
|
// Check whether it's a hook handler.
|
2019-08-06 20:40:04 +08:00
|
|
|
if _, ok := object.(HandlerFunc); ok && len(extras) > 0 {
|
2021-08-19 20:59:08 +08:00
|
|
|
bindType = groupBindTypeHook
|
2019-06-19 09:06:52 +08:00
|
|
|
}
|
|
|
|
switch bindType {
|
2021-08-19 20:59:08 +08:00
|
|
|
case groupBindTypeHandler:
|
2021-07-13 23:01:31 +08:00
|
|
|
if reflect.ValueOf(object).Kind() == reflect.Func {
|
|
|
|
funcInfo, err := g.server.checkAndCreateFuncInfo(object, "", "", "")
|
|
|
|
if err != nil {
|
2021-10-02 22:34:39 +08:00
|
|
|
g.server.Logger().Fatal(ctx, err.Error())
|
2021-07-13 23:01:31 +08:00
|
|
|
return g
|
|
|
|
}
|
2021-11-07 21:31:33 +08:00
|
|
|
in := doBindHandlerInput{
|
|
|
|
Prefix: prefix,
|
|
|
|
Pattern: pattern,
|
|
|
|
FuncInfo: funcInfo,
|
|
|
|
Middleware: g.middleware,
|
|
|
|
Source: source,
|
|
|
|
}
|
|
|
|
if g.domain != nil {
|
|
|
|
g.domain.doBindHandler(ctx, in)
|
2019-06-19 09:06:52 +08:00
|
|
|
} else {
|
2021-11-07 21:31:33 +08:00
|
|
|
g.server.doBindHandler(ctx, in)
|
2019-06-19 09:06:52 +08:00
|
|
|
}
|
|
|
|
} else {
|
2019-08-06 20:40:04 +08:00
|
|
|
if len(extras) > 0 {
|
2021-11-07 21:31:33 +08:00
|
|
|
if gstr.Contains(extras[0], ",") {
|
|
|
|
in := doBindObjectInput{
|
|
|
|
Prefix: prefix,
|
|
|
|
Pattern: pattern,
|
|
|
|
Object: object,
|
|
|
|
Method: extras[0],
|
|
|
|
Middleware: g.middleware,
|
|
|
|
Source: source,
|
|
|
|
}
|
|
|
|
if g.domain != nil {
|
|
|
|
g.domain.doBindObject(ctx, in)
|
2020-03-11 10:10:00 +08:00
|
|
|
} else {
|
2021-11-07 21:31:33 +08:00
|
|
|
g.server.doBindObject(ctx, in)
|
2020-03-11 10:10:00 +08:00
|
|
|
}
|
2019-06-19 09:06:52 +08:00
|
|
|
} else {
|
2021-11-07 21:31:33 +08:00
|
|
|
in := doBindObjectMethodInput{
|
|
|
|
Prefix: prefix,
|
|
|
|
Pattern: pattern,
|
|
|
|
Object: object,
|
|
|
|
Method: extras[0],
|
|
|
|
Middleware: g.middleware,
|
|
|
|
Source: source,
|
|
|
|
}
|
|
|
|
if g.domain != nil {
|
|
|
|
g.domain.doBindObjectMethod(ctx, in)
|
2020-03-11 10:10:00 +08:00
|
|
|
} else {
|
2021-11-07 21:31:33 +08:00
|
|
|
g.server.doBindObjectMethod(ctx, in)
|
2020-03-11 10:10:00 +08:00
|
|
|
}
|
2019-06-19 09:06:52 +08:00
|
|
|
}
|
|
|
|
} else {
|
2021-11-07 21:31:33 +08:00
|
|
|
in := doBindObjectInput{
|
|
|
|
Prefix: prefix,
|
|
|
|
Pattern: pattern,
|
|
|
|
Object: object,
|
|
|
|
Method: "",
|
|
|
|
Middleware: g.middleware,
|
|
|
|
Source: source,
|
|
|
|
}
|
2021-07-13 23:01:31 +08:00
|
|
|
// At last, it treats the `object` as Object registering type.
|
2021-11-07 21:31:33 +08:00
|
|
|
if g.domain != nil {
|
|
|
|
g.domain.doBindObject(ctx, in)
|
2019-06-19 09:06:52 +08:00
|
|
|
} else {
|
2021-11-07 21:31:33 +08:00
|
|
|
g.server.doBindObject(ctx, in)
|
2019-06-19 09:06:52 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2021-07-13 23:01:31 +08:00
|
|
|
|
2021-08-19 20:59:08 +08:00
|
|
|
case groupBindTypeRest:
|
2021-11-07 21:31:33 +08:00
|
|
|
in := doBindObjectInput{
|
|
|
|
Prefix: prefix,
|
|
|
|
Pattern: pattern,
|
|
|
|
Object: object,
|
|
|
|
Method: "",
|
|
|
|
Middleware: g.middleware,
|
|
|
|
Source: source,
|
|
|
|
}
|
|
|
|
if g.domain != nil {
|
|
|
|
g.domain.doBindObjectRest(ctx, in)
|
2019-06-19 09:06:52 +08:00
|
|
|
} else {
|
2021-11-07 21:31:33 +08:00
|
|
|
g.server.doBindObjectRest(ctx, in)
|
2019-06-19 09:06:52 +08:00
|
|
|
}
|
2021-07-13 23:01:31 +08:00
|
|
|
|
2021-08-19 20:59:08 +08:00
|
|
|
case groupBindTypeHook:
|
2021-11-07 21:31:33 +08:00
|
|
|
if handler, ok := object.(HandlerFunc); ok {
|
|
|
|
in := doBindHookHandlerInput{
|
|
|
|
Prefix: prefix,
|
|
|
|
Pattern: pattern,
|
|
|
|
HookName: extras[0],
|
|
|
|
Handler: handler,
|
|
|
|
Source: source,
|
|
|
|
}
|
|
|
|
if g.domain != nil {
|
|
|
|
g.domain.doBindHookHandler(ctx, in)
|
2019-06-19 09:06:52 +08:00
|
|
|
} else {
|
2021-11-07 21:31:33 +08:00
|
|
|
g.server.doBindHookHandler(ctx, in)
|
2019-06-19 09:06:52 +08:00
|
|
|
}
|
|
|
|
} else {
|
2021-09-27 21:27:24 +08:00
|
|
|
g.server.Logger().Fatalf(ctx, "invalid hook handler for pattern: %s", pattern)
|
2019-06-19 09:06:52 +08:00
|
|
|
}
|
|
|
|
}
|
2019-08-06 20:40:04 +08:00
|
|
|
return g
|
2018-12-19 14:45:39 +08:00
|
|
|
}
|