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 }