|  | @@ -3,8 +3,10 @@ package protocol
 | 
	
		
			
				|  |  |  import (
 | 
	
		
			
				|  |  |  	"io"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +	"v2ray.com/core/common"
 | 
	
		
			
				|  |  |  	"v2ray.com/core/common/buf"
 | 
	
		
			
				|  |  |  	"v2ray.com/core/common/net"
 | 
	
		
			
				|  |  | +	"v2ray.com/core/common/signal"
 | 
	
		
			
				|  |  |  )
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  type AddressOption func(*AddressParser)
 | 
	
	
		
			
				|  | @@ -30,6 +32,7 @@ func WithAddressTypeParser(atp AddressTypeParser) AddressOption {
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +// AddressParser is a utility for reading and writer addresses.
 | 
	
		
			
				|  |  |  type AddressParser struct {
 | 
	
		
			
				|  |  |  	addrTypeMap map[byte]net.AddressFamily
 | 
	
		
			
				|  |  |  	addrByteMap map[net.AddressFamily]byte
 | 
	
	
		
			
				|  | @@ -37,6 +40,7 @@ type AddressParser struct {
 | 
	
		
			
				|  |  |  	typeParser  AddressTypeParser
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +// NewAddressParser creates a new AddressParser
 | 
	
		
			
				|  |  |  func NewAddressParser(options ...AddressOption) *AddressParser {
 | 
	
		
			
				|  |  |  	p := &AddressParser{
 | 
	
		
			
				|  |  |  		addrTypeMap: make(map[byte]net.AddressFamily, 8),
 | 
	
	
		
			
				|  | @@ -118,30 +122,42 @@ func (p *AddressParser) readAddress(b *buf.Buffer, reader io.Reader) (net.Addres
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +// ReadAddressPort reads address and port from the given input.
 | 
	
		
			
				|  |  |  func (p *AddressParser) ReadAddressPort(buffer *buf.Buffer, input io.Reader) (net.Address, net.Port, error) {
 | 
	
		
			
				|  |  |  	if buffer == nil {
 | 
	
		
			
				|  |  |  		buffer = buf.New()
 | 
	
		
			
				|  |  |  		defer buffer.Release()
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	if p.portFirst {
 | 
	
		
			
				|  |  | -		port, err := p.readPort(buffer, input)
 | 
	
		
			
				|  |  | +	var addr net.Address
 | 
	
		
			
				|  |  | +	var port net.Port
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	pTask := func() error {
 | 
	
		
			
				|  |  | +		lp, err := p.readPort(buffer, input)
 | 
	
		
			
				|  |  |  		if err != nil {
 | 
	
		
			
				|  |  | -			return nil, 0, err
 | 
	
		
			
				|  |  | +			return err
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  | -		addr, err := p.readAddress(buffer, input)
 | 
	
		
			
				|  |  | +		port = lp
 | 
	
		
			
				|  |  | +		return nil
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	aTask := func() error {
 | 
	
		
			
				|  |  | +		a, err := p.readAddress(buffer, input)
 | 
	
		
			
				|  |  |  		if err != nil {
 | 
	
		
			
				|  |  | -			return nil, 0, err
 | 
	
		
			
				|  |  | +			return err
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  | -		return addr, port, nil
 | 
	
		
			
				|  |  | +		addr = a
 | 
	
		
			
				|  |  | +		return nil
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	addr, err := p.readAddress(buffer, input)
 | 
	
		
			
				|  |  | -	if err != nil {
 | 
	
		
			
				|  |  | -		return nil, 0, err
 | 
	
		
			
				|  |  | +	var err error
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	if p.portFirst {
 | 
	
		
			
				|  |  | +		err = signal.Execute(pTask, aTask)
 | 
	
		
			
				|  |  | +	} else {
 | 
	
		
			
				|  |  | +		err = signal.Execute(aTask, pTask)
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	port, err := p.readPort(buffer, input)
 | 
	
		
			
				|  |  |  	if err != nil {
 | 
	
		
			
				|  |  |  		return nil, 0, err
 | 
	
		
			
				|  |  |  	}
 | 
	
	
		
			
				|  | @@ -150,8 +166,7 @@ func (p *AddressParser) ReadAddressPort(buffer *buf.Buffer, input io.Reader) (ne
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  func (p *AddressParser) writePort(writer io.Writer, port net.Port) error {
 | 
	
		
			
				|  |  | -	_, err := writer.Write(port.Bytes(nil))
 | 
	
		
			
				|  |  | -	return err
 | 
	
		
			
				|  |  | +	return common.Error2(writer.Write(port.Bytes(nil)))
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  func (p *AddressParser) writeAddress(writer io.Writer, address net.Address) error {
 | 
	
	
		
			
				|  | @@ -162,43 +177,38 @@ func (p *AddressParser) writeAddress(writer io.Writer, address net.Address) erro
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	switch address.Family() {
 | 
	
		
			
				|  |  |  	case net.AddressFamilyIPv4, net.AddressFamilyIPv6:
 | 
	
		
			
				|  |  | -		if _, err := writer.Write([]byte{tb}); err != nil {
 | 
	
		
			
				|  |  | -			return err
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -		if _, err := writer.Write(address.IP()); err != nil {
 | 
	
		
			
				|  |  | -			return err
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | +		return signal.Execute(func() error {
 | 
	
		
			
				|  |  | +			return common.Error2(writer.Write([]byte{tb}))
 | 
	
		
			
				|  |  | +		}, func() error {
 | 
	
		
			
				|  |  | +			return common.Error2(writer.Write(address.IP()))
 | 
	
		
			
				|  |  | +		})
 | 
	
		
			
				|  |  |  	case net.AddressFamilyDomain:
 | 
	
		
			
				|  |  |  		domain := address.Domain()
 | 
	
		
			
				|  |  |  		if isDomainTooLong(domain) {
 | 
	
		
			
				|  |  |  			return newError("Super long domain is not supported: ", domain)
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  | -		if _, err := writer.Write([]byte{tb, byte(len(domain))}); err != nil {
 | 
	
		
			
				|  |  | -			return err
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -		if _, err := writer.Write([]byte(domain)); err != nil {
 | 
	
		
			
				|  |  | -			return err
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | +		return signal.Execute(func() error {
 | 
	
		
			
				|  |  | +			return common.Error2(writer.Write([]byte{tb, byte(len(domain))}))
 | 
	
		
			
				|  |  | +		}, func() error {
 | 
	
		
			
				|  |  | +			return common.Error2(writer.Write([]byte(domain)))
 | 
	
		
			
				|  |  | +		})
 | 
	
		
			
				|  |  | +	default:
 | 
	
		
			
				|  |  | +		panic("Unknown family type.")
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | -	return nil
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +// WriteAddressPort writes address and port into the given writer.
 | 
	
		
			
				|  |  |  func (p *AddressParser) WriteAddressPort(writer io.Writer, addr net.Address, port net.Port) error {
 | 
	
		
			
				|  |  | -	if p.portFirst {
 | 
	
		
			
				|  |  | -		if err := p.writePort(writer, port); err != nil {
 | 
	
		
			
				|  |  | -			return err
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -		if err := p.writeAddress(writer, addr); err != nil {
 | 
	
		
			
				|  |  | -			return err
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -		return nil
 | 
	
		
			
				|  |  | +	pTask := func() error {
 | 
	
		
			
				|  |  | +		return p.writePort(writer, port)
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	if err := p.writeAddress(writer, addr); err != nil {
 | 
	
		
			
				|  |  | -		return err
 | 
	
		
			
				|  |  | +	aTask := func() error {
 | 
	
		
			
				|  |  | +		return p.writeAddress(writer, addr)
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | -	if err := p.writePort(writer, port); err != nil {
 | 
	
		
			
				|  |  | -		return err
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	if p.portFirst {
 | 
	
		
			
				|  |  | +		return signal.Execute(pTask, aTask)
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | -	return nil
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	return signal.Execute(aTask, pTask)
 | 
	
		
			
				|  |  |  }
 |