github.com/ipfans/trojan-go@v0.11.0/tunnel/simplesocks/conn.go (about) 1 package simplesocks 2 3 import ( 4 "bytes" 5 6 "github.com/ipfans/trojan-go/common" 7 "github.com/ipfans/trojan-go/tunnel" 8 "github.com/ipfans/trojan-go/tunnel/trojan" 9 ) 10 11 // Conn is a simplesocks connection 12 type Conn struct { 13 tunnel.Conn 14 metadata *tunnel.Metadata 15 isOutbound bool 16 headerWritten bool 17 } 18 19 func (c *Conn) Metadata() *tunnel.Metadata { 20 return c.metadata 21 } 22 23 func (c *Conn) Write(payload []byte) (int, error) { 24 if c.isOutbound && !c.headerWritten { 25 buf := bytes.NewBuffer(make([]byte, 0, 4096)) 26 c.metadata.WriteTo(buf) 27 buf.Write(payload) 28 _, err := c.Conn.Write(buf.Bytes()) 29 if err != nil { 30 return 0, common.NewError("failed to write simplesocks header").Base(err) 31 } 32 c.headerWritten = true 33 return len(payload), nil 34 } 35 return c.Conn.Write(payload) 36 } 37 38 // PacketConn is a simplesocks packet connection 39 // The header syntax is the same as trojan's 40 type PacketConn struct { 41 trojan.PacketConn 42 }