فهرست منبع

fix #1804 which is caused by calling middleware twice. (#1805)

Fix: https://github.com/gin-gonic/gin/issues/1804

`allNoRoute` contains middlewares such as `gin.Logger`, `gin.Recovery`, so on.  The correct code is to use `noRoute`.

cc: @MetalBreaker
Sai 6 سال پیش
والد
کامیت
4a23c4f7b9
2فایلهای تغییر یافته به همراه22 افزوده شده و 2 حذف شده
  1. 1 1
      routergroup.go
  2. 21 1
      routes_test.go

+ 1 - 1
routergroup.go

@@ -195,7 +195,7 @@ func (group *RouterGroup) createStaticHandler(relativePath string, fs http.FileS
 		// Check if file exists and/or if we have permission to access it
 		if _, err := fs.Open(file); err != nil {
 			c.Writer.WriteHeader(http.StatusNotFound)
-			c.handlers = group.engine.allNoRoute
+			c.handlers = group.engine.noRoute
 			// Reset index
 			c.index = -1
 			return

+ 21 - 1
routes_test.go

@@ -429,7 +429,6 @@ func TestRouterNotFound(t *testing.T) {
 
 func TestRouterStaticFSNotFound(t *testing.T) {
 	router := New()
-
 	router.StaticFS("/", http.FileSystem(http.Dir("/thisreallydoesntexist/")))
 	router.NoRoute(func(c *Context) {
 		c.String(404, "non existent")
@@ -452,6 +451,27 @@ func TestRouterStaticFSFileNotFound(t *testing.T) {
 	})
 }
 
+// Reproduction test for the bug of issue #1805
+func TestMiddlewareCalledOnceByRouterStaticFSNotFound(t *testing.T) {
+	router := New()
+
+	// Middleware must be called just only once by per request.
+	middlewareCalledNum := 0
+	router.Use(func(c *Context) {
+		middlewareCalledNum += 1
+	})
+
+	router.StaticFS("/", http.FileSystem(http.Dir("/thisreallydoesntexist/")))
+
+	// First access
+	performRequest(router, "GET", "/nonexistent")
+	assert.Equal(t, 1, middlewareCalledNum)
+
+	// Second access
+	performRequest(router, "HEAD", "/nonexistent")
+	assert.Equal(t, 2, middlewareCalledNum)
+}
+
 func TestRouteRawPath(t *testing.T) {
 	route := New()
 	route.UseRawPath = true