2019-02-02 16:18:25 +08:00
|
|
|
// Copyright 2018 gf Author(https://github.com/gogf/gf). 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 (
|
2020-03-17 14:48:52 +08:00
|
|
|
"fmt"
|
|
|
|
"github.com/gogf/gf/debug/gdebug"
|
2019-06-19 09:06:52 +08:00
|
|
|
"reflect"
|
|
|
|
"strings"
|
2019-06-25 23:03:29 +08:00
|
|
|
|
2019-08-06 20:40:04 +08:00
|
|
|
"github.com/gogf/gf/text/gstr"
|
|
|
|
|
2019-07-29 21:01:19 +08:00
|
|
|
"github.com/gogf/gf/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
|
|
|
// GroupItem is item for router group.
|
|
|
|
GroupItem = []interface{}
|
|
|
|
|
|
|
|
// 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
|
|
|
|
|
|
|
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.
|
2019-08-06 20:40:04 +08:00
|
|
|
func (s *Server) handlePreBindItems() {
|
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
|
|
|
|
}
|
2020-03-17 14:48:52 +08:00
|
|
|
item.group.doBindRoutersToServer(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 = ""
|
|
|
|
}
|
2019-12-04 10:03:03 +08:00
|
|
|
group := &RouterGroup{
|
2019-07-28 17:37:13 +08:00
|
|
|
domain: d,
|
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 {
|
|
|
|
for _, v := range groups {
|
2019-12-04 10:03:03 +08:00
|
|
|
v(group)
|
2019-08-06 20:40:04 +08:00
|
|
|
}
|
|
|
|
}
|
2019-12-04 10:03:03 +08:00
|
|
|
return group
|
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.
|
2019-08-06 20:40:04 +08:00
|
|
|
func (g *RouterGroup) Bind(items []GroupItem) *RouterGroup {
|
|
|
|
group := g.Clone()
|
2019-06-19 09:06:52 +08:00
|
|
|
for _, item := range items {
|
|
|
|
if len(item) < 3 {
|
2020-01-21 15:42:08 +08:00
|
|
|
g.server.Logger().Fatalf("invalid router item: %s", item)
|
2019-06-19 09:06:52 +08:00
|
|
|
}
|
2019-08-06 20:40:04 +08:00
|
|
|
bindType := gstr.ToUpper(gconv.String(item[0]))
|
|
|
|
switch bindType {
|
|
|
|
case "REST":
|
2020-03-17 14:48:52 +08:00
|
|
|
group.preBindToLocalArray("REST", gconv.String(item[0])+":"+gconv.String(item[1]), item[2])
|
2019-08-06 20:40:04 +08:00
|
|
|
case "MIDDLEWARE":
|
2020-03-17 14:48:52 +08:00
|
|
|
group.preBindToLocalArray("MIDDLEWARE", gconv.String(item[0])+":"+gconv.String(item[1]), item[2])
|
2019-08-06 20:40:04 +08:00
|
|
|
default:
|
|
|
|
if strings.EqualFold(bindType, "ALL") {
|
|
|
|
bindType = ""
|
2019-06-25 23:26:47 +08:00
|
|
|
} else {
|
2019-08-06 20:40:04 +08:00
|
|
|
bindType += ":"
|
2019-06-25 23:26:47 +08:00
|
|
|
}
|
2019-06-19 09:06:52 +08:00
|
|
|
if len(item) > 3 {
|
2020-03-17 14:48:52 +08:00
|
|
|
group.preBindToLocalArray("HANDLER", bindType+gconv.String(item[1]), item[2], item[3])
|
2019-06-19 09:06:52 +08:00
|
|
|
} else {
|
2020-03-17 14:48:52 +08:00
|
|
|
group.preBindToLocalArray("HANDLER", bindType+gconv.String(item[1]), item[2])
|
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 {
|
2020-03-17 14:48:52 +08:00
|
|
|
return g.Clone().preBindToLocalArray("HANDLER", gDEFAULT_METHOD+":"+pattern, object, params...)
|
2018-12-19 14:45:39 +08:00
|
|
|
}
|
|
|
|
|
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 {
|
2020-03-17 14:48:52 +08:00
|
|
|
return g.Clone().preBindToLocalArray("HANDLER", "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 {
|
2020-03-17 14:48:52 +08:00
|
|
|
return g.Clone().preBindToLocalArray("HANDLER", "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 {
|
2020-03-17 14:48:52 +08:00
|
|
|
return g.Clone().preBindToLocalArray("HANDLER", "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 {
|
2020-03-17 14:48:52 +08:00
|
|
|
return g.Clone().preBindToLocalArray("HANDLER", "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 {
|
2020-03-17 14:48:52 +08:00
|
|
|
return g.Clone().preBindToLocalArray("HANDLER", "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 {
|
2020-03-17 14:48:52 +08:00
|
|
|
return g.Clone().preBindToLocalArray("HANDLER", "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 {
|
2020-03-17 14:48:52 +08:00
|
|
|
return g.Clone().preBindToLocalArray("HANDLER", "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 {
|
2020-03-17 14:48:52 +08:00
|
|
|
return g.Clone().preBindToLocalArray("HANDLER", "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 {
|
2020-03-17 14:48:52 +08:00
|
|
|
return g.Clone().preBindToLocalArray("HANDLER", "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 {
|
2020-03-17 14:48:52 +08:00
|
|
|
return g.Clone().preBindToLocalArray("REST", 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 {
|
2020-03-17 14:48:52 +08:00
|
|
|
return g.Clone().preBindToLocalArray("HANDLER", 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 {
|
|
|
|
_, file, line := gdebug.CallerWithFilter(gFILTER_KEY)
|
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
|
|
|
}
|
|
|
|
|
2020-03-17 14:48:52 +08:00
|
|
|
// doBindRoutersToServer does really registering for the group.
|
2020-03-24 19:48:10 +08:00
|
|
|
func (g *RouterGroup) doBindRoutersToServer(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 {
|
2020-01-21 15:42:08 +08:00
|
|
|
g.server.Logger().Fatalf("invalid pattern: %s", pattern)
|
2019-06-19 09:06:52 +08:00
|
|
|
}
|
2019-10-24 19:44:30 +08:00
|
|
|
// If there'a already a domain, unset the domain field in the pattern.
|
|
|
|
if g.domain != nil {
|
|
|
|
domain = ""
|
|
|
|
}
|
2019-06-25 23:03:29 +08:00
|
|
|
if bindType == "REST" {
|
2019-08-06 20:40:04 +08:00
|
|
|
pattern = prefix + "/" + strings.TrimLeft(path, "/")
|
2019-06-25 23:03:29 +08:00
|
|
|
} else {
|
2020-03-17 14:48:52 +08:00
|
|
|
pattern = g.server.serveHandlerKey(
|
|
|
|
method, prefix+"/"+strings.TrimLeft(path, "/"), domain,
|
|
|
|
)
|
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, "//", "/")
|
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)
|
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 {
|
2019-06-19 09:06:52 +08:00
|
|
|
bindType = "HOOK"
|
|
|
|
}
|
|
|
|
switch bindType {
|
|
|
|
case "HANDLER":
|
|
|
|
if h, ok := object.(HandlerFunc); ok {
|
|
|
|
if g.server != nil {
|
2020-03-17 14:48:52 +08:00
|
|
|
g.server.doBindHandler(pattern, h, g.middleware, source)
|
2019-06-19 09:06:52 +08:00
|
|
|
} else {
|
2020-03-17 14:48:52 +08:00
|
|
|
g.domain.doBindHandler(pattern, h, g.middleware, source)
|
2019-06-19 09:06:52 +08:00
|
|
|
}
|
|
|
|
} else if g.isController(object) {
|
2019-08-06 20:40:04 +08:00
|
|
|
if len(extras) > 0 {
|
2019-06-19 09:06:52 +08:00
|
|
|
if g.server != nil {
|
2020-03-11 15:51:24 +08:00
|
|
|
if gstr.Contains(extras[0], ",") {
|
2020-03-17 14:48:52 +08:00
|
|
|
g.server.doBindController(
|
|
|
|
pattern, object.(Controller), extras[0], g.middleware, source,
|
|
|
|
)
|
2020-03-11 15:51:24 +08:00
|
|
|
} else {
|
2020-03-17 14:48:52 +08:00
|
|
|
g.server.doBindControllerMethod(
|
|
|
|
pattern, object.(Controller), extras[0], g.middleware, source,
|
|
|
|
)
|
2020-03-11 15:51:24 +08:00
|
|
|
}
|
2019-06-19 09:06:52 +08:00
|
|
|
} else {
|
2020-03-11 15:51:24 +08:00
|
|
|
if gstr.Contains(extras[0], ",") {
|
2020-03-17 14:48:52 +08:00
|
|
|
g.domain.doBindController(
|
|
|
|
pattern, object.(Controller), extras[0], g.middleware, source,
|
|
|
|
)
|
2020-03-11 15:51:24 +08:00
|
|
|
} else {
|
2020-03-17 14:48:52 +08:00
|
|
|
g.domain.doBindControllerMethod(
|
|
|
|
pattern, object.(Controller), extras[0], g.middleware, source,
|
|
|
|
)
|
2020-03-11 15:51:24 +08:00
|
|
|
}
|
2019-06-19 09:06:52 +08:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if g.server != nil {
|
2020-03-17 14:48:52 +08:00
|
|
|
g.server.doBindController(
|
|
|
|
pattern, object.(Controller), "", g.middleware, source,
|
|
|
|
)
|
2019-06-19 09:06:52 +08:00
|
|
|
} else {
|
2020-03-17 14:48:52 +08:00
|
|
|
g.domain.doBindController(
|
|
|
|
pattern, object.(Controller), "", g.middleware, source,
|
|
|
|
)
|
2019-06-19 09:06:52 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
2019-08-06 20:40:04 +08:00
|
|
|
if len(extras) > 0 {
|
2019-06-19 09:06:52 +08:00
|
|
|
if g.server != nil {
|
2020-03-11 10:10:00 +08:00
|
|
|
if gstr.Contains(extras[0], ",") {
|
2020-03-17 14:48:52 +08:00
|
|
|
g.server.doBindObject(
|
|
|
|
pattern, object, extras[0], g.middleware, source,
|
|
|
|
)
|
2020-03-11 10:10:00 +08:00
|
|
|
} else {
|
2020-03-17 14:48:52 +08:00
|
|
|
g.server.doBindObjectMethod(
|
|
|
|
pattern, object, extras[0], g.middleware, source,
|
|
|
|
)
|
2020-03-11 10:10:00 +08:00
|
|
|
}
|
2019-06-19 09:06:52 +08:00
|
|
|
} else {
|
2020-03-11 10:10:00 +08:00
|
|
|
if gstr.Contains(extras[0], ",") {
|
2020-03-17 14:48:52 +08:00
|
|
|
g.domain.doBindObject(
|
|
|
|
pattern, object, extras[0], g.middleware, source,
|
|
|
|
)
|
2020-03-11 10:10:00 +08:00
|
|
|
} else {
|
2020-03-17 14:48:52 +08:00
|
|
|
g.domain.doBindObjectMethod(
|
|
|
|
pattern, object, extras[0], g.middleware, source,
|
|
|
|
)
|
2020-03-11 10:10:00 +08:00
|
|
|
}
|
2019-06-19 09:06:52 +08:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if g.server != nil {
|
2020-03-17 14:48:52 +08:00
|
|
|
g.server.doBindObject(pattern, object, "", g.middleware, source)
|
2019-06-19 09:06:52 +08:00
|
|
|
} else {
|
2020-03-17 14:48:52 +08:00
|
|
|
g.domain.doBindObject(pattern, object, "", g.middleware, source)
|
2019-06-19 09:06:52 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
case "REST":
|
|
|
|
if g.isController(object) {
|
|
|
|
if g.server != nil {
|
2020-03-17 14:48:52 +08:00
|
|
|
g.server.doBindControllerRest(
|
|
|
|
pattern, object.(Controller), g.middleware, source,
|
|
|
|
)
|
2019-06-19 09:06:52 +08:00
|
|
|
} else {
|
2020-03-17 14:48:52 +08:00
|
|
|
g.domain.doBindControllerRest(
|
|
|
|
pattern, object.(Controller), g.middleware, source,
|
|
|
|
)
|
2019-06-19 09:06:52 +08:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if g.server != nil {
|
2020-03-17 14:48:52 +08:00
|
|
|
g.server.doBindObjectRest(pattern, object, g.middleware, source)
|
2019-06-19 09:06:52 +08:00
|
|
|
} else {
|
2020-03-17 14:48:52 +08:00
|
|
|
g.domain.doBindObjectRest(pattern, object, g.middleware, source)
|
2019-06-19 09:06:52 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
case "HOOK":
|
|
|
|
if h, ok := object.(HandlerFunc); ok {
|
|
|
|
if g.server != nil {
|
2020-03-17 14:48:52 +08:00
|
|
|
g.server.doBindHookHandler(pattern, extras[0], h, source)
|
2019-06-19 09:06:52 +08:00
|
|
|
} else {
|
2020-03-17 14:48:52 +08:00
|
|
|
g.domain.doBindHookHandler(pattern, extras[0], h, source)
|
2019-06-19 09:06:52 +08:00
|
|
|
}
|
|
|
|
} else {
|
2020-03-17 14:48:52 +08:00
|
|
|
g.server.Logger().Fatalf("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
|
|
|
}
|
2018-12-25 23:20:43 +08:00
|
|
|
|
2019-12-04 13:55:08 +08:00
|
|
|
// isController checks and returns whether given <value> is a controller.
|
|
|
|
// A controller should contains attributes: Request/Response/Server/Cookie/Session/View.
|
2018-12-25 23:20:43 +08:00
|
|
|
func (g *RouterGroup) isController(value interface{}) bool {
|
2019-12-04 13:55:08 +08:00
|
|
|
// Whether implements interface Controller.
|
2019-06-19 09:06:52 +08:00
|
|
|
if _, ok := value.(Controller); !ok {
|
|
|
|
return false
|
|
|
|
}
|
2019-12-04 13:55:08 +08:00
|
|
|
// Check the necessary attributes.
|
2019-06-19 09:06:52 +08:00
|
|
|
v := reflect.ValueOf(value)
|
|
|
|
if v.Kind() == reflect.Ptr {
|
|
|
|
v = v.Elem()
|
|
|
|
}
|
2019-12-04 10:03:03 +08:00
|
|
|
if v.FieldByName("Request").IsValid() &&
|
|
|
|
v.FieldByName("Response").IsValid() &&
|
|
|
|
v.FieldByName("Server").IsValid() &&
|
|
|
|
v.FieldByName("Cookie").IsValid() &&
|
|
|
|
v.FieldByName("Session").IsValid() &&
|
|
|
|
v.FieldByName("View").IsValid() {
|
2019-06-19 09:06:52 +08:00
|
|
|
return true
|
|
|
|
}
|
|
|
|
return false
|
2018-12-25 23:20:43 +08:00
|
|
|
}
|