From b18c5bc9172381aa4add93adbf63d943531fc9a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=AE=88=E8=99=8E?= Date: Fri, 15 Feb 2019 14:37:53 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E8=B7=AF=E7=94=B1=E5=9C=B0?= =?UTF-8?q?=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- context.go | 5 +++++ debug.go | 1 + gin.go | 5 +++-- tree.go | 27 ++++++++++++++++++++++++++- 4 files changed, 35 insertions(+), 3 deletions(-) diff --git a/context.go b/context.go index 26badfc3..a3819239 100644 --- a/context.go +++ b/context.go @@ -20,6 +20,7 @@ import ( "github.com/gin-contrib/sse" "github.com/gin-gonic/gin/binding" "github.com/gin-gonic/gin/render" + "fmt" ) // Content-Type MIME of the most common data formats. @@ -634,6 +635,10 @@ func (c *Context) ShouldBindBodyWith(obj interface{}, bb binding.BindingBody) (e // X-Real-IP and X-Forwarded-For in order to work properly with reverse-proxies such us: nginx or haproxy. // Use X-Forwarded-For before X-Real-Ip as nginx uses X-Real-Ip with the proxy's IP. func (c *Context) ClientIP() string { + root:=c.engine.trees[0].root + fmt.Println("wsh2:",(*root.children[0]).allPath,root.indices) + fmt.Println("wsh002:",(*(root.children[1])),root.indices) + fmt.Println("wsh02:",len(root.children)) if c.engine.ForwardedByClientIP { clientIP := c.requestHeader("X-Forwarded-For") clientIP = strings.TrimSpace(strings.Split(clientIP, ",")[0]) diff --git a/debug.go b/debug.go index 98c67cf7..b078fd74 100644 --- a/debug.go +++ b/debug.go @@ -30,6 +30,7 @@ func debugPrintRoute(httpMethod, absolutePath string, handlers HandlersChain) { nuHandlers := len(handlers) handlerName := nameOfFunction(handlers.Last()) if DebugPrintRouteFunc == nil { + fmt.Println("wsh1:",absolutePath) debugPrint("%-6s %-25s --> %s (%d handlers)\n", httpMethod, absolutePath, handlerName, nuHandlers) } else { DebugPrintRouteFunc(httpMethod, absolutePath, handlerName, nuHandlers) diff --git a/gin.go b/gin.go index cd47200f..a946af46 100644 --- a/gin.go +++ b/gin.go @@ -376,10 +376,11 @@ func (engine *Engine) handleHTTPRequest(c *Context) { } root := t[i].root // Find route in tree - handlers, params, tsr := root.getValue(path, c.Params, unescape) + handlers, params, tsr,_ := root.getValue(path, c.Params, unescape) if handlers != nil { c.handlers = handlers c.Params = params + fmt.Println("params:",params) c.Next() c.writermem.WriteHeaderNow() return @@ -401,7 +402,7 @@ func (engine *Engine) handleHTTPRequest(c *Context) { if tree.method == httpMethod { continue } - if handlers, _, _ := tree.root.getValue(path, nil, unescape); handlers != nil { + if handlers, _, _ ,_:= tree.root.getValue(path, nil, unescape); handlers != nil { c.handlers = engine.allNoMethod serveError(c, http.StatusMethodNotAllowed, default405Body) return diff --git a/tree.go b/tree.go index ada62ceb..3bb0341b 100644 --- a/tree.go +++ b/tree.go @@ -8,6 +8,7 @@ import ( "net/url" "strings" "unicode" + "fmt" ) // Param is a single URL parameter, consisting of a key and a value. @@ -94,6 +95,7 @@ type node struct { nType nodeType maxParams uint8 wildChild bool + allPath string } // increments priority of the given child and reorders if necessary. @@ -123,6 +125,7 @@ func (n *node) incrementChildPrio(pos int) int { // addRoute adds a node with the given handle to the path. // Not concurrency-safe! func (n *node) addRoute(path string, handlers HandlersChain) { + fmt.Println("wsh66:",path) fullPath := path n.priority++ numParams := countParams(path) @@ -153,6 +156,7 @@ func (n *node) addRoute(path string, handlers HandlersChain) { indices: n.indices, children: n.children, handlers: n.handlers, + allPath:path, priority: n.priority - 1, } @@ -168,6 +172,7 @@ func (n *node) addRoute(path string, handlers HandlersChain) { n.indices = string([]byte{n.path[i]}) n.path = path[:i] n.handlers = nil + n.allPath=path n.wildChild = false } @@ -235,12 +240,14 @@ func (n *node) addRoute(path string, handlers HandlersChain) { n = child } n.insertChild(numParams, path, fullPath, handlers) + n.allPath=path return } else if i == len(path) { // Make node a (in-path) leaf if n.handlers != nil { panic("handlers are already registered for path '" + fullPath + "'") } + n.allPath=path n.handlers = handlers } return @@ -248,6 +255,7 @@ func (n *node) addRoute(path string, handlers HandlersChain) { } else { // Empty tree n.insertChild(numParams, path, fullPath, handlers) n.nType = root + n.allPath=path } } @@ -360,6 +368,7 @@ func (n *node) insertChild(numParams uint8, path string, fullPath string, handle } // insert remaining path part and handle to the leaf + fmt.Println("wsh21:",path[offset:]) n.path = path[offset:] n.handlers = handlers } @@ -369,7 +378,11 @@ func (n *node) insertChild(numParams uint8, path string, fullPath string, handle // If no handle can be found, a TSR (trailing slash redirect) recommendation is // made if a handle exists with an extra (without the) trailing slash for the // given path. -func (n *node) getValue(path string, po Params, unescape bool) (handlers HandlersChain, p Params, tsr bool) { +func (n *node) getValue(path string, po Params, unescape bool) (handlers HandlersChain, p Params, tsr bool,regPath string) { + regPath="" + defer func() { + fmt.Println("tsr:",tsr,"regpath:",regPath) + }() p = po walk: // Outer loop for walking the tree for { @@ -384,6 +397,8 @@ walk: // Outer loop for walking the tree for i := 0; i < len(n.indices); i++ { if c == n.indices[i] { n = n.children[i] + regPath+=n.path + fmt.Println("path4:",n.path,regPath) continue walk } } @@ -412,7 +427,11 @@ walk: // Outer loop for walking the tree i := len(p) p = p[:i+1] // expand slice within preallocated capacity p[i].Key = n.path[1:] + val := path[:end] + + regPath+=n.path + fmt.Println("path6:",n.path,regPath) if unescape { var err error if p[i].Value, err = url.QueryUnescape(val); err != nil { @@ -442,6 +461,7 @@ walk: // Outer loop for walking the tree // No handle found. Check if a handle for this path + a // trailing slash exists for TSR recommendation n = n.children[0] + tsr = n.path == "/" && n.handlers != nil } @@ -455,6 +475,7 @@ walk: // Outer loop for walking the tree i := len(p) p = p[:i+1] // expand slice within preallocated capacity p[i].Key = n.path[2:] + fmt.Println("path5:",n.path,n.allPath) if unescape { var err error if p[i].Value, err = url.QueryUnescape(path); err != nil { @@ -472,6 +493,8 @@ walk: // Outer loop for walking the tree } } } else if path == n.path { + fmt.Println("path2:",n.path) + regPath+=n.path // We should have reached the node containing the handle. // Check if this node has a handle registered. if handlers = n.handlers; handlers != nil { @@ -487,6 +510,7 @@ walk: // Outer loop for walking the tree // trailing slash exists for trailing slash recommendation for i := 0; i < len(n.indices); i++ { if n.indices[i] == '/' { + fmt.Println("path3:",n.children[i].path) n = n.children[i] tsr = (len(n.path) == 1 && n.handlers != nil) || (n.nType == catchAll && n.children[0].handlers != nil) @@ -502,6 +526,7 @@ walk: // Outer loop for walking the tree tsr = (path == "/") || (len(n.path) == len(path)+1 && n.path[len(path)] == '/' && path == n.path[:len(n.path)-1] && n.handlers != nil) + return } }