mirror of
https://github.com/SagerNet/sing-box.git
synced 2025-06-08 11:44:13 +08:00
Fix ws closed error message
This commit is contained in:
parent
e7b3a8eebe
commit
83cf5f5c6a
@ -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)
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user