From eb2179bee8e77c730cb6bc528f656fcdf02f1d32 Mon Sep 17 00:00:00 2001 From: John Date: Mon, 16 Apr 2018 21:37:16 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E6=A8=A1=E7=B3=8A=E5=8C=B9?= =?UTF-8?q?=E9=85=8D=E8=A7=84=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- g/net/ghttp/http_server_router.go | 42 +++++++++++++++++++------------ 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/g/net/ghttp/http_server_router.go b/g/net/ghttp/http_server_router.go index c8f663918..06eadf04c 100644 --- a/g/net/ghttp/http_server_router.go +++ b/g/net/ghttp/http_server_router.go @@ -96,9 +96,10 @@ func (s *Server) setHandler(pattern string, item *HandlerItem) error { s.handlerTree[domain] = make(map[string]interface{}) } p := s.handlerTree[domain] + lists := make([]*list.List, 0) array := strings.Split(uri[1:], "/") item.priority = len(array) - for _, v := range array { + for k, v := range array { if len(v) == 0 { continue } @@ -107,34 +108,43 @@ func (s *Server) setHandler(pattern string, item *HandlerItem) error { fallthrough case '*': v = "/" + if v, ok := p.(map[string]interface{})["*list"]; !ok { + p.(map[string]interface{})["*list"] = list.New() + lists = append(lists, p.(map[string]interface{})["*list"].(*list.List)) + } else { + lists = append(lists, v.(*list.List)) + } fallthrough default: if _, ok := p.(map[string]interface{})[v]; !ok { p.(map[string]interface{})[v] = make(map[string]interface{}) } p = p.(map[string]interface{})[v] + // 到达叶子节点,往list中增加匹配规则 + if v != "/" && k == len(array) - 1 { + if v, ok := p.(map[string]interface{})["*list"]; !ok { + p.(map[string]interface{})["*list"] = list.New() + lists = append(lists, p.(map[string]interface{})["*list"].(*list.List)) + } else { + lists = append(lists, v.(*list.List)) + } + } } } - // 到达叶子节点 - var l *list.List - if v, ok := p.(map[string]interface{})["*list"]; !ok { - l = list.New() - p.(map[string]interface{})["*list"] = l - } else { - l = v.(*list.List) - } - //b,_ := gjson.New(s.handlerTree).ToJsonIndent() - //fmt.Println(string(b)) // 从头开始遍历链表,优先级高的放在前面 - for e := l.Front(); e != nil; e = e.Next() { - if s.compareHandlerItemPriority(item, e.Value.(*HandlerItem)) { - l.InsertBefore(item, e) - return nil + for _, l := range lists { + for e := l.Front(); e != nil; e = e.Next() { + if s.compareHandlerItemPriority(item, e.Value.(*HandlerItem)) { + l.InsertBefore(item, e) + return nil + } } + l.PushBack(item) } - l.PushBack(item) } + //b, _ := gparser.VarToJsonIndent(s.handlerTree) + //fmt.Println(string(b)) return nil }