From 16f79553c9bc2fd0622f4ff01514a1aafbc9413e Mon Sep 17 00:00:00 2001 From: john Date: Fri, 24 Aug 2018 14:57:49 +0800 Subject: [PATCH] =?UTF-8?q?ghttp.Server=E4=BF=AE=E5=A4=8Dhook=E4=B8=8Eserv?= =?UTF-8?q?e=E6=96=B9=E6=B3=95=E7=9A=84=E8=B7=AF=E7=94=B1=E5=BD=B1?= =?UTF-8?q?=E5=93=8D=EF=BC=8C=E5=B9=B6=E6=96=B0=E5=A2=9E=E8=B7=B3=E8=BD=AC?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- g/net/ghttp/ghttp_request.go | 5 +++ g/net/ghttp/ghttp_response.go | 5 +++ g/net/ghttp/ghttp_server_handler.go | 51 ++++++++++--------------- g/net/ghttp/ghttp_server_router_hook.go | 21 ++++++++-- geg/net/ghttp/server/redirect/back.go | 18 +++++++++ geg/net/ghttp/server/router/router5.go | 25 ++++++++++++ geg/os/gproc/gproc5.go | 17 +++++++++ 7 files changed, 108 insertions(+), 34 deletions(-) create mode 100644 geg/net/ghttp/server/redirect/back.go create mode 100644 geg/net/ghttp/server/router/router5.go create mode 100644 geg/os/gproc/gproc5.go diff --git a/g/net/ghttp/ghttp_request.go b/g/net/ghttp/ghttp_request.go index b26109574..0ec7cabc6 100644 --- a/g/net/ghttp/ghttp_request.go +++ b/g/net/ghttp/ghttp_request.go @@ -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) diff --git a/g/net/ghttp/ghttp_response.go b/g/net/ghttp/ghttp_response.go index 8f355043d..ff4d9bb0b 100644 --- a/g/net/ghttp/ghttp_response.go +++ b/g/net/ghttp/ghttp_response.go @@ -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() diff --git a/g/net/ghttp/ghttp_server_handler.go b/g/net/ghttp/ghttp_server_handler.go index e0a8cdb00..5eb0cc552 100644 --- a/g/net/ghttp/ghttp_server_handler.go +++ b/g/net/ghttp/ghttp_server_handler.go @@ -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 diff --git a/g/net/ghttp/ghttp_server_router_hook.go b/g/net/ghttp/ghttp_server_router_hook.go index 0e1e838b6..366fe4310 100644 --- a/g/net/ghttp/ghttp_server_router_hook.go +++ b/g/net/ghttp/ghttp_server_router_hook.go @@ -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 } } diff --git a/geg/net/ghttp/server/redirect/back.go b/geg/net/ghttp/server/redirect/back.go new file mode 100644 index 000000000..2fa88ed39 --- /dev/null +++ b/geg/net/ghttp/server/redirect/back.go @@ -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(`back`) + }) + s.BindHandler("/back", func(r *ghttp.Request){ + r.Response.RedirectBack() + }) + s.SetPort(8199) + s.Run() +} \ No newline at end of file diff --git a/geg/net/ghttp/server/router/router5.go b/geg/net/ghttp/server/router/router5.go new file mode 100644 index 000000000..85006fadb --- /dev/null +++ b/geg/net/ghttp/server/router/router5.go @@ -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() +} \ No newline at end of file diff --git a/geg/os/gproc/gproc5.go b/geg/os/gproc/gproc5.go new file mode 100644 index 000000000..db5eddf12 --- /dev/null +++ b/geg/os/gproc/gproc5.go @@ -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() +}