Przeglądaj źródła

fix Context.Next() - recheck len of handlers every iteration (#1745)

* fix Context.Next() - recheck len of handlers every iteration

* add tests when Context.reset() can be called inside of handler

TestEngineHandleContext
TestContextResetInHandler
TestRouterStaticFSFileNotFound

* Context.Next() - format to while style
Dmitry Kutakov 7 lat temu
rodzic
commit
4867ff9634
4 zmienionych plików z 41 dodań i 1 usunięć
  1. 2 1
      context.go
  2. 12 0
      context_test.go
  3. 17 0
      gin_test.go
  4. 10 0
      routes_test.go

+ 2 - 1
context.go

@@ -105,8 +105,9 @@ func (c *Context) Handler() HandlerFunc {
 // See example in GitHub.
 func (c *Context) Next() {
 	c.index++
-	for s := int8(len(c.handlers)); c.index < s; c.index++ {
+	for c.index < int8(len(c.handlers)) {
 		c.handlers[c.index](c)
+		c.index++
 	}
 }
 

+ 12 - 0
context_test.go

@@ -1743,3 +1743,15 @@ func TestContextStreamWithClientGone(t *testing.T) {
 
 	assert.Equal(t, "test", w.Body.String())
 }
+
+func TestContextResetInHandler(t *testing.T) {
+	w := CreateTestResponseRecorder()
+	c, _ := CreateTestContext(w)
+
+	c.handlers = []HandlerFunc{
+		func(c *Context) { c.reset() },
+	}
+	assert.NotPanics(t, func() {
+		c.Next()
+	})
+}

+ 17 - 0
gin_test.go

@@ -471,6 +471,23 @@ func TestListOfRoutes(t *testing.T) {
 	})
 }
 
+func TestEngineHandleContext(t *testing.T) {
+	r := New()
+	r.GET("/", func(c *Context) {
+		c.Request.URL.Path = "/v2"
+		r.HandleContext(c)
+	})
+	v2 := r.Group("/v2")
+	{
+		v2.GET("/", func(c *Context) {})
+	}
+
+	assert.NotPanics(t, func() {
+		w := performRequest(r, "GET", "/")
+		assert.Equal(t, 301, w.Code)
+	})
+}
+
 func assertRoutePresent(t *testing.T, gotRoutes RoutesInfo, wantRoute RouteInfo) {
 	for _, gotRoute := range gotRoutes {
 		if gotRoute.Path == wantRoute.Path && gotRoute.Method == wantRoute.Method {

+ 10 - 0
routes_test.go

@@ -427,6 +427,16 @@ func TestRouterStaticFSNotFound(t *testing.T) {
 	assert.Equal(t, "non existent", w.Body.String())
 }
 
+func TestRouterStaticFSFileNotFound(t *testing.T) {
+	router := New()
+
+	router.StaticFS("/", http.FileSystem(http.Dir(".")))
+
+	assert.NotPanics(t, func() {
+		performRequest(router, "GET", "/nonexistent")
+	})
+}
+
 func TestRouteRawPath(t *testing.T) {
 	route := New()
 	route.UseRawPath = true