diff --git a/TODO b/TODO index 04f8729a7..9c4a770a1 100644 --- a/TODO +++ b/TODO @@ -1,3 +1,4 @@ 1. gconv完善针对不同类型的判断,例如:尽量减少sprintf("%v", xxx)来执行string类型的转换; 2. gdb Where方法参数的改进,研究是否可以将string参数类型修改为interfaceP{; -3. 增加对于数据表Model的封装; \ No newline at end of file +3. 增加对于数据表Model的封装; +4. ghttp.Server请求执行中增加服务退出的方法,不再执行后续操作; \ No newline at end of file diff --git a/g/net/ghttp/http_server_router.go b/g/net/ghttp/http_server_router.go index 81183a727..58f799f32 100644 --- a/g/net/ghttp/http_server_router.go +++ b/g/net/ghttp/http_server_router.go @@ -20,10 +20,10 @@ func (s *Server)parsePatternForBindHandler(pattern string) (domain, method, uri domain = gDEFAULT_DOMAIN method = gDEFAULT_METHOD if array, err := gregx.MatchString(`([a-zA-Z]+):(.+)`, pattern); len(array) > 1 && err == nil { - method = array[1] - pattern = array[2] + method = array[1] + uri = array[2] } - if array, err := gregx.MatchString(`(.+)@([\w\.\-]+)`, pattern); len(array) > 1 && err == nil { + if array, err := gregx.MatchString(`(.+)@([\w\.\-]+)`, uri); len(array) > 1 && err == nil { uri = array[1] domain = array[2] } @@ -47,10 +47,10 @@ func (s *Server) setHandler(pattern string, item *HandlerItem) error { defer s.hmmu.Unlock() if method == gDEFAULT_METHOD { for v, _ := range s.methodsMap { - s.handlerMap[s.handlerKey(domain, v, pattern)] = item + s.handlerMap[s.handlerKey(domain, v, uri)] = item } } else { - s.handlerMap[s.handlerKey(domain, method, pattern)] = item + s.handlerMap[s.handlerKey(domain, method, uri)] = item } // 动态注册,首先需要判断是否是动态注册,如果不是那么就没必要添加到动态注册记录变量中 @@ -121,19 +121,41 @@ func (s *Server) compareHandlerItemPriority(newItem, oldItem *HandlerItem) bool // 服务方法检索 func (s *Server) searchHandler(r *Request) *HandlerItem { + f := s.searchHandlerStatic(r) + if f == nil { + f = s.searchHandlerDynamic(r) + } + // 如果检索不到服务,那么使用默认的"/"服务注册来执行服务 + // "/"静态路由是特殊的路由,当所有服务都找不到时,会交给"/"路由规则的控制器来处理 + if f == nil && r.URL.Path != "/" { + path := r.URL.Path + r.URL.Path = "/" + f = s.searchHandlerStatic(r) + r.URL.Path = path + } + return f +} + +// 检索静态路由规则 +func (s *Server) searchHandlerStatic(r *Request) *HandlerItem { s.hmmu.RLock() + defer s.hmmu.RUnlock() domains := []string{gDEFAULT_DOMAIN, strings.Split(r.Host, ":")[0]} // 首先进行静态匹配 for _, domain := range domains { if f, ok := s.handlerMap[s.handlerKey(domain, r.Method, r.URL.Path)]; ok { - s.hmmu.RUnlock() return f } } - s.hmmu.RUnlock() - // 其次进行动态匹配 - array := strings.Split(r.URL.Path[1:], "/") + return nil +} + +// 检索动态路由规则 +func (s *Server) searchHandlerDynamic(r *Request) *HandlerItem { + domains := []string{gDEFAULT_DOMAIN, strings.Split(r.Host, ":")[0]} + array := strings.Split(r.URL.Path[1:], "/") s.htmu.RLock() + defer s.htmu.RLock() for _, domain := range domains { p, ok := s.handlerTree[domain] if !ok { @@ -182,14 +204,12 @@ func (s *Server) searchHandler(r *Request) *HandlerItem { } } } - s.htmu.RUnlock() return item } } } } } - s.htmu.RUnlock() return nil } @@ -235,7 +255,7 @@ func (s *Server) isUriHasRule(uri string) bool { } // 生成回调方法查询的Key -func (s *Server) handlerKey(domain, method, pattern string) string { - return strings.ToUpper(method) + ":" + pattern + "@" + strings.ToLower(domain) +func (s *Server) handlerKey(domain, method, uri string) string { + return strings.ToUpper(method) + ":" + uri + "@" + strings.ToLower(domain) } diff --git a/geg/net/ghttp/hello.go b/geg/net/ghttp/hello.go index 8802776a4..59753b53a 100644 --- a/geg/net/ghttp/hello.go +++ b/geg/net/ghttp/hello.go @@ -3,19 +3,23 @@ package main import "gitee.com/johng/gf/g/net/ghttp" func main() { - ghttp.GetServer().BindHandler("/:name/*any", func(r *ghttp.Request) { - r.Response.WriteString("any") - r.Response.WriteString(r.GetQueryString("name")) - r.Response.WriteString(r.GetQueryString("any")) + ghttp.GetServer().BindHandler("get:/h", func(r *ghttp.Request) { + r.Response.WriteString("hello world") }) - //ghttp.GetServer().BindHandler("/:name/action", func(r *ghttp.Request) { + + //ghttp.GetServer().BindHandler("/:name/*any", func(r *ghttp.Request) { + // r.Response.WriteString("any") // r.Response.WriteString(r.GetQueryString("name")) + // r.Response.WriteString(r.GetQueryString("any")) + //}) + ////ghttp.GetServer().BindHandler("/:name/action", func(r *ghttp.Request) { + //// r.Response.WriteString(r.GetQueryString("name")) + ////}) + //ghttp.GetServer().BindHandler("/:name/:action/:aaa", func(r *ghttp.Request) { + // r.Response.WriteString("name") + // r.Response.WriteString(r.GetQueryString("name")) + // r.Response.WriteString(r.GetQueryString("action")) //}) - ghttp.GetServer().BindHandler("/:name/:action/:aaa", func(r *ghttp.Request) { - r.Response.WriteString("name") - r.Response.WriteString(r.GetQueryString("name")) - r.Response.WriteString(r.GetQueryString("action")) - }) ghttp.GetServer().SetPort(10000) ghttp.GetServer().Run() } \ No newline at end of file