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.
|
// Disclaimer: You can loop yourself to deal with this, use wisely.
|
||||||
func (engine *Engine) HandleContext(c *Context) {
|
func (engine *Engine) HandleContext(c *Context) {
|
||||||
oldIndexValue := c.index
|
oldIndexValue := c.index
|
||||||
|
oldHandlers := c.handlers
|
||||||
c.reset()
|
c.reset()
|
||||||
engine.handleHTTPRequest(c)
|
engine.handleHTTPRequest(c)
|
||||||
|
|
||||||
c.index = oldIndexValue
|
c.index = oldIndexValue
|
||||||
|
c.handlers = oldHandlers
|
||||||
}
|
}
|
||||||
|
|
||||||
func (engine *Engine) handleHTTPRequest(c *Context) {
|
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)
|
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) {
|
func TestPrepareTrustedCIRDsWith(t *testing.T) {
|
||||||
r := New()
|
r := New()
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue