Files
sing-box-extended-mirror/common/badtls/read_wait.go
T

83 lines
1.7 KiB
Go
Raw Normal View History

//go:build go1.25 && badlinkname
2023-12-20 20:00:00 +08:00
package badtls
import (
"github.com/sagernet/sing/common/buf"
N "github.com/sagernet/sing/common/network"
"github.com/sagernet/sing/common/tls"
)
var _ N.ReadWaiter = (*ReadWaitConn)(nil)
type ReadWaitConn struct {
tls.Conn
2025-09-07 21:03:32 +08:00
rawConn *RawConn
readWaitOptions N.ReadWaitOptions
2023-12-20 20:00:00 +08:00
}
func NewReadWaitConn(conn tls.Conn) (tls.Conn, error) {
2025-09-07 21:03:32 +08:00
if _, isReadWaitConn := conn.(N.ReadWaiter); isReadWaitConn {
return conn, nil
2023-12-20 20:00:00 +08:00
}
2025-09-07 21:03:32 +08:00
rawConn, err := NewRawConn(conn)
if err != nil {
return nil, err
2023-12-20 20:00:00 +08:00
}
return &ReadWaitConn{
2025-09-07 21:03:32 +08:00
Conn: conn,
rawConn: rawConn,
2023-12-20 20:00:00 +08:00
}, nil
}
func (c *ReadWaitConn) InitializeReadWaiter(options N.ReadWaitOptions) (needCopy bool) {
c.readWaitOptions = options
return false
}
func (c *ReadWaitConn) WaitReadBuffer() (buffer *buf.Buffer, err error) {
2025-09-07 21:03:32 +08:00
//err = c.HandshakeContext(context.Background())
//if err != nil {
// return
//}
c.rawConn.In.Lock()
defer c.rawConn.In.Unlock()
for c.rawConn.Input.Len() == 0 {
err = c.rawConn.ReadRecord()
2023-12-20 20:00:00 +08:00
if err != nil {
return
}
2025-09-07 21:03:32 +08:00
for c.rawConn.Hand.Len() > 0 {
err = c.rawConn.HandlePostHandshakeMessage()
2023-12-20 20:00:00 +08:00
if err != nil {
return
}
}
}
buffer = c.readWaitOptions.NewBuffer()
2025-09-07 21:03:32 +08:00
n, err := c.rawConn.Input.Read(buffer.FreeBytes())
2023-12-20 20:00:00 +08:00
if err != nil {
buffer.Release()
return
}
buffer.Truncate(n)
2025-09-07 21:03:32 +08:00
if n != 0 && c.rawConn.Input.Len() == 0 && c.rawConn.Input.Len() > 0 &&
// recordType(c.RawInput.Bytes()[0]) == recordTypeAlert {
c.rawConn.RawInput.Bytes()[0] == 21 {
_ = c.rawConn.ReadRecord()
2023-12-20 20:00:00 +08:00
// return n, err // will be io.EOF on closeNotify
}
c.readWaitOptions.PostReturn(buffer)
return
}
func (c *ReadWaitConn) Upstream() any {
return c.Conn
}
2025-08-20 08:44:29 +08:00
func (c *ReadWaitConn) ReaderReplaceable() bool {
return true
}