fix(router): tree bug where loop index is not decremented. (#3460)
fixes https://github.com/gin-gonic/gin/issues/3459
This commit is contained in:
		
				
					committed by
					
						
						GitHub
					
				
			
			
				
	
			
			
			
						parent
						
							c58e0d59ca
						
					
				
				
					commit
					8eb5f832ba
				
			@ -670,3 +670,22 @@ func TestRouteContextHoldsFullPath(t *testing.T) {
 | 
			
		||||
	w := PerformRequest(router, http.MethodGet, "/not-found")
 | 
			
		||||
	assert.Equal(t, http.StatusNotFound, w.Code)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestEngineHandleMethodNotAllowedCornerCase(t *testing.T) {
 | 
			
		||||
	r := New()
 | 
			
		||||
	r.HandleMethodNotAllowed = true
 | 
			
		||||
 | 
			
		||||
	base := r.Group("base")
 | 
			
		||||
	base.GET("/metrics", handlerTest1)
 | 
			
		||||
 | 
			
		||||
	v1 := base.Group("v1")
 | 
			
		||||
 | 
			
		||||
	v1.GET("/:id/devices", handlerTest1)
 | 
			
		||||
	v1.GET("/user/:id/groups", handlerTest1)
 | 
			
		||||
 | 
			
		||||
	v1.GET("/orgs/:id", handlerTest1)
 | 
			
		||||
	v1.DELETE("/orgs/:id", handlerTest1)
 | 
			
		||||
 | 
			
		||||
	w := PerformRequest(r, "GET", "/base/v1/user/groups")
 | 
			
		||||
	assert.Equal(t, http.StatusNotFound, w.Code)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										18
									
								
								tree.go
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								tree.go
									
									
									
									
									
								
							@ -459,9 +459,9 @@ walk: // Outer loop for walking the tree
 | 
			
		||||
					// If the path at the end of the loop is not equal to '/' and the current node has no child nodes
 | 
			
		||||
					// the current node needs to roll back to last valid skippedNode
 | 
			
		||||
					if path != "/" {
 | 
			
		||||
						for l := len(*skippedNodes); l > 0; {
 | 
			
		||||
							skippedNode := (*skippedNodes)[l-1]
 | 
			
		||||
							*skippedNodes = (*skippedNodes)[:l-1]
 | 
			
		||||
						for length := len(*skippedNodes); length > 0; length-- {
 | 
			
		||||
							skippedNode := (*skippedNodes)[length-1]
 | 
			
		||||
							*skippedNodes = (*skippedNodes)[:length-1]
 | 
			
		||||
							if strings.HasSuffix(skippedNode.path, path) {
 | 
			
		||||
								path = skippedNode.path
 | 
			
		||||
								n = skippedNode.node
 | 
			
		||||
@ -576,9 +576,9 @@ walk: // Outer loop for walking the tree
 | 
			
		||||
			// If the current path does not equal '/' and the node does not have a registered handle and the most recently matched node has a child node
 | 
			
		||||
			// the current node needs to roll back to last valid skippedNode
 | 
			
		||||
			if n.handlers == nil && path != "/" {
 | 
			
		||||
				for l := len(*skippedNodes); l > 0; {
 | 
			
		||||
					skippedNode := (*skippedNodes)[l-1]
 | 
			
		||||
					*skippedNodes = (*skippedNodes)[:l-1]
 | 
			
		||||
				for length := len(*skippedNodes); length > 0; length-- {
 | 
			
		||||
					skippedNode := (*skippedNodes)[length-1]
 | 
			
		||||
					*skippedNodes = (*skippedNodes)[:length-1]
 | 
			
		||||
					if strings.HasSuffix(skippedNode.path, path) {
 | 
			
		||||
						path = skippedNode.path
 | 
			
		||||
						n = skippedNode.node
 | 
			
		||||
@ -633,9 +633,9 @@ walk: // Outer loop for walking the tree
 | 
			
		||||
 | 
			
		||||
		// roll back to last valid skippedNode
 | 
			
		||||
		if !value.tsr && path != "/" {
 | 
			
		||||
			for l := len(*skippedNodes); l > 0; {
 | 
			
		||||
				skippedNode := (*skippedNodes)[l-1]
 | 
			
		||||
				*skippedNodes = (*skippedNodes)[:l-1]
 | 
			
		||||
			for length := len(*skippedNodes); length > 0; length-- {
 | 
			
		||||
				skippedNode := (*skippedNodes)[length-1]
 | 
			
		||||
				*skippedNodes = (*skippedNodes)[:length-1]
 | 
			
		||||
				if strings.HasSuffix(skippedNode.path, path) {
 | 
			
		||||
					path = skippedNode.path
 | 
			
		||||
					n = skippedNode.node
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user