mirror of
https://gitee.com/johng/gf
synced 2026-06-27 01:43:33 +08:00
ghttp.Server修复hook与serve方法的路由影响,并新增跳转方法
This commit is contained in:
@ -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)
|
||||
|
||||
@ -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()
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
18
geg/net/ghttp/server/redirect/back.go
Normal file
18
geg/net/ghttp/server/redirect/back.go
Normal 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()
|
||||
}
|
||||
25
geg/net/ghttp/server/router/router5.go
Normal file
25
geg/net/ghttp/server/router/router5.go
Normal 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
17
geg/os/gproc/gproc5.go
Normal 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()
|
||||
}
|
||||
Reference in New Issue
Block a user