mirror of
https://gitee.com/johng/gf
synced 2026-07-08 22:40:30 +08:00
export router map api for ghttp.Server; comment update for ghttp.Server
This commit is contained in:
@ -61,6 +61,16 @@ type (
|
||||
Priority int // 优先级,用于链表排序,值越大优先级越高
|
||||
}
|
||||
|
||||
// Router item just for dumping.
|
||||
RouterItem struct {
|
||||
Middleware string
|
||||
Domain string
|
||||
Method string
|
||||
Route string
|
||||
Priority int
|
||||
handler *handlerItem
|
||||
}
|
||||
|
||||
// 路由函数注册信息
|
||||
handlerItem struct {
|
||||
itemId int // 用于标识该注册函数的唯一性ID
|
||||
@ -238,22 +248,23 @@ func GetServer(name ...interface{}) *Server {
|
||||
// 作为守护协程异步执行(当同一进程中存在多个Web Server时,需要采用这种方式执行),
|
||||
// 需要结合Wait方式一起使用.
|
||||
func (s *Server) Start() error {
|
||||
// 预处理路由注册项
|
||||
// Register group routes.
|
||||
s.handlePreBindItems()
|
||||
|
||||
// 服务进程初始化,只会初始化一次
|
||||
// Server process initialization, which can only be initialized once.
|
||||
serverProcessInit()
|
||||
|
||||
// 当前Web Server状态判断
|
||||
// Server can only be run once.
|
||||
if s.Status() == SERVER_STATUS_RUNNING {
|
||||
return errors.New("[ghttp] server is already running")
|
||||
}
|
||||
|
||||
// 没有注册任何路由,且没有开启文件服务,那么提示错误
|
||||
// If there's no route registered and no static service enabled,
|
||||
// it then returns an error of invalid usage of server.
|
||||
if len(s.routesMap) == 0 && !s.config.FileServerEnabled {
|
||||
return errors.New(`[ghttp] there's no route set or static feature enabled, did you forget import the router?`)
|
||||
}
|
||||
// Logging.
|
||||
// Logging path setting check.
|
||||
if s.config.LogPath != "" {
|
||||
if err := s.config.Logger.SetPath(s.config.LogPath); err != nil {
|
||||
return errors.New(fmt.Sprintf("[ghttp] set log path '%s' error: %v", s.config.LogPath, err))
|
||||
@ -302,7 +313,7 @@ func (s *Server) Start() error {
|
||||
s.startServer(nil)
|
||||
}
|
||||
|
||||
// 如果是子进程,那么服务开启后通知父进程销毁
|
||||
// If this is a child process, it then notifies its parent exit.
|
||||
if gproc.IsChild() {
|
||||
gtimer.SetTimeout(2*time.Second, func() {
|
||||
if err := gproc.Send(gproc.PPid(), []byte("exit"), gADMIN_GPROC_COMM_GROUP); err != nil {
|
||||
@ -311,87 +322,99 @@ func (s *Server) Start() error {
|
||||
})
|
||||
}
|
||||
|
||||
// 打印展示路由表
|
||||
s.DumpRoutesMap()
|
||||
s.DumpRouterMap()
|
||||
return nil
|
||||
}
|
||||
|
||||
// 打印展示路由表
|
||||
func (s *Server) DumpRoutesMap() {
|
||||
if s.config.DumpRouteMap && len(s.routesMap) > 0 {
|
||||
glog.Header(false).Println(fmt.Sprintf("\n%s", s.getRouteMapString()))
|
||||
// DumpRouterMap dumps the router map to the log.
|
||||
func (s *Server) DumpRouterMap() {
|
||||
if s.config.DumpRouterMap && len(s.routesMap) > 0 {
|
||||
buffer := bytes.NewBuffer(nil)
|
||||
table := tablewriter.NewWriter(buffer)
|
||||
table.SetHeader([]string{"SERVER", "ADDRESS", "DOMAIN", "METHOD", "P", "ROUTE", "HANDLER", "MIDDLEWARE"})
|
||||
table.SetRowLine(true)
|
||||
table.SetBorder(false)
|
||||
table.SetCenterSeparator("|")
|
||||
table.SetColumnAlignment([]int{
|
||||
tablewriter.ALIGN_CENTER,
|
||||
tablewriter.ALIGN_CENTER,
|
||||
tablewriter.ALIGN_CENTER,
|
||||
tablewriter.ALIGN_CENTER,
|
||||
tablewriter.ALIGN_CENTER,
|
||||
tablewriter.ALIGN_LEFT,
|
||||
tablewriter.ALIGN_LEFT,
|
||||
tablewriter.ALIGN_LEFT,
|
||||
})
|
||||
|
||||
address := s.config.Address
|
||||
if s.config.HTTPSAddr != "" {
|
||||
if len(address) > 0 {
|
||||
address += ","
|
||||
}
|
||||
address += "tls" + s.config.HTTPSAddr
|
||||
}
|
||||
for _, array := range s.GetRouterMap() {
|
||||
data := make([]string, 8)
|
||||
for _, item := range array {
|
||||
data[0] = s.name
|
||||
data[1] = address
|
||||
data[2] = item.Domain
|
||||
data[3] = item.Method
|
||||
data[4] = gconv.String(len(strings.Split(item.Route, "/")) - 1 + item.Priority)
|
||||
data[5] = item.Route
|
||||
data[6] = item.handler.itemName
|
||||
data[7] = item.Middleware
|
||||
table.Append(data)
|
||||
}
|
||||
}
|
||||
table.Render()
|
||||
s.config.Logger.Header(false).Printf("\n%s", buffer.String())
|
||||
}
|
||||
}
|
||||
|
||||
// 获得路由表(格式化字符串)
|
||||
func (s *Server) getRouteMapString() string {
|
||||
// Route table for dumping.
|
||||
type tableItem struct {
|
||||
middleware string
|
||||
domain string
|
||||
method string
|
||||
route string
|
||||
handler *handlerItem
|
||||
priority int
|
||||
}
|
||||
|
||||
buf := bytes.NewBuffer(nil)
|
||||
table := tablewriter.NewWriter(buf)
|
||||
table.SetHeader([]string{"SERVER", "ADDRESS", "DOMAIN", "METHOD", "P", "ROUTE", "HANDLER", "MIDDLEWARE"})
|
||||
table.SetRowLine(true)
|
||||
table.SetBorder(false)
|
||||
table.SetCenterSeparator("|")
|
||||
table.SetColumnAlignment([]int{
|
||||
tablewriter.ALIGN_CENTER,
|
||||
tablewriter.ALIGN_CENTER,
|
||||
tablewriter.ALIGN_CENTER,
|
||||
tablewriter.ALIGN_CENTER,
|
||||
tablewriter.ALIGN_CENTER,
|
||||
tablewriter.ALIGN_LEFT,
|
||||
tablewriter.ALIGN_LEFT,
|
||||
tablewriter.ALIGN_LEFT,
|
||||
})
|
||||
|
||||
// GetRouterMap retrieves and returns the router map.
|
||||
// The key of the returned map is the domain of the server.
|
||||
func (s *Server) GetRouterMap() map[string][]RouterItem {
|
||||
m := make(map[string]*garray.SortedArray)
|
||||
for k, registeredItems := range s.routesMap {
|
||||
array, _ := gregex.MatchString(`(.*?)%([A-Z]+):(.+)@(.+)`, k)
|
||||
for index, registeredItem := range registeredItems {
|
||||
item := &tableItem{
|
||||
middleware: array[1],
|
||||
domain: array[4],
|
||||
method: array[2],
|
||||
route: array[3],
|
||||
item := RouterItem{
|
||||
Middleware: array[1],
|
||||
Domain: array[4],
|
||||
Method: array[2],
|
||||
Route: array[3],
|
||||
Priority: len(registeredItems) - index - 1,
|
||||
handler: registeredItem.handler,
|
||||
priority: len(registeredItems) - index - 1,
|
||||
}
|
||||
if item.handler.itemType == gHANDLER_TYPE_MIDDLEWARE {
|
||||
item.middleware = "GLOBAL MIDDLEWARE"
|
||||
item.Middleware = "GLOBAL MIDDLEWARE"
|
||||
}
|
||||
if len(item.handler.middleware) > 0 {
|
||||
for _, v := range item.handler.middleware {
|
||||
if item.middleware != "" {
|
||||
item.middleware += ","
|
||||
if item.Middleware != "" {
|
||||
item.Middleware += ","
|
||||
}
|
||||
item.middleware += gdebug.FuncName(v)
|
||||
item.Middleware += gdebug.FuncName(v)
|
||||
}
|
||||
}
|
||||
// If the domain does not exist in the dump map, it create the map.
|
||||
// The value of the map is a custom sorted array.
|
||||
if _, ok := m[item.domain]; !ok {
|
||||
if _, ok := m[item.Domain]; !ok {
|
||||
// Sort in ASC order.
|
||||
m[item.domain] = garray.NewSortedArraySize(100, func(v1, v2 interface{}) int {
|
||||
item1 := v1.(*tableItem)
|
||||
item2 := v2.(*tableItem)
|
||||
m[item.Domain] = garray.NewSortedArraySize(100, func(v1, v2 interface{}) int {
|
||||
item1 := v1.(RouterItem)
|
||||
item2 := v2.(RouterItem)
|
||||
r := 0
|
||||
if r = strings.Compare(item1.domain, item2.domain); r == 0 {
|
||||
if r = strings.Compare(item1.route, item2.route); r == 0 {
|
||||
if r = strings.Compare(item1.method, item2.method); r == 0 {
|
||||
if r = strings.Compare(item1.Domain, item2.Domain); r == 0 {
|
||||
if r = strings.Compare(item1.Route, item2.Route); r == 0 {
|
||||
if r = strings.Compare(item1.Method, item2.Method); r == 0 {
|
||||
if item1.handler.itemType == gHANDLER_TYPE_MIDDLEWARE && item2.handler.itemType != gHANDLER_TYPE_MIDDLEWARE {
|
||||
return -1
|
||||
} else if item1.handler.itemType == gHANDLER_TYPE_MIDDLEWARE && item2.handler.itemType == gHANDLER_TYPE_MIDDLEWARE {
|
||||
return 1
|
||||
} else if r = strings.Compare(item1.middleware, item2.middleware); r == 0 {
|
||||
r = item2.priority - item1.priority
|
||||
} else if r = strings.Compare(item1.Middleware, item2.Middleware); r == 0 {
|
||||
r = item2.Priority - item1.Priority
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -399,51 +422,36 @@ func (s *Server) getRouteMapString() string {
|
||||
return r
|
||||
})
|
||||
}
|
||||
m[item.domain].Add(item)
|
||||
m[item.Domain].Add(item)
|
||||
}
|
||||
}
|
||||
itemFunc := s.config.Address
|
||||
if s.config.HTTPSAddr != "" {
|
||||
if len(itemFunc) > 0 {
|
||||
itemFunc += ","
|
||||
routerMap := make(map[string][]RouterItem, len(m))
|
||||
for domain, array := range m {
|
||||
if routerMap[domain] == nil {
|
||||
routerMap[domain] = make([]RouterItem, array.Len())
|
||||
}
|
||||
itemFunc += "tls" + s.config.HTTPSAddr
|
||||
}
|
||||
for _, a := range m {
|
||||
data := make([]string, 8)
|
||||
for _, v := range a.Slice() {
|
||||
item := v.(*tableItem)
|
||||
data[0] = s.name
|
||||
data[1] = itemFunc
|
||||
data[2] = item.domain
|
||||
data[3] = item.method
|
||||
data[4] = gconv.String(len(strings.Split(item.route, "/")) - 1 + item.priority)
|
||||
data[5] = item.route
|
||||
data[6] = item.handler.itemName
|
||||
data[7] = item.middleware
|
||||
table.Append(data)
|
||||
for k, v := range array.Slice() {
|
||||
routerMap[domain][k] = v.(RouterItem)
|
||||
}
|
||||
}
|
||||
table.Render()
|
||||
|
||||
return buf.String()
|
||||
return routerMap
|
||||
}
|
||||
|
||||
// 阻塞执行监听
|
||||
// Run starts server listening in blocking way.
|
||||
func (s *Server) Run() {
|
||||
if err := s.Start(); err != nil {
|
||||
glog.Fatal(err)
|
||||
}
|
||||
// 阻塞等待服务执行完成
|
||||
|
||||
// Blocking using channel.
|
||||
<-s.closeChan
|
||||
|
||||
glog.Printf("[ghttp] %d: all servers shutdown", gproc.Pid())
|
||||
}
|
||||
|
||||
// 阻塞等待所有Web Server停止,常用于多Web Server场景,以及需要将Web Server异步运行的场景
|
||||
// 这是一个与进程相关的方法
|
||||
// Wait blocks to wait for all servers done.
|
||||
// It's commonly used in multiple servers situation.
|
||||
func Wait() {
|
||||
// 阻塞等待服务执行完成
|
||||
<-allDoneChan
|
||||
|
||||
glog.Printf("[ghttp] %d: all servers shutdown", gproc.Pid())
|
||||
|
||||
@ -73,7 +73,7 @@ type ServerConfig struct {
|
||||
PProfPattern string // PProf: PProf service pattern for router.
|
||||
FormParsingMemory int64 // Other: Max memory in bytes which can be used for parsing multimedia form.
|
||||
NameToUriType int // Other: Type for converting struct method name to URI when registering routes.
|
||||
DumpRouteMap bool // Other: Whether automatically dump route map when server starts.
|
||||
DumpRouterMap bool // Other: Whether automatically dump router map when server starts.
|
||||
}
|
||||
|
||||
// defaultServerConfig is the default configuration object for server.
|
||||
@ -105,7 +105,7 @@ var defaultServerConfig = ServerConfig{
|
||||
ErrorLogPattern: "error-{Ymd}.log",
|
||||
AccessLogEnabled: false,
|
||||
AccessLogPattern: "access-{Ymd}.log",
|
||||
DumpRouteMap: true,
|
||||
DumpRouterMap: true,
|
||||
FormParsingMemory: 100 * 1024 * 1024, // 100MB
|
||||
Rewrites: make(map[string]string),
|
||||
}
|
||||
|
||||
@ -10,8 +10,8 @@ func (s *Server) SetNameToUriType(t int) {
|
||||
s.config.NameToUriType = t
|
||||
}
|
||||
|
||||
func (s *Server) SetDumpRouteMap(enabled bool) {
|
||||
s.config.DumpRouteMap = enabled
|
||||
func (s *Server) SetDumpRouterMap(enabled bool) {
|
||||
s.config.DumpRouterMap = enabled
|
||||
}
|
||||
|
||||
func (s *Server) SetFormParsingMemory(maxMemory int64) {
|
||||
|
||||
@ -16,33 +16,35 @@ import (
|
||||
"github.com/gogf/gf/util/gconv"
|
||||
)
|
||||
|
||||
// 分组路由对象
|
||||
type RouterGroup struct {
|
||||
parent *RouterGroup // 父级分组路由
|
||||
server *Server // Server
|
||||
domain *Domain // Domain
|
||||
prefix string // URI前缀
|
||||
middleware []HandlerFunc // 分组路由绑定的中间件
|
||||
}
|
||||
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.
|
||||
}
|
||||
|
||||
// 分组路由批量绑定项
|
||||
type GroupItem = []interface{}
|
||||
// GroupItem is item for router group.
|
||||
GroupItem = []interface{}
|
||||
|
||||
// 预绑定路由项结构
|
||||
type groupPreBindItem struct {
|
||||
group *RouterGroup
|
||||
bindType string
|
||||
pattern string
|
||||
object interface{}
|
||||
params []interface{}
|
||||
}
|
||||
|
||||
var (
|
||||
// 预处理路由项存储数组
|
||||
preBindItems = make([]groupPreBindItem, 0, 64)
|
||||
// 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.
|
||||
}
|
||||
)
|
||||
|
||||
// 处理预绑定路由项
|
||||
var (
|
||||
preBindItems = make([]preBindItem, 0, 64)
|
||||
)
|
||||
|
||||
// handlePreBindItems is called when server starts, which does really route registering to the server.
|
||||
func (s *Server) handlePreBindItems() {
|
||||
for _, item := range preBindItems {
|
||||
// Handle the items of current server.
|
||||
@ -56,7 +58,7 @@ func (s *Server) handlePreBindItems() {
|
||||
}
|
||||
}
|
||||
|
||||
// 获取分组路由对象
|
||||
// Group creates and returns a RouterGroup object.
|
||||
func (s *Server) Group(prefix string, groups ...func(group *RouterGroup)) *RouterGroup {
|
||||
if len(prefix) > 0 && prefix[0] != '/' {
|
||||
prefix = "/" + prefix
|
||||
@ -76,7 +78,7 @@ func (s *Server) Group(prefix string, groups ...func(group *RouterGroup)) *Route
|
||||
return group
|
||||
}
|
||||
|
||||
// 获取分组路由对象(绑定域名)
|
||||
// Group creates and returns a RouterGroup object, which is bound to a specified domain.
|
||||
func (d *Domain) Group(prefix string, groups ...func(group *RouterGroup)) *RouterGroup {
|
||||
if len(prefix) > 0 && prefix[0] != '/' {
|
||||
prefix = "/" + prefix
|
||||
@ -96,7 +98,7 @@ func (d *Domain) Group(prefix string, groups ...func(group *RouterGroup)) *Route
|
||||
return group
|
||||
}
|
||||
|
||||
// 层级递归创建分组路由注册项
|
||||
// Group creates and returns a sub-group of current router group.
|
||||
func (g *RouterGroup) Group(prefix string, groups ...func(group *RouterGroup)) *RouterGroup {
|
||||
if prefix == "/" {
|
||||
prefix = ""
|
||||
@ -119,6 +121,7 @@ func (g *RouterGroup) Group(prefix string, groups ...func(group *RouterGroup)) *
|
||||
return group
|
||||
}
|
||||
|
||||
// Clone returns a new router group which is a clone of current group.
|
||||
func (g *RouterGroup) Clone() *RouterGroup {
|
||||
newGroup := &RouterGroup{
|
||||
parent: g.parent,
|
||||
@ -131,7 +134,7 @@ func (g *RouterGroup) Clone() *RouterGroup {
|
||||
return newGroup
|
||||
}
|
||||
|
||||
// 执行分组路由批量绑定
|
||||
// Bind does batch route registering feature for router group.
|
||||
func (g *RouterGroup) Bind(items []GroupItem) *RouterGroup {
|
||||
group := g.Clone()
|
||||
for _, item := range items {
|
||||
@ -160,72 +163,75 @@ func (g *RouterGroup) Bind(items []GroupItem) *RouterGroup {
|
||||
return group
|
||||
}
|
||||
|
||||
// 绑定所有的HTTP Method请求方式
|
||||
// ALL registers a http handler to given route pattern and all http methods.
|
||||
func (g *RouterGroup) ALL(pattern string, object interface{}, params ...interface{}) *RouterGroup {
|
||||
return g.Clone().preBind("HANDLER", gDEFAULT_METHOD+":"+pattern, object, params...)
|
||||
}
|
||||
|
||||
// 绑定常用方法: GET/PUT/POST/DELETE
|
||||
func (g *RouterGroup) COMMON(pattern string, object interface{}, params ...interface{}) *RouterGroup {
|
||||
group := g.Clone()
|
||||
group.preBind("HANDLER", "GET:"+pattern, object, params...)
|
||||
group.preBind("HANDLER", "PUT:"+pattern, object, params...)
|
||||
group.preBind("HANDLER", "POST:"+pattern, object, params...)
|
||||
group.preBind("HANDLER", "DELETE:"+pattern, object, params...)
|
||||
return group
|
||||
}
|
||||
|
||||
// GET registers a http handler to given route pattern and http method: GET.
|
||||
func (g *RouterGroup) GET(pattern string, object interface{}, params ...interface{}) *RouterGroup {
|
||||
return g.Clone().preBind("HANDLER", "GET:"+pattern, object, params...)
|
||||
}
|
||||
|
||||
// PUT registers a http handler to given route pattern and http method: PUT.
|
||||
func (g *RouterGroup) PUT(pattern string, object interface{}, params ...interface{}) *RouterGroup {
|
||||
return g.Clone().preBind("HANDLER", "PUT:"+pattern, object, params...)
|
||||
}
|
||||
|
||||
// POST registers a http handler to given route pattern and http method: POST.
|
||||
func (g *RouterGroup) POST(pattern string, object interface{}, params ...interface{}) *RouterGroup {
|
||||
return g.Clone().preBind("HANDLER", "POST:"+pattern, object, params...)
|
||||
}
|
||||
|
||||
// DELETE registers a http handler to given route pattern and http method: DELETE.
|
||||
func (g *RouterGroup) DELETE(pattern string, object interface{}, params ...interface{}) *RouterGroup {
|
||||
return g.Clone().preBind("HANDLER", "DELETE:"+pattern, object, params...)
|
||||
}
|
||||
|
||||
// PATCH registers a http handler to given route pattern and http method: PATCH.
|
||||
func (g *RouterGroup) PATCH(pattern string, object interface{}, params ...interface{}) *RouterGroup {
|
||||
return g.Clone().preBind("HANDLER", "PATCH:"+pattern, object, params...)
|
||||
}
|
||||
|
||||
// HEAD registers a http handler to given route pattern and http method: HEAD.
|
||||
func (g *RouterGroup) HEAD(pattern string, object interface{}, params ...interface{}) *RouterGroup {
|
||||
return g.Clone().preBind("HANDLER", "HEAD:"+pattern, object, params...)
|
||||
}
|
||||
|
||||
// CONNECT registers a http handler to given route pattern and http method: CONNECT.
|
||||
func (g *RouterGroup) CONNECT(pattern string, object interface{}, params ...interface{}) *RouterGroup {
|
||||
return g.Clone().preBind("HANDLER", "CONNECT:"+pattern, object, params...)
|
||||
}
|
||||
|
||||
// OPTIONS registers a http handler to given route pattern and http method: OPTIONS.
|
||||
func (g *RouterGroup) OPTIONS(pattern string, object interface{}, params ...interface{}) *RouterGroup {
|
||||
return g.Clone().preBind("HANDLER", "OPTIONS:"+pattern, object, params...)
|
||||
}
|
||||
|
||||
// TRACE registers a http handler to given route pattern and http method: TRACE.
|
||||
func (g *RouterGroup) TRACE(pattern string, object interface{}, params ...interface{}) *RouterGroup {
|
||||
return g.Clone().preBind("HANDLER", "TRACE:"+pattern, object, params...)
|
||||
}
|
||||
|
||||
// REST registers a http handler to given route pattern according to REST rule.
|
||||
func (g *RouterGroup) REST(pattern string, object interface{}) *RouterGroup {
|
||||
return g.Clone().preBind("REST", pattern, object)
|
||||
}
|
||||
|
||||
// Hook registers a hook to given route pattern.
|
||||
func (g *RouterGroup) Hook(pattern string, hook string, handler HandlerFunc) *RouterGroup {
|
||||
return g.Clone().preBind("HANDLER", pattern, handler, hook)
|
||||
}
|
||||
|
||||
// Middleware binds one or more middleware to the router group.
|
||||
func (g *RouterGroup) Middleware(handlers ...HandlerFunc) *RouterGroup {
|
||||
g.middleware = append(g.middleware, handlers...)
|
||||
return g
|
||||
}
|
||||
|
||||
// preBind adds the route registering parameters to internal variable array for lazily registering feature.
|
||||
func (g *RouterGroup) preBind(bindType string, pattern string, object interface{}, params ...interface{}) *RouterGroup {
|
||||
preBindItems = append(preBindItems, groupPreBindItem{
|
||||
preBindItems = append(preBindItems, preBindItem{
|
||||
group: g,
|
||||
bindType: bindType,
|
||||
pattern: pattern,
|
||||
@ -235,6 +241,7 @@ func (g *RouterGroup) preBind(bindType string, pattern string, object interface{
|
||||
return g
|
||||
}
|
||||
|
||||
// getPrefix returns the route prefix of the group, which recursively retrieves its parent's prefixo.
|
||||
func (g *RouterGroup) getPrefix() string {
|
||||
prefix := g.prefix
|
||||
parent := g.parent
|
||||
@ -245,10 +252,10 @@ func (g *RouterGroup) getPrefix() string {
|
||||
return prefix
|
||||
}
|
||||
|
||||
// 执行路由绑定
|
||||
// doBind does really registering for the group.
|
||||
func (g *RouterGroup) doBind(bindType string, pattern string, object interface{}, params ...interface{}) *RouterGroup {
|
||||
prefix := g.getPrefix()
|
||||
// 注册路由处理
|
||||
// Route check.
|
||||
if len(prefix) > 0 {
|
||||
domain, method, path, err := g.server.parsePattern(pattern)
|
||||
if err != nil {
|
||||
@ -264,11 +271,11 @@ func (g *RouterGroup) doBind(bindType string, pattern string, object interface{}
|
||||
pattern = g.server.serveHandlerKey(method, prefix+"/"+strings.TrimLeft(path, "/"), domain)
|
||||
}
|
||||
}
|
||||
// 去掉可能重复出现的'//'符号
|
||||
// Filter repeated char '/'.
|
||||
pattern = gstr.Replace(pattern, "//", "/")
|
||||
// 将附加参数转换为字符串
|
||||
// Convert params to string array.
|
||||
extras := gconv.Strings(params)
|
||||
// 判断是否事件回调注册
|
||||
// Check whether it's a hook handler.
|
||||
if _, ok := object.(HandlerFunc); ok && len(extras) > 0 {
|
||||
bindType = "HOOK"
|
||||
}
|
||||
@ -337,14 +344,14 @@ func (g *RouterGroup) doBind(bindType string, pattern string, object interface{}
|
||||
return g
|
||||
}
|
||||
|
||||
// 判断给定对象是否控制器对象:
|
||||
// 控制器必须包含以下公开的属性对象:Request/Response/Server/Cookie/Session/View.
|
||||
// isController checks and returns whether given <value> is a controller.
|
||||
// A controller should contains attributes: Request/Response/Server/Cookie/Session/View.
|
||||
func (g *RouterGroup) isController(value interface{}) bool {
|
||||
// 首先判断是否满足控制器接口定义
|
||||
// Whether implements interface Controller.
|
||||
if _, ok := value.(Controller); !ok {
|
||||
return false
|
||||
}
|
||||
// 其次检查控制器的必需属性
|
||||
// Check the necessary attributes.
|
||||
v := reflect.ValueOf(value)
|
||||
if v.Kind() == reflect.Ptr {
|
||||
v = v.Elem()
|
||||
|
||||
@ -11,10 +11,14 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
// The default route pattern for global middleware.
|
||||
gDEFAULT_MIDDLEWARE_PATTERN = "/*"
|
||||
)
|
||||
|
||||
// 注册中间件,绑定到指定的路由规则上,中间件参数支持多个。
|
||||
// BindMiddleware registers one or more global middleware to the server.
|
||||
// Global middleware can be used standalone without service handler, which intercepts all dynamic requests
|
||||
// before or after service handler. The parameter <pattern> specifies what route pattern the middleware intercepts,
|
||||
// which is usually a "fuzzy" pattern like "/:name", "/*any" or "/{field}".
|
||||
func (s *Server) BindMiddleware(pattern string, handlers ...HandlerFunc) {
|
||||
for _, handler := range handlers {
|
||||
s.setHandler(pattern, &handlerItem{
|
||||
@ -25,7 +29,9 @@ func (s *Server) BindMiddleware(pattern string, handlers ...HandlerFunc) {
|
||||
}
|
||||
}
|
||||
|
||||
// 注册中间件,绑定到全局路由规则("/*")上,中间件参数支持多个。
|
||||
// BindMiddlewareDefault registers one or more global middleware to the server using default pattern "/*".
|
||||
// Global middleware can be used standalone without service handler, which intercepts all dynamic requests
|
||||
// before or after service handler.
|
||||
func (s *Server) BindMiddlewareDefault(handlers ...HandlerFunc) {
|
||||
for _, handler := range handlers {
|
||||
s.setHandler(gDEFAULT_MIDDLEWARE_PATTERN, &handlerItem{
|
||||
|
||||
@ -64,7 +64,6 @@ func (s *Server) searchHandlers(method, path, domain string) (parsedItems []*han
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
//gutil.Dump(p)
|
||||
// 多层链表(每个节点都有一个*list链表)的目的是当叶子节点未有任何规则匹配时,让父级模糊匹配规则继续处理
|
||||
lists := make([]*glist.List, 0, 16)
|
||||
for k, v := range array {
|
||||
|
||||
@ -31,7 +31,7 @@ func (s *Server) doBindHandler(pattern string, handler HandlerFunc, middleware [
|
||||
})
|
||||
}
|
||||
|
||||
// 通过映射数组绑定URI到操作函数/方法
|
||||
// 通过映射map绑定URI到操作函数/方法
|
||||
func (s *Server) bindHandlerByMap(m handlerMap) {
|
||||
for p, h := range m {
|
||||
s.setHandler(p, h)
|
||||
|
||||
@ -23,7 +23,7 @@ func Test_Client_Basic(t *testing.T) {
|
||||
r.Response.Write("hello")
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
|
||||
@ -29,7 +29,7 @@ func Test_Cookie(t *testing.T) {
|
||||
r.Cookie.Remove(r.GetString("k"))
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
|
||||
@ -23,7 +23,7 @@ func Test_GetUrl(t *testing.T) {
|
||||
r.Response.Write(r.GetUrl())
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
|
||||
@ -45,7 +45,7 @@ func Test_BindMiddleware_Basic1(t *testing.T) {
|
||||
r.Response.Write("8")
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
//s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -72,7 +72,7 @@ func Test_BindMiddleware_Basic2(t *testing.T) {
|
||||
r.Response.Write("2")
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -112,7 +112,7 @@ func Test_BindMiddleware_Basic3(t *testing.T) {
|
||||
r.Response.Write("8")
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -148,7 +148,7 @@ func Test_BindMiddleware_Basic4(t *testing.T) {
|
||||
})
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -177,7 +177,7 @@ func Test_Middleware_With_Static(t *testing.T) {
|
||||
})
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.SetServerRoot(gfile.Join(gdebug.CallerDirectory(), "testdata", "static1"))
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
@ -206,7 +206,7 @@ func Test_Middleware_Status(t *testing.T) {
|
||||
})
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
time.Sleep(100 * time.Millisecond)
|
||||
@ -249,7 +249,7 @@ func Test_Middleware_Hook_With_Static(t *testing.T) {
|
||||
})
|
||||
})
|
||||
s.SetPort(p)
|
||||
//s.SetDumpRouteMap(false)
|
||||
//s.SetDumpRouterMap(false)
|
||||
s.SetServerRoot(gfile.Join(gdebug.CallerDirectory(), "testdata", "static1"))
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
@ -288,7 +288,7 @@ func Test_BindMiddleware_Status(t *testing.T) {
|
||||
r.Middleware.Next()
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -321,7 +321,7 @@ func Test_BindMiddlewareDefault_Basic1(t *testing.T) {
|
||||
r.Response.Write("4")
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -352,7 +352,7 @@ func Test_BindMiddlewareDefault_Basic2(t *testing.T) {
|
||||
r.Response.Write("4")
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -383,7 +383,7 @@ func Test_BindMiddlewareDefault_Basic3(t *testing.T) {
|
||||
r.Response.Write("2")
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -412,7 +412,7 @@ func Test_BindMiddlewareDefault_Basic4(t *testing.T) {
|
||||
r.Middleware.Next()
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -441,7 +441,7 @@ func Test_BindMiddlewareDefault_Basic5(t *testing.T) {
|
||||
r.Middleware.Next()
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -465,7 +465,7 @@ func Test_BindMiddlewareDefault_Status(t *testing.T) {
|
||||
r.Middleware.Next()
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -516,7 +516,7 @@ func Test_BindMiddlewareDefault_Basic6(t *testing.T) {
|
||||
r.Response.Write("4")
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -563,7 +563,7 @@ func Test_Hook_Middleware_Basic1(t *testing.T) {
|
||||
r.Response.Write("4")
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -601,7 +601,7 @@ func Test_Middleware_CORSAndAuth(t *testing.T) {
|
||||
})
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
time.Sleep(100 * time.Millisecond)
|
||||
|
||||
@ -90,7 +90,7 @@ func Test_Params_Json(t *testing.T) {
|
||||
r.Response.WriteJson(responseJson)
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
|
||||
@ -53,7 +53,7 @@ func Test_Params_Struct(t *testing.T) {
|
||||
}
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
|
||||
@ -288,7 +288,7 @@ func Test_Params_Basic(t *testing.T) {
|
||||
}
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -426,7 +426,7 @@ func Test_Params_Priority(t *testing.T) {
|
||||
}))
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
|
||||
@ -35,7 +35,7 @@ func Test_Router_Basic(t *testing.T) {
|
||||
r.Response.Write(r.Get("field"))
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -61,7 +61,7 @@ func Test_Router_Method(t *testing.T) {
|
||||
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -109,7 +109,7 @@ func Test_Router_Status(t *testing.T) {
|
||||
r.Response.WriteStatus(500)
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -156,7 +156,7 @@ func Test_Router_CustomStatusHandler(t *testing.T) {
|
||||
r.Response.Write("404 page")
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -182,7 +182,7 @@ func Test_Router_404(t *testing.T) {
|
||||
r.Response.Write("hello")
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -215,7 +215,7 @@ func Test_Router_Priority(t *testing.T) {
|
||||
r.Response.Write("admin-goods-{page}")
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
|
||||
@ -65,7 +65,7 @@ func Test_Router_ControllerRest(t *testing.T) {
|
||||
s.BindControllerRest("/", new(ControllerRest))
|
||||
s.BindControllerRest("/{.struct}/{.method}", new(ControllerRest))
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
|
||||
@ -49,7 +49,7 @@ func Test_Router_Controller1(t *testing.T) {
|
||||
s.BindController("/", new(Controller))
|
||||
s.BindController("/{.struct}/{.method}", new(Controller))
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -79,7 +79,7 @@ func Test_Router_Controller2(t *testing.T) {
|
||||
s := g.Server(p)
|
||||
s.BindController("/controller", new(Controller), "Show, Info")
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -105,7 +105,7 @@ func Test_Router_ControllerMethod(t *testing.T) {
|
||||
s := g.Server(p)
|
||||
s.BindControllerMethod("/controller-info", new(Controller), "Info")
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
|
||||
@ -37,7 +37,7 @@ func Test_Router_DomainBasic(t *testing.T) {
|
||||
r.Response.Write(r.Get("field"))
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -79,7 +79,7 @@ func Test_Router_DomainMethod(t *testing.T) {
|
||||
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -177,7 +177,7 @@ func Test_Router_DomainStatus(t *testing.T) {
|
||||
r.Response.WriteStatus(500)
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -267,7 +267,7 @@ func Test_Router_DomainCustomStatusHandler(t *testing.T) {
|
||||
r.Response.Write("404 page")
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -303,7 +303,7 @@ func Test_Router_Domain404(t *testing.T) {
|
||||
r.Response.Write("hello")
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -349,7 +349,7 @@ func Test_Router_DomainGroup(t *testing.T) {
|
||||
})
|
||||
})
|
||||
s.SetPort(p)
|
||||
//s.SetDumpRouteMap(false)
|
||||
//s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
|
||||
@ -65,7 +65,7 @@ func Test_Router_DomainControllerRest(t *testing.T) {
|
||||
d := s.Domain("localhost, local")
|
||||
d.BindControllerRest("/", new(DomainControllerRest))
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
|
||||
@ -47,7 +47,7 @@ func Test_Router_DomainController1(t *testing.T) {
|
||||
s := g.Server(p)
|
||||
s.Domain("localhost, local").BindController("/", new(DomainController))
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -97,7 +97,7 @@ func Test_Router_DomainController2(t *testing.T) {
|
||||
s := g.Server(p)
|
||||
s.Domain("localhost, local").BindController("/controller", new(DomainController), "Show, Info")
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -150,7 +150,7 @@ func Test_Router_DomainControllerMethod(t *testing.T) {
|
||||
s := g.Server(p)
|
||||
s.Domain("localhost, local").BindControllerMethod("/controller-info", new(DomainController), "Info")
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
|
||||
@ -60,7 +60,7 @@ func Test_Router_DomainObjectRest(t *testing.T) {
|
||||
d := s.Domain("localhost, local")
|
||||
d.BindObjectRest("/", new(DomainObjectRest))
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
|
||||
@ -43,7 +43,7 @@ func Test_Router_DomainObject1(t *testing.T) {
|
||||
s := g.Server(p)
|
||||
s.Domain("localhost, local").BindObject("/", new(DomainObject))
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -92,7 +92,7 @@ func Test_Router_DomainObject2(t *testing.T) {
|
||||
s := g.Server(p)
|
||||
s.Domain("localhost, local").BindObject("/object", new(DomainObject), "Show, Info")
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -143,7 +143,7 @@ func Test_Router_DomainObjectMethod(t *testing.T) {
|
||||
s := g.Server(p)
|
||||
s.Domain("localhost, local").BindObjectMethod("/object-info", new(DomainObject), "Info")
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
|
||||
@ -31,7 +31,7 @@ func Test_Router_Exit(t *testing.T) {
|
||||
r.Response.Write("test-end")
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -69,7 +69,7 @@ func Test_Router_ExitHook(t *testing.T) {
|
||||
},
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -107,7 +107,7 @@ func Test_Router_ExitAll(t *testing.T) {
|
||||
},
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
|
||||
@ -57,7 +57,7 @@ func Test_Router_Group_Group(t *testing.T) {
|
||||
})
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
|
||||
@ -31,7 +31,7 @@ func Test_Router_Group_Hook1(t *testing.T) {
|
||||
}, ghttp.HOOK_AFTER_SERVE)
|
||||
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -60,7 +60,7 @@ func Test_Router_Group_Hook2(t *testing.T) {
|
||||
}, ghttp.HOOK_AFTER_SERVE)
|
||||
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -91,7 +91,7 @@ func Test_Router_Group_Hook3(t *testing.T) {
|
||||
})
|
||||
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
|
||||
@ -108,7 +108,7 @@ func Test_Router_GroupRest(t *testing.T) {
|
||||
g.REST("/{.struct}/{.method}", ctl)
|
||||
g.REST("/{.struct}/{.method}", obj)
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
|
||||
@ -86,7 +86,7 @@ func Test_Router_GroupBasic1(t *testing.T) {
|
||||
group.GET("/obj/my-show", obj, "Show")
|
||||
group.REST("/obj/rest", obj)
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -134,7 +134,7 @@ func Test_Router_Basic2(t *testing.T) {
|
||||
{"REST", "/obj/rest", obj},
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -170,7 +170,7 @@ func Test_Router_GroupBuildInVar(t *testing.T) {
|
||||
group.ALL("/{.struct}/{.method}", ctl)
|
||||
group.ALL("/{.struct}/{.method}", obj)
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
|
||||
@ -29,7 +29,7 @@ func Test_Router_Hook_Basic(t *testing.T) {
|
||||
r.Response.Write("test")
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -70,7 +70,7 @@ func Test_Router_Hook_Fuzzy_Router(t *testing.T) {
|
||||
r.Response.Write(r.Router.Uri)
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -110,7 +110,7 @@ func Test_Router_Hook_Priority(t *testing.T) {
|
||||
},
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -144,7 +144,7 @@ func Test_Router_Hook_Multi(t *testing.T) {
|
||||
},
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
|
||||
@ -28,7 +28,7 @@ func Test_NameToUri_FullName(t *testing.T) {
|
||||
s.SetNameToUriType(ghttp.URI_TYPE_FULLNAME)
|
||||
s.BindObject("/{.struct}/{.method}", new(NamesObject))
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -49,7 +49,7 @@ func Test_NameToUri_AllLower(t *testing.T) {
|
||||
s.SetNameToUriType(ghttp.URI_TYPE_ALLLOWER)
|
||||
s.BindObject("/{.struct}/{.method}", new(NamesObject))
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -70,7 +70,7 @@ func Test_NameToUri_Camel(t *testing.T) {
|
||||
s.SetNameToUriType(ghttp.URI_TYPE_CAMEL)
|
||||
s.BindObject("/{.struct}/{.method}", new(NamesObject))
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -91,7 +91,7 @@ func Test_NameToUri_Default(t *testing.T) {
|
||||
s.SetNameToUriType(ghttp.URI_TYPE_DEFAULT)
|
||||
s.BindObject("/{.struct}/{.method}", new(NamesObject))
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
|
||||
@ -60,7 +60,7 @@ func Test_Router_ObjectRest(t *testing.T) {
|
||||
s.BindObjectRest("/", new(ObjectRest))
|
||||
s.BindObjectRest("/{.struct}/{.method}", new(ObjectRest))
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
|
||||
@ -47,7 +47,7 @@ func Test_Router_ObjectRest_Id(t *testing.T) {
|
||||
s := g.Server(p)
|
||||
s.BindObjectRest("/object/:id", new(ObjectRest2))
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
|
||||
@ -44,7 +44,7 @@ func Test_Router_Object1(t *testing.T) {
|
||||
s.BindObject("/", new(Object))
|
||||
s.BindObject("/{.struct}/{.method}", new(Object))
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -74,7 +74,7 @@ func Test_Router_Object2(t *testing.T) {
|
||||
s := g.Server(p)
|
||||
s.BindObject("/object", new(Object), "Show, Info")
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -100,7 +100,7 @@ func Test_Router_ObjectMethod(t *testing.T) {
|
||||
s := g.Server(p)
|
||||
s.BindObjectMethod("/object-info", new(Object), "Info")
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
|
||||
@ -32,7 +32,7 @@ func Test_Session_Cookie(t *testing.T) {
|
||||
r.Session.Clear()
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -79,7 +79,7 @@ func Test_Session_Header(t *testing.T) {
|
||||
r.Session.Clear()
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -125,7 +125,7 @@ func Test_Session_StorageFile(t *testing.T) {
|
||||
r.Response.Write(r.Session.Get(r.GetString("k")))
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
|
||||
@ -37,7 +37,7 @@ func Test_Template_Layout1(t *testing.T) {
|
||||
err := r.Response.WriteTpl("layout.html", nil)
|
||||
gtest.Assert(err, nil)
|
||||
})
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.SetPort(p)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
@ -73,7 +73,7 @@ func Test_Template_Layout2(t *testing.T) {
|
||||
err := r.Response.WriteTpl("layout.html", nil)
|
||||
gtest.Assert(err, nil)
|
||||
})
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.SetPort(p)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
@ -37,7 +37,7 @@ func Test_WebSocket(t *testing.T) {
|
||||
}
|
||||
})
|
||||
s.SetPort(p)
|
||||
s.SetDumpRouteMap(false)
|
||||
s.SetDumpRouterMap(false)
|
||||
s.Start()
|
||||
defer s.Shutdown()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user