From ca5e7090c7d2ed03ec75c3f240c39de59788838d Mon Sep 17 00:00:00 2001 From: Dmitry Kutakov Date: Thu, 7 Feb 2019 13:28:43 +0300 Subject: [PATCH] fix call Stream() on copy of *Context (#1763) --- context.go | 1 - context_test.go | 27 ++++++++++++++++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/context.go b/context.go index 26badfc3..d9d7444b 100644 --- a/context.go +++ b/context.go @@ -78,7 +78,6 @@ func (c *Context) reset() { // This has to be used when the context has to be passed to a goroutine. func (c *Context) Copy() *Context { var cp = *c - cp.writermem.ResponseWriter = nil cp.Writer = &cp.writermem cp.index = abortIndex cp.handlers = nil diff --git a/context_test.go b/context_test.go index ea936b85..810972ea 100644 --- a/context_test.go +++ b/context_test.go @@ -324,7 +324,6 @@ func TestContextCopy(t *testing.T) { cp := c.Copy() assert.Nil(t, cp.handlers) - assert.Nil(t, cp.writermem.ResponseWriter) assert.Equal(t, &cp.writermem, cp.Writer.(*responseWriter)) assert.Equal(t, cp.Request, c.Request) assert.Equal(t, cp.index, abortIndex) @@ -1755,3 +1754,29 @@ func TestContextResetInHandler(t *testing.T) { c.Next() }) } + +func TestContextStreamToCopyOfContext(t *testing.T) { + w := CreateTestResponseRecorder() + c, _ := CreateTestContext(w) + + h := func(c *Context) { + nc := c.Copy() + nc.Stream(func(w io.Writer) bool { + w.Write([]byte("1")) + return false + }) + c.String(http.StatusOK, "%s", "2") + w.closeClient() + + nc.Stream(func(w io.Writer) bool { + w.Write([]byte("3")) + return false + }) + } + + assert.NotPanics(t, func() { + h(c) + }) + + assert.Equal(t, "12", w.Body.String()) +}