ghttp.Request增加Exit

This commit is contained in:
John 2018-04-16 16:50:24 +08:00
parent 83988d4a2b
commit 38ba66db70
4 changed files with 47 additions and 5 deletions

View File

@ -36,4 +36,9 @@ func (c *Controller) Shut(r *ghttp.Request) {
}
// 推出请求执行
func (c *Controller) Exit() {
c.Request.Exit()
}

View File

@ -20,6 +20,7 @@ type Request struct {
parsedGet *gtype.Bool // GET参数是否已经解析
parsedPost *gtype.Bool // POST参数是否已经解析
values map[string][]string // GET参数
exit *gtype.Bool // 是否退出当前请求流程执行
Id int // 请求id(唯一)
Server *Server // 请求关联的服务器对象
Cookie *Cookie // 与当前请求绑定的Cookie对象(并发安全)
@ -33,6 +34,7 @@ func newRequest(s *Server, r *http.Request, w http.ResponseWriter) *Request {
parsedGet : gtype.NewBool(),
parsedPost : gtype.NewBool(),
values : make(map[string][]string),
exit : gtype.NewBool(),
Id : s.servedCount.Add(1),
Server : s,
Request : *r,
@ -285,5 +287,15 @@ func (r *Request) GetJson() *gjson.Json {
return nil
}
// 退出当前请求执行原理是在Request.exit做标记由服务逻辑流程做判断自行停止
func (r *Request) Exit() {
r.exit.Set(true)
}
// 判断当前请求是否停止执行
func (r *Request) IsExit() bool {
return r.exit.Val()
}

View File

@ -60,18 +60,19 @@ func (s *Server)handleRequest(w http.ResponseWriter, r *http.Request) {
// 初始化控制器
func (s *Server)callHandler(h *HandlerItem, r *Request) {
// 请求处理
if h.faddr == nil {
// 新建一个控制器对象处理请求
c := reflect.New(h.ctype)
c.MethodByName("Init").Call([]reflect.Value{reflect.ValueOf(r)})
c.MethodByName(h.fname).Call(nil)
if !r.IsExit() {
c.MethodByName(h.fname).Call(nil)
}
c.MethodByName("Shut").Call([]reflect.Value{reflect.ValueOf(r)})
} else {
h.faddr(r)
if !r.IsExit() {
h.faddr(r)
}
}
}
// 处理静态文件请求

View File

@ -0,0 +1,24 @@
package demo
import (
"gitee.com/johng/gf/g/net/ghttp"
"gitee.com/johng/gf/g/frame/gmvc"
)
type ControllerExit struct {
gmvc.Controller
}
func (c *ControllerExit) Init(r *ghttp.Request) {
c.Controller.Init(r)
c.Response.Write("exit, it will not print \"show\"")
c.Request.Exit()
}
func (c *ControllerExit) Show() {
c.Response.Write("show")
}
func init() {
ghttp.GetServer().BindController("/exit", &ControllerExit{})
}