| 
					
				 | 
			
			
				@@ -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 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |