ghttp.Server修复hook与serve方法的路由影响,并新增跳转方法

This commit is contained in:
john
2018-08-24 14:57:49 +08:00
parent 9b14601d6f
commit 16f79553c9
7 changed files with 108 additions and 34 deletions

View File

@ -179,6 +179,11 @@ func (r *Request) GetClientIp() string {
return ip
}
// 获得来源URL地址
func (r *Request) GetReferer() string {
return r.Header.Get("Referer")
}
// 获得结构体顶替的参数名称标签构成map返回
func (r *Request) getStructParamsTagMap(object interface{}) map[string]string {
tagmap := make(map[string]string)

View File

@ -166,6 +166,11 @@ func (r *Response) RedirectTo(location string) {
r.WriteHeader(http.StatusFound)
}
// 返回location标识引导客户端跳转到来源页面
func (r *Response) RedirectBack() {
r.RedirectTo(r.request.GetReferer())
}
// 获取当前缓冲区中的数据
func (r *Response) Buffer() []byte {
r.mu.RLock()

View File

@ -72,41 +72,32 @@ func (s *Server)handleRequest(w http.ResponseWriter, r *http.Request) {
}
}
// 事件 - BeforeServe
s.callHookHandler(HOOK_BEFORE_SERVE, request)
// 服务路由信息检索
// 其次进行服务路由信息检索
handler := (*handlerItem)(nil)
if !request.exit.Val() {
if request.IsFileRequest() {
// 如果存在请求的具体文件,那么优先服务文件
s.serveFile(request, filePath)
} else {
// 其次进行服务路由注册检索
parsedItem := s.getServeHandlerWithCache(request)
if parsedItem == nil {
// 目录是优先级最低的操作
if filePath != "" {
s.serveFile(request, filePath)
} else {
request.Response.WriteStatus(http.StatusNotFound)
}
} else {
// 执行服务
handler = parsedItem.handler
if request.Router == nil {
for k, v := range parsedItem.values {
request.routerVars[k] = v
}
request.Router = parsedItem.handler.router
}
if !request.IsFileRequest() {
if parsedItem := s.getServeHandlerWithCache(request); parsedItem != nil {
handler = parsedItem.handler
for k, v := range parsedItem.values {
request.routerVars[k] = v
}
request.Router = parsedItem.handler.router
}
}
// 执行回调控制器/执行对象/方法
if handler != nil && !request.exit.Val() {
s.callServeHandler(handler, request)
// 事件 - BeforeServe
s.callHookHandler(HOOK_BEFORE_SERVE, request)
// 执行静态文件服务/回调控制器/执行对象/方法
if !request.exit.Val() {
if filePath != "" && (request.IsFileRequest() || handler == nil) {
s.serveFile(request, filePath)
} else {
if handler != nil {
s.callServeHandler(handler, request)
} else {
request.Response.WriteStatus(http.StatusNotFound)
}
}
}
// 事件 - AfterServe

View File

@ -40,16 +40,29 @@ func (s *Server)BindHookHandlerByMap(pattern string, hookmap map[string]HandlerF
func (s *Server) callHookHandler(hook string, r *Request) {
hookItems := s.getHookHandlerWithCache(hook, r)
if len(hookItems) > 0 {
// 备份原有的router变量
oldRouterVars := r.routerVars
for _, item := range hookItems {
// hook方法不能更改serve方法的路由参数其匹配的路由参数只能自己使用
// 且在多个hook方法之间不能共享路由参数单可以使用匹配的serve方法路由参数。
// 当前回调函数的路由参数只在当前回调函数下有效。
r.routerVars = make(map[string][]string)
for k, v := range item.values {
r.routerVars[k] = v
if len(oldRouterVars) > 0 {
for k, v := range oldRouterVars {
r.routerVars[k] = v
}
}
r.Router = item.handler.router
if len(item.values) > 0 {
for k, v := range item.values {
r.routerVars[k] = v
}
}
// 不使用hook的router对象保留路由注册服务的router对象不能覆盖
// r.Router = item.handler.router
item.handler.faddr(r)
}
r.routerVars = oldRouterVars
// 恢复原有的router变量
r.routerVars = oldRouterVars
}
}

View File

@ -0,0 +1,18 @@
package main
import (
"gitee.com/johng/gf/g"
"gitee.com/johng/gf/g/net/ghttp"
)
func main() {
s := g.Server()
s.BindHandler("/page", func(r *ghttp.Request){
r.Response.Writeln(`<a href="/back">back</a>`)
})
s.BindHandler("/back", func(r *ghttp.Request){
r.Response.RedirectBack()
})
s.SetPort(8199)
s.Run()
}

View File

@ -0,0 +1,25 @@
package main
import (
"gitee.com/johng/gf/g/net/ghttp"
"gitee.com/johng/gf/g"
"fmt"
)
func main() {
s := g.Server()
s.BindHookHandler("/*any", ghttp.HOOK_BEFORE_SERVE, func(r *ghttp.Request) {
fmt.Println(r.Router)
fmt.Println(r.Get("customer_id"))
})
s.BindHandler("/admin/customer/{customer_id}/edit", func(r *ghttp.Request){
r.Response.Writeln(r.Get("customer_id"))
r.Response.Writeln(r.Router.Uri)
})
s.BindHandler("/admin/customer/{customer_id}/disable", func(r *ghttp.Request){
r.Response.Writeln(r.Get("customer_id"))
r.Response.Writeln(r.Router.Uri)
})
s.SetPort(8199)
s.Run()
}

17
geg/os/gproc/gproc5.go Normal file
View File

@ -0,0 +1,17 @@
package main
import (
"os"
"time"
"gitee.com/johng/gf/g/os/glog"
"gitee.com/johng/gf/g/os/genv"
"gitee.com/johng/gf/g/os/gproc"
)
// 查看进程的环境变量
func main () {
time.Sleep(5*time.Second)
glog.Printfln("%d: %v", gproc.Pid(), genv.All())
p := gproc.NewProcess(os.Args[0], os.Args, os.Environ())
p.Start()
}