|  | @@ -68,12 +68,15 @@ func (r *Socks5AuthenticationResponse) ToBytes() []byte {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  func WriteAuthentication(writer io.Writer, response Socks5AuthenticationResponse) error {
 | 
	
		
			
				|  |  |  	_, err := writer.Write(response.ToBytes())
 | 
	
		
			
				|  |  | -	if err != nil {
 | 
	
		
			
				|  |  | -		return err
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	return nil
 | 
	
		
			
				|  |  | +	return err
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +const (
 | 
	
		
			
				|  |  | +	AddrTypeIPv4   = byte(0x01)
 | 
	
		
			
				|  |  | +	AddrTypeIPv6   = byte(0x04)
 | 
	
		
			
				|  |  | +	AddrTypeDomain = byte(0x03)
 | 
	
		
			
				|  |  | +)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  type Socks5Request struct {
 | 
	
		
			
				|  |  |  	version  byte
 | 
	
		
			
				|  |  |  	command  byte
 | 
	
	
		
			
				|  | @@ -149,3 +152,51 @@ func ReadRequest(reader io.Reader) (request *Socks5Request, err error) {
 | 
	
		
			
				|  |  |  	request.port = binary.BigEndian.Uint16(buffer)
 | 
	
		
			
				|  |  |  	return
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +const (
 | 
	
		
			
				|  |  | +	ErrorSuccess                 = byte(0x00)
 | 
	
		
			
				|  |  | +	ErrorGeneralFailure          = byte(0x01)
 | 
	
		
			
				|  |  | +	ErrorConnectionNotAllowed    = byte(0x02)
 | 
	
		
			
				|  |  | +	ErrorNetworkUnreachable      = byte(0x03)
 | 
	
		
			
				|  |  | +	ErrorHostUnUnreachable       = byte(0x04)
 | 
	
		
			
				|  |  | +	ErrorConnectionRefused       = byte(0x05)
 | 
	
		
			
				|  |  | +	ErrorTTLExpired              = byte(0x06)
 | 
	
		
			
				|  |  | +	ErrorCommandNotSupported     = byte(0x07)
 | 
	
		
			
				|  |  | +	ErrorAddressTypeNotSupported = byte(0x08)
 | 
	
		
			
				|  |  | +)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +type Socks5Response struct {
 | 
	
		
			
				|  |  | +	Version  byte
 | 
	
		
			
				|  |  | +	Error    byte
 | 
	
		
			
				|  |  | +	AddrType byte
 | 
	
		
			
				|  |  | +	IPv4     [4]byte
 | 
	
		
			
				|  |  | +	Domain   string
 | 
	
		
			
				|  |  | +	IPv6     [16]byte
 | 
	
		
			
				|  |  | +	Port     uint16
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func (r Socks5Response) toBytes() []byte {
 | 
	
		
			
				|  |  | +	buffer := make([]byte, 0, 300)
 | 
	
		
			
				|  |  | +	buffer = append(buffer, r.Version)
 | 
	
		
			
				|  |  | +	buffer = append(buffer, r.Error)
 | 
	
		
			
				|  |  | +	buffer = append(buffer, 0x00) // reserved
 | 
	
		
			
				|  |  | +	buffer = append(buffer, r.AddrType)
 | 
	
		
			
				|  |  | +	switch r.AddrType {
 | 
	
		
			
				|  |  | +	case 0x01:
 | 
	
		
			
				|  |  | +		buffer = append(buffer, r.IPv4[:]...)
 | 
	
		
			
				|  |  | +	case 0x03:
 | 
	
		
			
				|  |  | +		buffer = append(buffer, byte(len(r.Domain)))
 | 
	
		
			
				|  |  | +		buffer = append(buffer, []byte(r.Domain)...)
 | 
	
		
			
				|  |  | +	case 0x04:
 | 
	
		
			
				|  |  | +		buffer = append(buffer, r.IPv6[:]...)
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	portBuffer := make([]byte, 2)
 | 
	
		
			
				|  |  | +	binary.BigEndian.PutUint16(portBuffer, r.Port)
 | 
	
		
			
				|  |  | +	buffer = append(buffer, portBuffer...)
 | 
	
		
			
				|  |  | +	return buffer
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func WriteResponse(writer io.Writer, response Socks5Response) error {
 | 
	
		
			
				|  |  | +	_, err := writer.Write(response.toBytes())
 | 
	
		
			
				|  |  | +	return err
 | 
	
		
			
				|  |  | +}
 |