sing-shadowtls/v2_client.go
2023-02-20 13:51:43 +08:00

37 lines
837 B
Go

package shadowtls
import (
"github.com/sagernet/sing/common/buf"
"github.com/sagernet/sing/common/bufio"
)
type clientConn struct {
*shadowConn
hashConn *hashReadConn
}
func newClientConn(hashConn *hashReadConn) *clientConn {
return &clientConn{newConn(hashConn.Conn), hashConn}
}
func (c *clientConn) Write(p []byte) (n int, err error) {
if c.hashConn != nil {
sum := c.hashConn.Sum()
c.hashConn = nil
_, err = bufio.WriteVectorised(c.shadowConn, [][]byte{sum, p})
if err == nil {
n = len(p)
}
return
}
return c.shadowConn.Write(p)
}
func (c *clientConn) WriteVectorised(buffers []*buf.Buffer) error {
if c.hashConn != nil {
sum := c.hashConn.Sum()
c.hashConn = nil
return c.shadowConn.WriteVectorised(append([]*buf.Buffer{buf.As(sum)}, buffers...))
}
return c.shadowConn.WriteVectorised(buffers)
}