Merge ec2c83899541c81bdb2063673d1f368117679726 into d3ffc9985281dcf4d3bef604cce4e662b1a327a6

This commit is contained in:
冰水泡枸杞 2026-03-30 03:50:23 +00:00 committed by GitHub
commit 1ee9e270b0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 48 additions and 0 deletions

View File

@ -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)

View File

@ -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")
}