fix(handler): 补齐 opsCaptureWriter 全部委托方法的 nil 守卫

This commit is contained in:
li
2026-07-10 21:03:40 +08:00
parent 89a551b964
commit bc3cb29027
2 changed files with 86 additions and 9 deletions
@@ -12,25 +12,48 @@ func TestOpsCaptureWriter_NilInnerWriter_NoPanic(t *testing.T) {
assert.NotPanics(t, func() {
assert.Equal(t, 0, w.Status())
}, "Status() on released writer must not panic")
})
assert.NotPanics(t, func() {
assert.Equal(t, -1, w.Size())
}, "Size() on released writer must not panic")
})
assert.NotPanics(t, func() {
assert.False(t, w.Written())
}, "Written() on released writer must not panic")
})
assert.NotPanics(t, func() {
n, err := w.Write([]byte("test"))
assert.Equal(t, 0, n)
assert.NoError(t, err)
}, "Write() on released writer must not panic")
})
assert.NotPanics(t, func() {
n, err := w.WriteString("test")
assert.Equal(t, 0, n)
assert.NoError(t, err)
}, "WriteString() on released writer must not panic")
})
assert.NotPanics(t, func() {
h := w.Header()
assert.NotNil(t, h)
})
assert.NotPanics(t, func() {
w.WriteHeader(200)
})
assert.NotPanics(t, func() {
w.WriteHeaderNow()
})
assert.NotPanics(t, func() {
w.Flush()
})
assert.NotPanics(t, func() {
conn, rw, err := w.Hijack()
assert.Nil(t, conn)
assert.Nil(t, rw)
assert.Error(t, err)
})
assert.NotPanics(t, func() {
ch := w.CloseNotify()
assert.NotNil(t, ch)
})
assert.NotPanics(t, func() {
p := w.Pusher()
assert.Nil(t, p)
})
}
@@ -1,11 +1,14 @@
package handler
import (
"bufio"
"bytes"
"context"
"encoding/json"
"errors"
"log"
"net"
"net/http"
"runtime"
"runtime/debug"
"strconv"
@@ -519,6 +522,57 @@ func (w *opsCaptureWriter) Written() bool {
return w.ResponseWriter.Written()
}
func (w *opsCaptureWriter) Header() http.Header {
if w.ResponseWriter == nil {
return http.Header{}
}
return w.ResponseWriter.Header()
}
func (w *opsCaptureWriter) WriteHeader(code int) {
if w.ResponseWriter == nil {
return
}
w.ResponseWriter.WriteHeader(code)
}
func (w *opsCaptureWriter) WriteHeaderNow() {
if w.ResponseWriter == nil {
return
}
w.ResponseWriter.WriteHeaderNow()
}
func (w *opsCaptureWriter) Flush() {
if w.ResponseWriter == nil {
return
}
w.ResponseWriter.Flush()
}
func (w *opsCaptureWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) {
if w.ResponseWriter == nil {
return nil, nil, errors.New("response writer released")
}
return w.ResponseWriter.Hijack()
}
func (w *opsCaptureWriter) CloseNotify() <-chan bool {
if w.ResponseWriter == nil {
ch := make(chan bool)
close(ch)
return ch
}
return w.ResponseWriter.CloseNotify()
}
func (w *opsCaptureWriter) Pusher() http.Pusher {
if w.ResponseWriter == nil {
return nil
}
return w.ResponseWriter.Pusher()
}
func (w *opsCaptureWriter) Write(b []byte) (int, error) {
if w.ResponseWriter == nil {
return 0, nil