mirror of https://github.com/gin-gonic/gin.git
prevent middleware re-entry issue in HandleContext
This commit is contained in:
parent
64ead9e6bd
commit
66f93fdfde
2
gin.go
2
gin.go
|
@ -637,10 +637,12 @@ func (engine *Engine) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
|||
// Disclaimer: You can loop yourself to deal with this, use wisely.
|
||||
func (engine *Engine) HandleContext(c *Context) {
|
||||
oldIndexValue := c.index
|
||||
oldHandlers := c.handlers
|
||||
c.reset()
|
||||
engine.handleHTTPRequest(c)
|
||||
|
||||
c.index = oldIndexValue
|
||||
c.handlers = oldHandlers
|
||||
}
|
||||
|
||||
func (engine *Engine) handleHTTPRequest(c *Context) {
|
||||
|
|
38
gin_test.go
38
gin_test.go
|
@ -572,6 +572,44 @@ func TestEngineHandleContextManyReEntries(t *testing.T) {
|
|||
assert.Equal(t, int64(expectValue), middlewareCounter)
|
||||
}
|
||||
|
||||
func TestEngineHandleContextPreventsMiddlewareReEntry(t *testing.T) {
|
||||
// given
|
||||
var handlerCounterV1, handlerCounterV2, middlewareCounterV1 int64
|
||||
|
||||
r := New()
|
||||
v1 := r.Group("/v1")
|
||||
{
|
||||
v1.Use(func(c *Context) {
|
||||
atomic.AddInt64(&middlewareCounterV1, 1)
|
||||
})
|
||||
v1.GET("/test", func(c *Context) {
|
||||
atomic.AddInt64(&handlerCounterV1, 1)
|
||||
c.Status(http.StatusOK)
|
||||
})
|
||||
}
|
||||
|
||||
v2 := r.Group("/v2")
|
||||
{
|
||||
v2.GET("/test", func(c *Context) {
|
||||
c.Request.URL.Path = "/v1/test"
|
||||
r.HandleContext(c)
|
||||
}, func(c *Context) {
|
||||
atomic.AddInt64(&handlerCounterV2, 1)
|
||||
})
|
||||
}
|
||||
|
||||
// when
|
||||
responseV1 := PerformRequest(r, "GET", "/v1/test")
|
||||
responseV2 := PerformRequest(r, "GET", "/v2/test")
|
||||
|
||||
// then
|
||||
assert.Equal(t, 200, responseV1.Code)
|
||||
assert.Equal(t, 200, responseV2.Code)
|
||||
assert.Equal(t, int64(2), handlerCounterV1)
|
||||
assert.Equal(t, int64(2), middlewareCounterV1)
|
||||
assert.Equal(t, int64(1), handlerCounterV2)
|
||||
}
|
||||
|
||||
func TestPrepareTrustedCIRDsWith(t *testing.T) {
|
||||
r := New()
|
||||
|
||||
|
|
Loading…
Reference in New Issue