mirror of
https://github.com/gin-gonic/gin.git
synced 2026-04-29 15:08:19 +08:00
Merge ec2c83899541c81bdb2063673d1f368117679726 into d3ffc9985281dcf4d3bef604cce4e662b1a327a6
This commit is contained in:
commit
1ee9e270b0
@ -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)
|
||||
|
||||
@ -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…
x
Reference in New Issue
Block a user