Files
gf/net/ghttp/ghttp_request_middleware.go

79 lines
2.0 KiB
Go

// Copyright 2017 gf Author(https://github.com/gogf/gf). All Rights Reserved.
//
// This Source Code Form is subject to the terms of the MIT License.
// If a copy of the MIT was not distributed with this file,
// You can obtain one at https://github.com/gogf/gf.
package ghttp
import "reflect"
// 中间件对象
type Middleware struct {
request *Request
}
// 执行下一个请求流程处理函数
func (m *Middleware) Next() {
item := (*handlerParsedItem)(nil)
for {
// 是否停止请求执行
if m.request.IsExited() || m.request.handlerIndex >= len(m.request.handlers) {
return
}
item = m.request.handlers[m.request.handlerIndex]
m.request.handlerIndex++
// 通过中间件模式不执行钩子函数
if item.handler.itemType == gHANDLER_TYPE_HOOK {
continue
}
// 路由参数赋值
for k, v := range item.values {
m.request.routerVars[k] = v
}
m.request.Router = item.handler.router
// 执行函数处理
switch item.handler.itemType {
case gHANDLER_TYPE_CONTROLLER:
c := reflect.New(item.handler.ctrlInfo.reflect)
niceCallFunc(func() {
c.MethodByName("Init").Call([]reflect.Value{reflect.ValueOf(m.request)})
})
if !m.request.IsExited() {
niceCallFunc(func() {
c.MethodByName(item.handler.ctrlInfo.name).Call(nil)
})
}
if !m.request.IsExited() {
niceCallFunc(func() {
c.MethodByName("Shut").Call(nil)
})
}
case gHANDLER_TYPE_OBJECT:
if item.handler.initFunc != nil {
niceCallFunc(func() {
item.handler.initFunc(m.request)
})
}
if !m.request.IsExited() {
niceCallFunc(func() {
item.handler.itemFunc(m.request)
})
}
if !m.request.IsExited() && item.handler.shutFunc != nil {
niceCallFunc(func() {
item.handler.shutFunc(m.request)
})
}
case gHANDLER_TYPE_MIDDLEWARE:
niceCallFunc(func() {
item.handler.itemFunc(m.request)
})
case gHANDLER_TYPE_HANDLER:
niceCallFunc(func() {
item.handler.itemFunc(m.request)
})
}
}
}