mirror of
https://github.com/SagerNet/sing-box.git
synced 2025-06-08 03:34:13 +08:00
Fix v2ray websocket transport
This commit is contained in:
parent
dba0b5276b
commit
098a00b025
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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
|
|
||||||
}
|
|
@ -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 {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user