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  }