Fix v2ray websocket transport

This commit is contained in:
世界 2025-06-04 23:23:36 +08:00
parent dba0b5276b
commit 098a00b025
No known key found for this signature in database
GPG Key ID: CD109927C34A63C4
3 changed files with 12 additions and 33 deletions

View File

@ -62,15 +62,16 @@ 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 = wrapWsError0(c.reader.Read(b)) n, err = c.reader.Read(b)
if n > 0 { if n > 0 {
err = nil err = nil
return return
} }
if !E.IsMulti(err, io.EOF, wsutil.ErrNoFrameAdvance) { if !E.IsMulti(err, io.EOF, wsutil.ErrNoFrameAdvance) {
err = wrapWsError(err)
return return
} }
header, err = c.reader.NextFrame() header, err = wrapWsError0(c.reader.NextFrame())
if err != nil { if err != nil {
return return
} }
@ -79,14 +80,14 @@ func (c *WebsocketConn) Read(b []byte) (n int, err error) {
err = wsutil.ErrFrameTooLarge err = wsutil.ErrFrameTooLarge
return return
} }
err = c.controlHandler(header, c.reader) err = wrapWsError(c.controlHandler(header, c.reader))
if err != nil { if err != nil {
return return
} }
continue continue
} }
if header.OpCode&ws.OpBinary == 0 { if header.OpCode&ws.OpBinary == 0 {
err = c.reader.Discard() err = wrapWsError(c.reader.Discard())
if err != nil { if err != nil {
return return
} }
@ -178,12 +179,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 wrapWsError(err) return err
} }
if len(lateData) > 0 { if len(lateData) > 0 {
_, err = conn.Write(lateData) _, err = conn.Write(lateData)
if err != nil { if err != nil {
return wrapWsError(err) return err
} }
} }
c.conn = conn c.conn = conn
@ -202,7 +203,7 @@ func (c *EarlyWebsocketConn) Write(b []byte) (n int, err error) {
if c.conn != nil { if c.conn != nil {
return wrapWsError0(c.conn.Write(b)) return wrapWsError0(c.conn.Write(b))
} }
err = wrapWsError(c.writeRequest(b)) err = c.writeRequest(b)
c.err = err c.err = err
close(c.create) close(c.create)
if err != nil { if err != nil {
@ -223,7 +224,7 @@ func (c *EarlyWebsocketConn) WriteBuffer(buffer *buf.Buffer) error {
if c.err != nil { if c.err != nil {
return c.err return c.err
} }
err := wrapWsError(c.writeRequest(buffer.Bytes())) err := c.writeRequest(buffer.Bytes())
c.err = err c.err = err
close(c.create) close(c.create)
return err return err
@ -278,7 +279,7 @@ func wrapWsError(err error) error {
if err == nil { if err == nil {
return nil return nil
} }
var closedErr *wsutil.ClosedError var closedErr wsutil.ClosedError
if errors.As(err, &closedErr) { if errors.As(err, &closedErr) {
if closedErr.Code == ws.StatusNormalClosure { if closedErr.Code == ws.StatusNormalClosure {
err = io.EOF err = io.EOF
@ -291,5 +292,5 @@ func wrapWsError0[T any](value T, err error) (T, error) {
if err == nil { if err == nil {
return value, nil return value, nil
} }
return common.DefaultValue[T](), wrapWsError(err) return value, wrapWsError(err)
} }

View File

@ -1,22 +0,0 @@
package v2raywebsocket
import (
"net"
"time"
)
type deadConn struct {
net.Conn
}
func (c *deadConn) SetDeadline(t time.Time) error {
return nil
}
func (c *deadConn) SetReadDeadline(t time.Time) error {
return nil
}
func (c *deadConn) SetWriteDeadline(t time.Time) error {
return nil
}

View File

@ -66,7 +66,7 @@ func (w *Writer) WriteBuffer(buffer *buf.Buffer) error {
ws.Cipher(data, *(*[4]byte)(header[1+payloadBitLength:]), 0) ws.Cipher(data, *(*[4]byte)(header[1+payloadBitLength:]), 0)
} }
return w.writer.WriteBuffer(buffer) return wrapWsError(w.writer.WriteBuffer(buffer))
} }
func (w *Writer) FrontHeadroom() int { func (w *Writer) FrontHeadroom() int {