mirror of
https://github.com/gin-gonic/gin.git
synced 2026-09-04 14:49:27 +08:00
Merge ec2c83899541c81bdb2063673d1f368117679726 into dcaa4296d111981ffb31ac3eba90bb63e1eb5ab9
This commit is contained in:
commit
5d39bb1b95
@ -1208,6 +1208,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)
|
||||
|
||||
@ -3955,3 +3955,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