Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions context.go
Original file line number Diff line number Diff line change
Expand Up @@ -1158,6 +1158,10 @@ func (c *Context) Render(code int, r render.Render) {
return
}

if c.Writer.Written() {
debugPrint("[WARNING] Response body already written. Attempting to write again with status code %d", code)
}

if err := r.Render(c.Writer); err != nil {
// Pushing error to c.Errors
_ = c.Error(err)
Expand Down
44 changes: 44 additions & 0 deletions context_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3808,3 +3808,47 @@ func BenchmarkGetMapFromFormData(b *testing.B) {
})
}
}

func TestRenderMultipleWritesWarning(t *testing.T) {
// Test that a warning is printed when attempting to write response body multiple times
var w *httptest.ResponseRecorder
re := captureOutput(t, func() {
SetMode(DebugMode)
router := New()
router.GET("/test", func(c *Context) {
c.JSON(http.StatusOK, H{"first": "response"})
c.JSON(http.StatusOK, H{"second": "response"}) // Should trigger warning
})
w = httptest.NewRecorder()
req := httptest.NewRequest(http.MethodGet, "/test", nil)
router.ServeHTTP(w, req)
SetMode(TestMode)
})

// Should contain the warning about multiple writes
assert.Contains(t, re, "[WARNING] Response body already written")
assert.Contains(t, re, "200")

// Verify the response body contains both responses (behavior unchanged)
assert.Contains(t, w.Body.String(), "first")
assert.Contains(t, w.Body.String(), "second")
}

func TestRenderMultipleWritesNoWarningInReleaseMode(t *testing.T) {
// Test that no warning is printed in release mode
re := captureOutput(t, func() {
SetMode(ReleaseMode)
router := New()
router.GET("/test", func(c *Context) {
c.JSON(http.StatusOK, H{"first": "response"})
c.JSON(http.StatusOK, H{"second": "response"})
})
w := httptest.NewRecorder()
req := httptest.NewRequest(http.MethodGet, "/test", nil)
router.ServeHTTP(w, req)
SetMode(TestMode)
})

// Should not contain the warning in release mode
assert.NotContains(t, re, "[WARNING] Response body already written")
}
Loading