Compare commits

...

3 Commits

Author SHA1 Message Date
李若
97ca605d68
Merge deb81c1d094026569067fabb5fad1eca258f6fbb into 63dd3e60cab89c27fb66bce1423bd268d52abad1 2025-11-28 17:28:34 +08:00
Yilong Li
63dd3e60ca
fix(recover): suppress http.ErrAbortHandler in recover (#4336)
Co-authored-by: Bo-Yi Wu <appleboy.tw@gmail.com>
2025-11-27 23:20:52 +08:00
liruohrh
deb81c1d09 fix: wildcard node should be the last child. 2025-10-13 20:35:15 +08:00
4 changed files with 31 additions and 1 deletions

View File

@ -68,6 +68,9 @@ func CustomRecoveryWithWriter(out io.Writer, handle RecoveryFunc) HandlerFunc {
}
}
}
if e, ok := err.(error); ok && errors.Is(e, http.ErrAbortHandler) {
brokenPipe = true
}
if logger != nil {
const stackSkip = 3
if brokenPipe {

View File

@ -142,6 +142,30 @@ func TestPanicWithBrokenPipe(t *testing.T) {
}
}
// TestPanicWithAbortHandler asserts that recovery handles http.ErrAbortHandler as broken pipe
func TestPanicWithAbortHandler(t *testing.T) {
const expectCode = 204
var buf strings.Builder
router := New()
router.Use(RecoveryWithWriter(&buf))
router.GET("/recovery", func(c *Context) {
// Start writing response
c.Header("X-Test", "Value")
c.Status(expectCode)
// Panic with ErrAbortHandler which should be treated as broken pipe
panic(http.ErrAbortHandler)
})
// RUN
w := PerformRequest(router, http.MethodGet, "/recovery")
// TEST
assert.Equal(t, expectCode, w.Code)
out := buf.String()
assert.Contains(t, out, "net/http: abort Handler")
assert.NotContains(t, out, "panic recovered")
}
func TestCustomRecoveryWithWriter(t *testing.T) {
errBuffer := new(strings.Builder)
buffer := new(strings.Builder)

View File

@ -832,7 +832,7 @@ walk: // Outer loop for walking the tree
return nil
}
n = n.children[0]
n = n.children[len(n.children)-1]
switch n.nType {
case param:
// Find param end (either '/' or path end)

View File

@ -751,6 +751,8 @@ func TestTreeFindCaseInsensitivePath(t *testing.T) {
"/w/𠜎", // 4 byte
"/w/𠜏/", // 4 byte
longPath,
"/param/same/:id",
"/param/same/1",
}
for _, route := range routes {
@ -844,6 +846,7 @@ func TestTreeFindCaseInsensitivePath(t *testing.T) {
{"/w/𠜎/", "/w/𠜎", true, true},
{"/w/𠜏", "/w/𠜏/", true, true},
{lOngPath, longPath, true, true},
{"/param/same/prefix/noexist", "", false, false},
}
// With fixTrailingSlash = true
for _, test := range tests {