open (Net::SSH::Proxy::SOCKS5)

         # File lib/net/ssh/proxy/socks5.rb, line 65
     65:         def open(host, port)
     66:           socket = TCPSocket.new(proxy_host, proxy_port)
     67:
     68:           methods = [METHOD_NO_AUTH]
     69:           methods << METHOD_PASSWD if options[:user]
     70:
     71:           packet = [VERSION, methods.size, *methods].pack("C*")
     72:           socket.send packet, 0
     73:
     74:           version, method = socket.recv(2).unpack("CC")
     75:           if version != VERSION
     76:             socket.close
     77:             raise Net::SSH::Proxy::Error, "invalid SOCKS version (#{version})"
     78:           end
     79:
     80:           if method == METHOD_NONE
     81:             socket.close
     82:             raise Net::SSH::Proxy::Error, "no supported authorization methods"
     83:           end
     84:
     85:           negotiate_password(socket) if method == METHOD_PASSWD
     86:
     87:           packet = [VERSION, CMD_CONNECT, 0].pack("C*")
     88:
     89:           if host =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/
     90:             packet << [ATYP_IPV4, $1.to_i, $2.to_i, $3.to_i, $4.to_i].pack("C*")
     91:           else
     92:             packet << [ATYP_DOMAIN, host.length, host].pack("CCA*")
     93:           end
     94:
     95:           packet << [port].pack("n")
     96:           socket.send packet, 0
     97:
     98:           version, reply, = socket.recv(2).unpack("C*")
     99:           socket.recv(1)
    100:           address_type = socket.recv(1).getbyte(0)
    101:           case address_type
    102:           when 1
    103:             socket.recv(4)  # get four bytes for IPv4 address
    104:           when 3
    105:             len = socket.recv(1).getbyte(0)
    106:             hostname = socket.recv(len)
    107:           when 4
    108:             ipv6addr hostname = socket.recv(16)
    109:           else
    110:             socket.close
    111:             raise ConnectionError, "Illegal response type"
    112:           end
    113:           portnum = socket.recv(2)
    114:
    115:           unless reply == SUCCESS
    116:             socket.close
    117:             raise ConnectError, "#{reply}"
    118:           end
    119:
    120:           return socket
    121:         end