go-http-utils / etag

:ticket:HTTP etag support middleware for Go
https://godoc.org/github.com/go-http-utils/etag
MIT License
13 stars 7 forks source link

fatal error: stack overflow #1

Open wuyazi opened 3 years ago

wuyazi commented 3 years ago

mycode is:

    router := gin.New()
    router.Use(gin.Recovery())
    router.Use(func(ctx *gin.Context) {
        requestGroup.Add(1)
        defer requestGroup.Done()
        ctx.Next()
    })
        router.Use(gin.WrapH(etag.Handler(router, config.HttpETagWeak)))

go version 1.6 gin version 1.7.3

the error is

runtime: goroutine stack exceeds 1000000000-byte limit
runtime: sp=0xc0207b0320 stack=[0xc0207b0000, 0xc0407b0000]
fatal error: stack overflow

runtime stack:
runtime.throw(0x5547d7a, 0xe)
        /Users/xiandong/go/go1.16.6/src/runtime/panic.go:1117 +0x72
runtime.newstack()
        /Users/xiandong/go/go1.16.6/src/runtime/stack.go:1069 +0x86d
runtime.morestack()
        /Users/xiandong/go/go1.16.6/src/runtime/asm_amd64.s:458 +0x8f

goroutine 130 [running]:
runtime.getMCache(0xc0003a6000)
        /Users/xiandong/go/go1.16.6/src/runtime/mcache.go:125 +0x67 fp=0xc0207b0330 sp=0xc0207b0328 pc=0x401ef67
runtime.mallocgc(0x38, 0x547e240, 0x1, 0x0)
        /Users/xiandong/go/go1.16.6/src/runtime/malloc.go:977 +0x19e fp=0xc0207b03c0 sp=0xc0207b0330 pc=0x4010fbe
runtime.newobject(0x547e240, 0x0)
        /Users/xiandong/go/go1.16.6/src/runtime/malloc.go:1177 +0x38 fp=0xc0207b03f0 sp=0xc0207b03c0 pc=0x4011798
github.com/go-http-utils/etag.Handler.func1(0xc256840, 0xc00a729400, 0xc000216500)
        /Users/xiandong/go/pkg/mod/github.com/go-http-utils/etag@v0.0.0-20161124023236-513ea8f21eb1/etag.go:56 +0x65 fp=0xc0207b05f8 sp=0xc0207b03f0 pc=0x4f88585
net/http.HandlerFunc.ServeHTTP(0xc00039c420, 0xc256840, 0xc00a729400, 0xc000216500)
        /Users/xiandong/go/go1.16.6/src/net/http/server.go:2049 +0x44 fp=0xc0207b0620 sp=0xc0207b05f8 pc=0x44beb64
github.com/gin-gonic/gin.WrapH.func1(0xc00a729400)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/utils.go:48 +0xc9 fp=0xc0207b06a0 sp=0xc0207b0620 pc=0x4f84e09
github.com/gin-gonic/gin.(*Context).Next(0xc00a729400)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/context.go:165 +0x8f fp=0xc0207b06c8 sp=0xc0207b06a0 pc=0x4f67c8f
xgit.italki.com/go/user-service/application.NewGinService.func1(0xc00a729400)
        /Users/xiandong/go/src/xgit.italki.com/go/user-service/application/http.go:95 +0x7c fp=0xc0207b0738 sp=0xc0207b06c8 pc=0x52575fc
github.com/gin-gonic/gin.(*Context).Next(0xc00a729400)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/context.go:165 +0x8f fp=0xc0207b0760 sp=0xc0207b0738 pc=0x4f67c8f
github.com/gin-gonic/gin.CustomRecoveryWithWriter.func1(0xc00a729400)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/recovery.go:99 +0xa5 fp=0xc0207b07f8 sp=0xc0207b0760 pc=0x4f84945
github.com/gin-gonic/gin.(*Context).Next(0xc00a729400)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/context.go:165 +0x8f fp=0xc0207b0820 sp=0xc0207b07f8 pc=0x4f67c8f
github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0003f6000, 0xc00a729400)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/gin.go:489 +0x414 fp=0xc0207b09d8 sp=0xc0207b0820 pc=0x4f75fd4
github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0003f6000, 0x5624d28, 0xc00a721c00, 0xc000216500)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/gin.go:445 +0xdf fp=0xc0207b0a38 sp=0xc0207b09d8 pc=0x4f75abf
github.com/go-http-utils/etag.Handler.func1(0xc256840, 0xc00a729300, 0xc000216500)
        /Users/xiandong/go/pkg/mod/github.com/go-http-utils/etag@v0.0.0-20161124023236-513ea8f21eb1/etag.go:57 +0x1b4 fp=0xc0207b0c40 sp=0xc0207b0a38 pc=0x4f886d4
net/http.HandlerFunc.ServeHTTP(0xc00039c420, 0xc256840, 0xc00a729300, 0xc000216500)
        /Users/xiandong/go/go1.16.6/src/net/http/server.go:2049 +0x44 fp=0xc0207b0c68 sp=0xc0207b0c40 pc=0x44beb64
github.com/gin-gonic/gin.WrapH.func1(0xc00a729300)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/utils.go:48 +0xc9 fp=0xc0207b0ce8 sp=0xc0207b0c68 pc=0x4f84e09
github.com/gin-gonic/gin.(*Context).Next(0xc00a729300)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/context.go:165 +0x8f fp=0xc0207b0d10 sp=0xc0207b0ce8 pc=0x4f67c8f
xgit.italki.com/go/user-service/application.NewGinService.func1(0xc00a729300)
        /Users/xiandong/go/src/xgit.italki.com/go/user-service/application/http.go:95 +0x7c fp=0xc0207b0d80 sp=0xc0207b0d10 pc=0x52575fc
github.com/gin-gonic/gin.(*Context).Next(0xc00a729300)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/context.go:165 +0x8f fp=0xc0207b0da8 sp=0xc0207b0d80 pc=0x4f67c8f
github.com/gin-gonic/gin.CustomRecoveryWithWriter.func1(0xc00a729300)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/recovery.go:99 +0xa5 fp=0xc0207b0e40 sp=0xc0207b0da8 pc=0x4f84945
github.com/gin-gonic/gin.(*Context).Next(0xc00a729300)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/context.go:165 +0x8f fp=0xc0207b0e68 sp=0xc0207b0e40 pc=0x4f67c8f
github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0003f6000, 0xc00a729300)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/gin.go:489 +0x414 fp=0xc0207b1020 sp=0xc0207b0e68 pc=0x4f75fd4
github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0003f6000, 0x5624d28, 0xc00a721bc0, 0xc000216500)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/gin.go:445 +0xdf fp=0xc0207b1080 sp=0xc0207b1020 pc=0x4f75abf
github.com/go-http-utils/etag.Handler.func1(0xc256840, 0xc00a729200, 0xc000216500)
        /Users/xiandong/go/pkg/mod/github.com/go-http-utils/etag@v0.0.0-20161124023236-513ea8f21eb1/etag.go:57 +0x1b4 fp=0xc0207b1288 sp=0xc0207b1080 pc=0x4f886d4
net/http.HandlerFunc.ServeHTTP(0xc00039c420, 0xc256840, 0xc00a729200, 0xc000216500)
        /Users/xiandong/go/go1.16.6/src/net/http/server.go:2049 +0x44 fp=0xc0207b12b0 sp=0xc0207b1288 pc=0x44beb64
github.com/gin-gonic/gin.WrapH.func1(0xc00a729200)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/utils.go:48 +0xc9 fp=0xc0207b1330 sp=0xc0207b12b0 pc=0x4f84e09
github.com/gin-gonic/gin.(*Context).Next(0xc00a729200)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/context.go:165 +0x8f fp=0xc0207b1358 sp=0xc0207b1330 pc=0x4f67c8f
xgit.italki.com/go/user-service/application.NewGinService.func1(0xc00a729200)
        /Users/xiandong/go/src/xgit.italki.com/go/user-service/application/http.go:95 +0x7c fp=0xc0207b13c8 sp=0xc0207b1358 pc=0x52575fc
github.com/gin-gonic/gin.(*Context).Next(0xc00a729200)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/context.go:165 +0x8f fp=0xc0207b13f0 sp=0xc0207b13c8 pc=0x4f67c8f
github.com/gin-gonic/gin.CustomRecoveryWithWriter.func1(0xc00a729200)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/recovery.go:99 +0xa5 fp=0xc0207b1488 sp=0xc0207b13f0 pc=0x4f84945
github.com/gin-gonic/gin.(*Context).Next(0xc00a729200)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/context.go:165 +0x8f fp=0xc0207b14b0 sp=0xc0207b1488 pc=0x4f67c8f
github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0003f6000, 0xc00a729200)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/gin.go:489 +0x414 fp=0xc0207b1668 sp=0xc0207b14b0 pc=0x4f75fd4
github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0003f6000, 0x5624d28, 0xc00a721b80, 0xc000216500)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/gin.go:445 +0xdf fp=0xc0207b16c8 sp=0xc0207b1668 pc=0x4f75abf
github.com/go-http-utils/etag.Handler.func1(0xc256840, 0xc00a729100, 0xc000216500)
        /Users/xiandong/go/pkg/mod/github.com/go-http-utils/etag@v0.0.0-20161124023236-513ea8f21eb1/etag.go:57 +0x1b4 fp=0xc0207b18d0 sp=0xc0207b16c8 pc=0x4f886d4
net/http.HandlerFunc.ServeHTTP(0xc00039c420, 0xc256840, 0xc00a729100, 0xc000216500)
        /Users/xiandong/go/go1.16.6/src/net/http/server.go:2049 +0x44 fp=0xc0207b18f8 sp=0xc0207b18d0 pc=0x44beb64
github.com/gin-gonic/gin.WrapH.func1(0xc00a729100)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/utils.go:48 +0xc9 fp=0xc0207b1978 sp=0xc0207b18f8 pc=0x4f84e09
github.com/gin-gonic/gin.(*Context).Next(0xc00a729100)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/context.go:165 +0x8f fp=0xc0207b19a0 sp=0xc0207b1978 pc=0x4f67c8f
xgit.italki.com/go/user-service/application.NewGinService.func1(0xc00a729100)
        /Users/xiandong/go/src/xgit.italki.com/go/user-service/application/http.go:95 +0x7c fp=0xc0207b1a10 sp=0xc0207b19a0 pc=0x52575fc
github.com/gin-gonic/gin.(*Context).Next(0xc00a729100)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/context.go:165 +0x8f fp=0xc0207b1a38 sp=0xc0207b1a10 pc=0x4f67c8f
github.com/gin-gonic/gin.CustomRecoveryWithWriter.func1(0xc00a729100)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/recovery.go:99 +0xa5 fp=0xc0207b1ad0 sp=0xc0207b1a38 pc=0x4f84945
github.com/gin-gonic/gin.(*Context).Next(0xc00a729100)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/context.go:165 +0x8f fp=0xc0207b1af8 sp=0xc0207b1ad0 pc=0x4f67c8f
github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0003f6000, 0xc00a729100)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/gin.go:489 +0x414 fp=0xc0207b1cb0 sp=0xc0207b1af8 pc=0x4f75fd4
github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0003f6000, 0x5624d28, 0xc00a721b40, 0xc000216500)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/gin.go:445 +0xdf fp=0xc0207b1d10 sp=0xc0207b1cb0 pc=0x4f75abf
github.com/go-http-utils/etag.Handler.func1(0xc256840, 0xc00a729000, 0xc000216500)
        /Users/xiandong/go/pkg/mod/github.com/go-http-utils/etag@v0.0.0-20161124023236-513ea8f21eb1/etag.go:57 +0x1b4 fp=0xc0207b1f18 sp=0xc0207b1d10 pc=0x4f886d4
net/http.HandlerFunc.ServeHTTP(0xc00039c420, 0xc256840, 0xc00a729000, 0xc000216500)
        /Users/xiandong/go/go1.16.6/src/net/http/server.go:2049 +0x44 fp=0xc0207b1f40 sp=0xc0207b1f18 pc=0x44beb64
github.com/gin-gonic/gin.WrapH.func1(0xc00a729000)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/utils.go:48 +0xc9 fp=0xc0207b1fc0 sp=0xc0207b1f40 pc=0x4f84e09
github.com/gin-gonic/gin.(*Context).Next(0xc00a729000)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/context.go:165 +0x8f fp=0xc0207b1fe8 sp=0xc0207b1fc0 pc=0x4f67c8f
xgit.italki.com/go/user-service/application.NewGinService.func1(0xc00a729000)
        /Users/xiandong/go/src/xgit.italki.com/go/user-service/application/http.go:95 +0x7c fp=0xc0207b2058 sp=0xc0207b1fe8 pc=0x52575fc
github.com/gin-gonic/gin.(*Context).Next(0xc00a729000)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/context.go:165 +0x8f fp=0xc0207b2080 sp=0xc0207b2058 pc=0x4f67c8f
github.com/gin-gonic/gin.CustomRecoveryWithWriter.func1(0xc00a729000)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/recovery.go:99 +0xa5 fp=0xc0207b2118 sp=0xc0207b2080 pc=0x4f84945
github.com/gin-gonic/gin.(*Context).Next(0xc00a729000)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/context.go:165 +0x8f fp=0xc0207b2140 sp=0xc0207b2118 pc=0x4f67c8f
github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0003f6000, 0xc00a729000)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/gin.go:489 +0x414 fp=0xc0207b22f8 sp=0xc0207b2140 pc=0x4f75fd4
github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0003f6000, 0x5624d28, 0xc00a721b00, 0xc000216500)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/gin.go:445 +0xdf fp=0xc0207b2358 sp=0xc0207b22f8 pc=0x4f75abf
github.com/go-http-utils/etag.Handler.func1(0xc256840, 0xc00a728f00, 0xc000216500)
        /Users/xiandong/go/pkg/mod/github.com/go-http-utils/etag@v0.0.0-20161124023236-513ea8f21eb1/etag.go:57 +0x1b4 fp=0xc0207b2560 sp=0xc0207b2358 pc=0x4f886d4
net/http.HandlerFunc.ServeHTTP(0xc00039c420, 0xc256840, 0xc00a728f00, 0xc000216500)
        /Users/xiandong/go/go1.16.6/src/net/http/server.go:2049 +0x44 fp=0xc0207b2588 sp=0xc0207b2560 pc=0x44beb64
github.com/gin-gonic/gin.WrapH.func1(0xc00a728f00)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/utils.go:48 +0xc9 fp=0xc0207b2608 sp=0xc0207b2588 pc=0x4f84e09
github.com/gin-gonic/gin.(*Context).Next(0xc00a728f00)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/context.go:165 +0x8f fp=0xc0207b2630 sp=0xc0207b2608 pc=0x4f67c8f
xgit.italki.com/go/user-service/application.NewGinService.func1(0xc00a728f00)
        /Users/xiandong/go/src/xgit.italki.com/go/user-service/application/http.go:95 +0x7c fp=0xc0207b26a0 sp=0xc0207b2630 pc=0x52575fc
github.com/gin-gonic/gin.(*Context).Next(0xc00a728f00)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/context.go:165 +0x8f fp=0xc0207b26c8 sp=0xc0207b26a0 pc=0x4f67c8f
github.com/gin-gonic/gin.CustomRecoveryWithWriter.func1(0xc00a728f00)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/recovery.go:99 +0xa5 fp=0xc0207b2760 sp=0xc0207b26c8 pc=0x4f84945
github.com/gin-gonic/gin.(*Context).Next(0xc00a728f00)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/context.go:165 +0x8f fp=0xc0207b2788 sp=0xc0207b2760 pc=0x4f67c8f
github.com/gin-gonic/gin.(*Engine).handleHTTPRequest(0xc0003f6000, 0xc00a728f00)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/gin.go:489 +0x414 fp=0xc0207b2940 sp=0xc0207b2788 pc=0x4f75fd4
github.com/gin-gonic/gin.(*Engine).ServeHTTP(0xc0003f6000, 0x5624d28, 0xc00a721ac0, 0xc000216500)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/gin.go:445 +0xdf fp=0xc0207b29a0 sp=0xc0207b2940 pc=0x4f75abf
github.com/go-http-utils/etag.Handler.func1(0xc256840, 0xc00a728e00, 0xc000216500)
        /Users/xiandong/go/pkg/mod/github.com/go-http-utils/etag@v0.0.0-20161124023236-513ea8f21eb1/etag.go:57 +0x1b4 fp=0xc0207b2ba8 sp=0xc0207b29a0 pc=0x4f886d4
net/http.HandlerFunc.ServeHTTP(0xc00039c420, 0xc256840, 0xc00a728e00, 0xc000216500)
        /Users/xiandong/go/go1.16.6/src/net/http/server.go:2049 +0x44 fp=0xc0207b2bd0 sp=0xc0207b2ba8 pc=0x44beb64
github.com/gin-gonic/gin.WrapH.func1(0xc00a728e00)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/utils.go:48 +0xc9 fp=0xc0207b2c50 sp=0xc0207b2bd0 pc=0x4f84e09
github.com/gin-gonic/gin.(*Context).Next(0xc00a728e00)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/context.go:165 +0x8f fp=0xc0207b2c78 sp=0xc0207b2c50 pc=0x4f67c8f
xgit.italki.com/go/user-service/application.NewGinService.func1(0xc00a728e00)
        /Users/xiandong/go/src/xgit.italki.com/go/user-service/application/http.go:95 +0x7c fp=0xc0207b2ce8 sp=0xc0207b2c78 pc=0x52575fc
github.com/gin-gonic/gin.(*Context).Next(0xc00a728e00)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/context.go:165 +0x8f fp=0xc0207b2d10 sp=0xc0207b2ce8 pc=0x4f67c8f
github.com/gin-gonic/gin.CustomRecoveryWithWriter.func1(0xc00a728e00)
        /Users/xiandong/go/pkg/mod/github.com/gin-gonic/gin@v1.7.3/recovery.go:99 +0xa5 fp=0xc0207b2da8 sp=0xc0207b2d10 pc=0x4f84945
github.com/gin-gonic/gin.(*Context).Next(0xc00a728e00)
...
lewislbr commented 2 years ago

Don't use it as a middleware, wrap the router instead:

https://gin-gonic.com/docs/examples/custom-http-config

    s := &http.Server{}
    s.Handler = etag.Handler(r, false)