export router map api for ghttp.Server; comment update for ghttp.Server

This commit is contained in:
John
2019-12-04 13:55:08 +08:00
parent a06ca31530
commit 6abe660287
35 changed files with 242 additions and 222 deletions

View File

@ -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())

View File

@ -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),
}

View File

@ -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) {

View File

@ -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()

View File

@ -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{

View File

@ -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 {

View File

@ -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)

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -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)

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -37,7 +37,7 @@ func Test_WebSocket(t *testing.T) {
}
})
s.SetPort(p)
s.SetDumpRouteMap(false)
s.SetDumpRouterMap(false)
s.Start()
defer s.Shutdown()