client.go 899 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. package shadowtls
  2. import (
  3. "github.com/sagernet/sing/common/buf"
  4. "github.com/sagernet/sing/common/bufio"
  5. N "github.com/sagernet/sing/common/network"
  6. )
  7. var _ N.VectorisedWriter = (*ClientConn)(nil)
  8. type ClientConn struct {
  9. *Conn
  10. hashConn *HashReadConn
  11. }
  12. func NewClientConn(hashConn *HashReadConn) *ClientConn {
  13. return &ClientConn{NewConn(hashConn.Conn), hashConn}
  14. }
  15. func (c *ClientConn) Write(p []byte) (n int, err error) {
  16. if c.hashConn != nil {
  17. sum := c.hashConn.Sum()
  18. c.hashConn = nil
  19. _, err = bufio.WriteVectorised(c.Conn, [][]byte{sum, p})
  20. if err == nil {
  21. n = len(p)
  22. }
  23. return
  24. }
  25. return c.Conn.Write(p)
  26. }
  27. func (c *ClientConn) WriteVectorised(buffers []*buf.Buffer) error {
  28. if c.hashConn != nil {
  29. sum := c.hashConn.Sum()
  30. c.hashConn = nil
  31. return c.Conn.WriteVectorised(append([]*buf.Buffer{buf.As(sum)}, buffers...))
  32. }
  33. return c.Conn.WriteVectorised(buffers)
  34. }