fix: defer WebSocket logs until handshake delivery

This commit is contained in:
MiMoCode
2026-07-10 18:48:56 +08:00
parent 92daa9b566
commit 6fe0a8415d
3 changed files with 83 additions and 1 deletions
+24
View File
@@ -97,6 +97,7 @@ func (c *captureWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) {
c.hijacked = true
if c.onHijack != nil {
conn = c.onHijack(conn)
rw = bufio.NewReadWriter(rw.Reader, bufio.NewWriter(conn))
}
return conn, rw, nil
}
@@ -131,3 +132,26 @@ func (c *trackedConn) Close() error {
c.closeOnce.Do(c.onClose)
return err
}
type headerDeliveryConn struct {
net.Conn
tail []byte
onDelivered func()
delivered bool
}
func (c *headerDeliveryConn) Write(p []byte) (int, error) {
n, err := c.Conn.Write(p)
if c.delivered || err != nil || n == 0 {
return n, err
}
c.tail = append(c.tail, p[:n]...)
if bytes.Contains(c.tail, []byte("\r\n\r\n")) {
c.delivered = true
c.tail = nil
c.onDelivered()
} else if len(c.tail) > 3 {
c.tail = append(c.tail[:0], c.tail[len(c.tail)-3:]...)
}
return n, err
}