| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 | 
							- package ray
 
- import (
 
- 	"io"
 
- 	"net"
 
- 	"time"
 
- 	"v2ray.com/core/common/buf"
 
- 	"v2ray.com/core/common/signal"
 
- )
 
- type ConnectionOption func(*connection)
 
- func ConnLocalAddr(addr net.Addr) ConnectionOption {
 
- 	return func(c *connection) {
 
- 		c.localAddr = addr
 
- 	}
 
- }
 
- func ConnRemoteAddr(addr net.Addr) ConnectionOption {
 
- 	return func(c *connection) {
 
- 		c.remoteAddr = addr
 
- 	}
 
- }
 
- func ConnCloseSignal(s *signal.Notifier) ConnectionOption {
 
- 	return func(c *connection) {
 
- 		c.closeSignal = s
 
- 	}
 
- }
 
- type connection struct {
 
- 	input       InputStream
 
- 	output      OutputStream
 
- 	closed      bool
 
- 	localAddr   net.Addr
 
- 	remoteAddr  net.Addr
 
- 	closeSignal *signal.Notifier
 
- 	reader *buf.BufferedReader
 
- }
 
- var zeroAddr net.Addr = &net.TCPAddr{IP: []byte{0, 0, 0, 0}}
 
- // NewConnection wraps a Ray into net.Conn.
 
- func NewConnection(input InputStream, output OutputStream, options ...ConnectionOption) net.Conn {
 
- 	c := &connection{
 
- 		input:      input,
 
- 		output:     output,
 
- 		localAddr:  zeroAddr,
 
- 		remoteAddr: zeroAddr,
 
- 		reader:     buf.NewBufferedReader(input),
 
- 	}
 
- 	for _, opt := range options {
 
- 		opt(c)
 
- 	}
 
- 	return c
 
- }
 
- // Read implements net.Conn.Read().
 
- func (c *connection) Read(b []byte) (int, error) {
 
- 	if c.closed {
 
- 		return 0, io.EOF
 
- 	}
 
- 	return c.reader.Read(b)
 
- }
 
- // ReadMultiBuffer implements buf.Reader.
 
- func (c *connection) ReadMultiBuffer() (buf.MultiBuffer, error) {
 
- 	return c.reader.ReadMultiBuffer()
 
- }
 
- // Write implements net.Conn.Write().
 
- func (c *connection) Write(b []byte) (int, error) {
 
- 	if c.closed {
 
- 		return 0, io.ErrClosedPipe
 
- 	}
 
- 	l := len(b)
 
- 	mb := buf.NewMultiBufferCap(int32(l)/buf.Size + 1)
 
- 	mb.Write(b)
 
- 	return l, c.output.WriteMultiBuffer(mb)
 
- }
 
- func (c *connection) WriteMultiBuffer(mb buf.MultiBuffer) error {
 
- 	if c.closed {
 
- 		return io.ErrClosedPipe
 
- 	}
 
- 	return c.output.WriteMultiBuffer(mb)
 
- }
 
- // Close implements net.Conn.Close().
 
- func (c *connection) Close() error {
 
- 	c.closed = true
 
- 	c.output.Close()
 
- 	c.input.CloseError()
 
- 	if c.closeSignal != nil {
 
- 		c.closeSignal.Signal()
 
- 	}
 
- 	return nil
 
- }
 
- // LocalAddr implements net.Conn.LocalAddr().
 
- func (c *connection) LocalAddr() net.Addr {
 
- 	return c.localAddr
 
- }
 
- // RemoteAddr implements net.Conn.RemoteAddr().
 
- func (c *connection) RemoteAddr() net.Addr {
 
- 	return c.remoteAddr
 
- }
 
- // SetDeadline implements net.Conn.SetDeadline().
 
- func (c *connection) SetDeadline(t time.Time) error {
 
- 	return nil
 
- }
 
- // SetReadDeadline implements net.Conn.SetReadDeadline().
 
- func (c *connection) SetReadDeadline(t time.Time) error {
 
- 	return nil
 
- }
 
- // SetWriteDeadline implements net.Conn.SetWriteDeadline().
 
- func (c *connection) SetWriteDeadline(t time.Time) error {
 
- 	return nil
 
- }
 
 
  |