fix openapi specification generating; improve handler type

This commit is contained in:
John Guo
2021-10-06 14:22:58 +08:00
parent 9f2eeb23ba
commit 82d04d612b
10 changed files with 54 additions and 48 deletions

View File

@ -52,7 +52,7 @@ type (
Server string // Server name.
Address string // Listening address.
Domain string // Bound domain.
Type int // Router type.
Type string // Router type.
Middleware string // Bound middleware.
Method string // Handler method name.
Route string // Route URI.
@ -75,7 +75,7 @@ type (
handlerItem struct {
Id int // Unique handler item id mark.
Name string // Handler name, which is automatically retrieved from runtime stack when registered.
Type int // Handler type: object/handler/controller/middleware/hook.
Type string // Handler type: object/handler/middleware/hook.
Info handlerFuncInfo // Handler function information.
InitFunc HandlerFunc // Initialization function when request enters the object (only available for object register type).
ShutFunc HandlerFunc // Shutdown function when request leaves out the object (only available for object register type).
@ -111,22 +111,24 @@ const (
ServerStatusRunning = 1
DefaultServerName = "default"
DefaultDomainName = "default"
supportedHttpMethods = "GET,PUT,POST,DELETE,PATCH,HEAD,CONNECT,OPTIONS,TRACE"
defaultMethod = "ALL"
handlerTypeHandler = 1
handlerTypeObject = 2
handlerTypeController = 3
handlerTypeMiddleware = 4
handlerTypeHook = 5
exceptionExit = "exit"
exceptionExitAll = "exit_all"
exceptionExitHook = "exit_hook"
routeCacheDuration = time.Hour
methodNameInit = "Init"
methodNameShut = "Shut"
methodNameExit = "Exit"
ctxKeyForRequest = "gHttpRequestObject"
swaggerUIPackedPath = "/goframe/swaggerui"
HandlerTypeHandler = "handler"
HandlerTypeObject = "object"
HandlerTypeMiddleware = "middleware"
HandlerTypeHook = "hook"
)
const (
supportedHttpMethods = "GET,PUT,POST,DELETE,PATCH,HEAD,CONNECT,OPTIONS,TRACE"
defaultMethod = "ALL"
exceptionExit = "exit"
exceptionExitAll = "exit_all"
exceptionExitHook = "exit_hook"
routeCacheDuration = time.Hour
methodNameInit = "Init"
methodNameShut = "Shut"
methodNameExit = "Exit"
ctxKeyForRequest = "gHttpRequestObject"
swaggerUIPackedPath = "/goframe/swaggerui"
)
var (

View File

@ -35,7 +35,7 @@ func (m *middleware) Next() {
}
item = m.request.handlers[m.handlerIndex]
// Filter the HOOK handlers, which are designed to be called in another standalone procedure.
if item.Handler.Type == handlerTypeHook {
if item.Handler.Type == HandlerTypeHook {
m.handlerIndex++
continue
}
@ -60,7 +60,7 @@ func (m *middleware) Next() {
switch item.Handler.Type {
// Service object.
case handlerTypeObject:
case HandlerTypeObject:
m.served = true
if m.request.IsExited() {
break
@ -80,7 +80,7 @@ func (m *middleware) Next() {
}
// Service handler.
case handlerTypeHandler:
case HandlerTypeHandler:
m.served = true
if m.request.IsExited() {
break
@ -90,7 +90,7 @@ func (m *middleware) Next() {
})
// Global middleware array.
case handlerTypeMiddleware:
case HandlerTypeMiddleware:
niceCallFunc(func() {
item.Handler.Info.Func(m.request)
})

View File

@ -326,10 +326,10 @@ func (s *Server) GetRoutes() []RouterItem {
Handler: registeredItem.Handler,
}
switch item.Handler.Type {
case handlerTypeController, handlerTypeObject, handlerTypeHandler:
case HandlerTypeObject, HandlerTypeHandler:
item.IsServiceHandler = true
case handlerTypeMiddleware:
case HandlerTypeMiddleware:
item.Middleware = "GLOBAL MIDDLEWARE"
}
if len(item.Handler.Middleware) > 0 {
@ -351,9 +351,9 @@ func (s *Server) GetRoutes() []RouterItem {
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.Type == handlerTypeMiddleware && item2.Handler.Type != handlerTypeMiddleware {
if item1.Handler.Type == HandlerTypeMiddleware && item2.Handler.Type != HandlerTypeMiddleware {
return -1
} else if item1.Handler.Type == handlerTypeMiddleware && item2.Handler.Type == handlerTypeMiddleware {
} else if item1.Handler.Type == HandlerTypeMiddleware && item2.Handler.Type == HandlerTypeMiddleware {
return 1
} else if r = strings.Compare(item1.Middleware, item2.Middleware); r == 0 {
r = item2.Priority - item1.Priority
@ -390,9 +390,9 @@ func (s *Server) Run() {
// Remove plugins.
if len(s.plugins) > 0 {
for _, p := range s.plugins {
intlog.Printf(context.TODO(), `remove plugin: %s`, p.Name())
intlog.Printf(ctx, `remove plugin: %s`, p.Name())
if err := p.Remove(); err != nil {
intlog.Errorf(context.TODO(), "%+v", err)
intlog.Errorf(ctx, "%+v", err)
}
}
}

View File

@ -22,6 +22,10 @@ func (s *Server) initOpenApi() {
method string
)
for _, item := range s.GetRoutes() {
switch item.Type {
case HandlerTypeMiddleware, HandlerTypeHook:
continue
}
method = item.Method
if gstr.Equal(method, defaultMethod) {
method = "POST"

View File

@ -87,7 +87,7 @@ func (s *Server) setHandler(ctx context.Context, pattern string, handler *handle
routerKey := s.routerMapKey(handler.HookName, method, uri, domain)
if !s.config.RouteOverWrite {
switch handler.Type {
case handlerTypeHandler, handlerTypeObject, handlerTypeController:
case HandlerTypeHandler, HandlerTypeObject:
if item, ok := s.routesMap[routerKey]; ok {
s.Logger().Fatalf(
ctx,
@ -200,7 +200,7 @@ func (s *Server) setHandler(ctx context.Context, pattern string, handler *handle
Handler: handler,
}
switch handler.Type {
case handlerTypeHandler, handlerTypeObject, handlerTypeController:
case HandlerTypeHandler, HandlerTypeObject:
// Overwrite the route.
s.routesMap[routerKey] = []registeredRouteItem{routeItem}
default:
@ -219,11 +219,11 @@ func (s *Server) setHandler(ctx context.Context, pattern string, handler *handle
// 3. Route type: {xxx} > :xxx > *xxx.
func (s *Server) compareRouterPriority(newItem *handlerItem, oldItem *handlerItem) bool {
// If they're all type of middleware, the priority is according their registered sequence.
if newItem.Type == handlerTypeMiddleware && oldItem.Type == handlerTypeMiddleware {
if newItem.Type == HandlerTypeMiddleware && oldItem.Type == HandlerTypeMiddleware {
return false
}
// The middleware has the most high priority.
if newItem.Type == handlerTypeMiddleware && oldItem.Type != handlerTypeMiddleware {
if newItem.Type == HandlerTypeMiddleware && oldItem.Type != HandlerTypeMiddleware {
return true
}
// URI: The deeper the higher (simply check the count of char '/' in the URI).
@ -324,7 +324,7 @@ func (s *Server) compareRouterPriority(newItem *handlerItem, oldItem *handlerIte
// If they have different router type,
// the new router item has more priority than the other one.
if newItem.Type == handlerTypeHandler || newItem.Type == handlerTypeObject || newItem.Type == handlerTypeController {
if newItem.Type == HandlerTypeHandler || newItem.Type == HandlerTypeObject {
return true
}

View File

@ -20,7 +20,7 @@ func (s *Server) BindHookHandler(pattern string, hook string, handler HandlerFun
func (s *Server) doBindHookHandler(ctx context.Context, pattern string, hook string, handler HandlerFunc, source string) {
s.setHandler(ctx, pattern, &handlerItem{
Type: handlerTypeHook,
Type: HandlerTypeHook,
Name: gdebug.FuncPath(handler),
Info: handlerFuncInfo{
Func: handler,

View File

@ -27,7 +27,7 @@ func (s *Server) BindMiddleware(pattern string, handlers ...HandlerFunc) {
)
for _, handler := range handlers {
s.setHandler(ctx, pattern, &handlerItem{
Type: handlerTypeMiddleware,
Type: HandlerTypeMiddleware,
Name: gdebug.FuncPath(handler),
Info: handlerFuncInfo{
Func: handler,
@ -46,7 +46,7 @@ func (s *Server) BindMiddlewareDefault(handlers ...HandlerFunc) {
)
for _, handler := range handlers {
s.setHandler(ctx, defaultMiddlewarePattern, &handlerItem{
Type: handlerTypeMiddleware,
Type: HandlerTypeMiddleware,
Name: gdebug.FuncPath(handler),
Info: handlerFuncInfo{
Func: handler,

View File

@ -159,7 +159,7 @@ func (s *Server) searchHandlers(method, path, domain string) (parsedItems []*han
// Serving handler can only be added to the handler array just once.
if hasServe {
switch item.Type {
case handlerTypeHandler, handlerTypeObject, handlerTypeController:
case HandlerTypeHandler, HandlerTypeObject:
continue
}
}
@ -180,14 +180,14 @@ func (s *Server) searchHandlers(method, path, domain string) (parsedItems []*han
}
switch item.Type {
// The serving handler can be only added just once.
case handlerTypeHandler, handlerTypeObject, handlerTypeController:
case HandlerTypeHandler, HandlerTypeObject:
hasServe = true
parsedItemList.PushBack(parsedItem)
// The middleware is inserted before the serving handler.
// If there are multiple middleware, they're inserted into the result list by their registering order.
// The middleware is also executed by their registered order.
case handlerTypeMiddleware:
case HandlerTypeMiddleware:
if lastMiddlewareElem == nil {
lastMiddlewareElem = parsedItemList.PushFront(parsedItem)
} else {
@ -195,12 +195,12 @@ func (s *Server) searchHandlers(method, path, domain string) (parsedItems []*han
}
// HOOK handler, just push it back to the list.
case handlerTypeHook:
case HandlerTypeHook:
hasHook = true
parsedItemList.PushBack(parsedItem)
default:
panic(gerror.NewCodef(gcode.CodeInternalError, `invalid handler type %d`, item.Type))
panic(gerror.NewCodef(gcode.CodeInternalError, `invalid handler type %s`, item.Type))
}
}
}
@ -221,7 +221,7 @@ func (s *Server) searchHandlers(method, path, domain string) (parsedItems []*han
// MarshalJSON implements the interface MarshalJSON for json.Marshal.
func (item *handlerItem) MarshalJSON() ([]byte, error) {
switch item.Type {
case handlerTypeHook:
case HandlerTypeHook:
return json.Marshal(
fmt.Sprintf(
`%s %s:%s (%s)`,
@ -231,7 +231,7 @@ func (item *handlerItem) MarshalJSON() ([]byte, error) {
item.HookName,
),
)
case handlerTypeMiddleware:
case HandlerTypeMiddleware:
return json.Marshal(
fmt.Sprintf(
`%s %s:%s (MIDDLEWARE)`,

View File

@ -39,7 +39,7 @@ func (s *Server) BindHandler(pattern string, handler interface{}) {
func (s *Server) doBindHandler(ctx context.Context, pattern string, funcInfo handlerFuncInfo, middleware []HandlerFunc, source string) {
s.setHandler(ctx, pattern, &handlerItem{
Name: gdebug.FuncPath(funcInfo.Func),
Type: handlerTypeHandler,
Type: HandlerTypeHandler,
Info: funcInfo,
Middleware: middleware,
Source: source,

View File

@ -115,7 +115,7 @@ func (s *Server) doBindObject(ctx context.Context, pattern string, object interf
key := s.mergeBuildInNameToPattern(pattern, structName, methodName, true)
m[key] = &handlerItem{
Name: fmt.Sprintf(`%s.%s.%s`, pkgPath, objName, methodName),
Type: handlerTypeObject,
Type: HandlerTypeObject,
Info: funcInfo,
InitFunc: initFunc,
ShutFunc: shutFunc,
@ -137,7 +137,7 @@ func (s *Server) doBindObject(ctx context.Context, pattern string, object interf
}
m[k] = &handlerItem{
Name: fmt.Sprintf(`%s.%s.%s`, pkgPath, objName, methodName),
Type: handlerTypeObject,
Type: HandlerTypeObject,
Info: funcInfo,
InitFunc: initFunc,
ShutFunc: shutFunc,
@ -197,7 +197,7 @@ func (s *Server) doBindObjectMethod(ctx context.Context, pattern string, object
key := s.mergeBuildInNameToPattern(pattern, structName, methodName, false)
m[key] = &handlerItem{
Name: fmt.Sprintf(`%s.%s.%s`, pkgPath, objName, methodName),
Type: handlerTypeObject,
Type: HandlerTypeObject,
Info: funcInfo,
InitFunc: initFunc,
ShutFunc: shutFunc,
@ -251,7 +251,7 @@ func (s *Server) doBindObjectRest(ctx context.Context, pattern string, object in
key := s.mergeBuildInNameToPattern(methodName+":"+pattern, structName, methodName, false)
m[key] = &handlerItem{
Name: fmt.Sprintf(`%s.%s.%s`, pkgPath, objName, methodName),
Type: handlerTypeObject,
Type: HandlerTypeObject,
Info: funcInfo,
InitFunc: initFunc,
ShutFunc: shutFunc,