diff --git a/context.go b/context.go index 5174033eb3..3024adde1e 100644 --- a/context.go +++ b/context.go @@ -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) diff --git a/context_test.go b/context_test.go index ef60379d77..879896c712 100644 --- a/context_test.go +++ b/context_test.go @@ -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") +}