Fix ws closed error message

This commit is contained in:
世界 2025-05-27 14:29:44 +08:00
parent e7b3a8eebe
commit 83cf5f5c6a
No known key found for this signature in database
GPG Key ID: CD109927C34A63C4

View File

@ -3,6 +3,7 @@ package v2raywebsocket
import ( import (
"context" "context"
"encoding/base64" "encoding/base64"
"errors"
"io" "io"
"net" "net"
"os" "os"
@ -61,7 +62,7 @@ func (c *WebsocketConn) Close() error {
func (c *WebsocketConn) Read(b []byte) (n int, err error) { func (c *WebsocketConn) Read(b []byte) (n int, err error) {
var header ws.Header var header ws.Header
for { for {
n, err = c.reader.Read(b) n, err = wrapWsError0(c.reader.Read(b))
if n > 0 { if n > 0 {
err = nil err = nil
return return
@ -95,7 +96,7 @@ func (c *WebsocketConn) Read(b []byte) (n int, err error) {
} }
func (c *WebsocketConn) Write(p []byte) (n int, err error) { func (c *WebsocketConn) Write(p []byte) (n int, err error) {
err = wsutil.WriteMessage(c.Conn, c.state, ws.OpBinary, p) err = wrapWsError(wsutil.WriteMessage(c.Conn, c.state, ws.OpBinary, p))
if err != nil { if err != nil {
return return
} }
@ -146,7 +147,7 @@ func (c *EarlyWebsocketConn) Read(b []byte) (n int, err error) {
return 0, c.err return 0, c.err
} }
} }
return c.conn.Read(b) return wrapWsError0(c.conn.Read(b))
} }
func (c *EarlyWebsocketConn) writeRequest(content []byte) error { func (c *EarlyWebsocketConn) writeRequest(content []byte) error {
@ -177,12 +178,12 @@ func (c *EarlyWebsocketConn) writeRequest(content []byte) error {
conn, err = c.dialContext(c.ctx, &c.requestURL, c.headers) conn, err = c.dialContext(c.ctx, &c.requestURL, c.headers)
} }
if err != nil { if err != nil {
return err return wrapWsError(err)
} }
if len(lateData) > 0 { if len(lateData) > 0 {
_, err = conn.Write(lateData) _, err = conn.Write(lateData)
if err != nil { if err != nil {
return err return wrapWsError(err)
} }
} }
c.conn = conn c.conn = conn
@ -191,7 +192,7 @@ func (c *EarlyWebsocketConn) writeRequest(content []byte) error {
func (c *EarlyWebsocketConn) Write(b []byte) (n int, err error) { func (c *EarlyWebsocketConn) Write(b []byte) (n int, err error) {
if c.conn != nil { if c.conn != nil {
return c.conn.Write(b) return wrapWsError0(c.conn.Write(b))
} }
c.access.Lock() c.access.Lock()
defer c.access.Unlock() defer c.access.Unlock()
@ -199,9 +200,9 @@ func (c *EarlyWebsocketConn) Write(b []byte) (n int, err error) {
return 0, c.err return 0, c.err
} }
if c.conn != nil { if c.conn != nil {
return c.conn.Write(b) return wrapWsError0(c.conn.Write(b))
} }
err = c.writeRequest(b) err = wrapWsError(c.writeRequest(b))
c.err = err c.err = err
close(c.create) close(c.create)
if err != nil { if err != nil {
@ -212,17 +213,17 @@ func (c *EarlyWebsocketConn) Write(b []byte) (n int, err error) {
func (c *EarlyWebsocketConn) WriteBuffer(buffer *buf.Buffer) error { func (c *EarlyWebsocketConn) WriteBuffer(buffer *buf.Buffer) error {
if c.conn != nil { if c.conn != nil {
return c.conn.WriteBuffer(buffer) return wrapWsError(c.conn.WriteBuffer(buffer))
} }
c.access.Lock() c.access.Lock()
defer c.access.Unlock() defer c.access.Unlock()
if c.conn != nil { if c.conn != nil {
return c.conn.WriteBuffer(buffer) return wrapWsError(c.conn.WriteBuffer(buffer))
} }
if c.err != nil { if c.err != nil {
return c.err return c.err
} }
err := c.writeRequest(buffer.Bytes()) err := wrapWsError(c.writeRequest(buffer.Bytes()))
c.err = err c.err = err
close(c.create) close(c.create)
return err return err
@ -272,3 +273,23 @@ func (c *EarlyWebsocketConn) Upstream() any {
func (c *EarlyWebsocketConn) LazyHeadroom() bool { func (c *EarlyWebsocketConn) LazyHeadroom() bool {
return c.conn == nil return c.conn == nil
} }
func wrapWsError(err error) error {
if err == nil {
return nil
}
var closedErr *wsutil.ClosedError
if errors.As(err, &closedErr) {
if closedErr.Code == ws.StatusNormalClosure {
err = io.EOF
}
}
return err
}
func wrapWsError0[T any](value T, err error) (T, error) {
if err == nil {
return value, nil
}
return common.DefaultValue[T](), wrapWsError(err)
}