github.com/imgk/caddy-trojan@v0.0.0-20221206043256-2631719e16c8/utils/conn.go (about)

     1  package utils
     2  
     3  import (
     4  	"bytes"
     5  	"errors"
     6  	"io"
     7  	"net"
     8  )
     9  
    10  // rawConn is ...
    11  type rawConn struct {
    12  	net.Conn
    13  	Reader bytes.Reader
    14  }
    15  
    16  // NewRawConn is ...
    17  func NewRawConn(conn net.Conn, buf []byte) net.Conn {
    18  	c := &rawConn{
    19  		Conn: conn,
    20  	}
    21  	c.Reader.Reset(buf)
    22  	return c
    23  }
    24  
    25  // Read is ...
    26  func (c *rawConn) Read(b []byte) (int, error) {
    27  	if c.Reader.Size() == 0 {
    28  		return c.Conn.Read(b)
    29  	}
    30  	n, err := c.Reader.Read(b)
    31  	if errors.Is(err, io.EOF) {
    32  		c.Reader.Reset([]byte{})
    33  		return n, nil
    34  	}
    35  	return n, err
    36  }
    37  
    38  // CloseWrite is ...
    39  func (c *rawConn) CloseWrite() error {
    40  	if cc, ok := c.Conn.(*net.TCPConn); ok {
    41  		return cc.CloseWrite()
    42  	}
    43  	if cw, ok := c.Conn.(interface {
    44  		CloseWrite() error
    45  	}); ok {
    46  		return cw.CloseWrite()
    47  	}
    48  	return errors.New("not supported")
    49  }