refactor: cache ResponseController in H2ReadWriteCloser for better performance

This commit is contained in:
wjqserver 2026-04-02 19:44:02 +08:00
parent 7abedc1ace
commit 20dc6e4047
2 changed files with 7 additions and 5 deletions

View file

@ -96,20 +96,21 @@ type reverseProxyExtendedConnectBridge struct {
type reverseProxyH2ReadWriteCloser struct { type reverseProxyH2ReadWriteCloser struct {
io.ReadCloser io.ReadCloser
ResponseWriter ResponseWriter
controller *http.ResponseController
} }
func (rwc reverseProxyH2ReadWriteCloser) Write(p []byte) (int, error) { func (rwc *reverseProxyH2ReadWriteCloser) Write(p []byte) (int, error) {
n, err := rwc.ResponseWriter.Write(p) n, err := rwc.ResponseWriter.Write(p)
if err != nil { if err != nil {
return n, err return n, err
} }
if err := http.NewResponseController(reverseProxyBaseResponseWriter(rwc.ResponseWriter)).Flush(); err != nil && !errors.Is(err, http.ErrNotSupported) { if err := rwc.controller.Flush(); err != nil && !errors.Is(err, http.ErrNotSupported) {
return n, err return n, err
} }
return n, nil return n, nil
} }
func (rwc reverseProxyH2ReadWriteCloser) Close() error { func (rwc *reverseProxyH2ReadWriteCloser) Close() error {
if rwc.ReadCloser == nil { if rwc.ReadCloser == nil {
return nil return nil
} }
@ -1012,7 +1013,7 @@ func (p *reverseProxyHandler) handleBridgedExtendedConnectResponse(c *Context, r
return &reverseProxyStatusError{status: http.StatusBadGateway, err: err} return &reverseProxyStatusError{status: http.StatusBadGateway, err: err}
} }
conn := reverseProxyH2ReadWriteCloser{ReadCloser: bridge.body, ResponseWriter: c.Writer} conn := &reverseProxyH2ReadWriteCloser{ReadCloser: bridge.body, ResponseWriter: c.Writer, controller: controller}
backConnClosed := make(chan struct{}) backConnClosed := make(chan struct{})
go func() { go func() {

View file

@ -836,9 +836,10 @@ func TestReverseProxyH2ReadWriteCloserWriteReturnsWrittenCountOnFlushError(t *te
flushErr := errors.New("flush failed") flushErr := errors.New("flush failed")
writer := &flushErrorResponseWriter{flushErr: flushErr} writer := &flushErrorResponseWriter{flushErr: flushErr}
conn := reverseProxyH2ReadWriteCloser{ conn := &reverseProxyH2ReadWriteCloser{
ReadCloser: io.NopCloser(strings.NewReader("")), ReadCloser: io.NopCloser(strings.NewReader("")),
ResponseWriter: writer, ResponseWriter: writer,
controller: http.NewResponseController(reverseProxyBaseResponseWriter(writer)),
} }
n, err := conn.Write([]byte("ping")) n, err := conn.Write([]byte("ping"))