def socks_receive_reply
Socksify::debug_debug "Waiting for SOCKS reply"
if @@socks_version == "5"
connect_reply = recv(4)
if connect_reply.empty?
raise SOCKSError.new("Server doesn't reply")
end
Socksify::debug_debug connect_reply.unpack "H*"
if connect_reply[0..0] != "\005"
raise SOCKSError.new("SOCKS version #{connect_reply[0..0]} is not 5")
end
if connect_reply[1..1] != "\000"
raise SOCKSError.for_response_code(connect_reply.bytes.to_a[1])
end
Socksify::debug_debug "Waiting for bind_addr"
bind_addr_len = case connect_reply[3..3]
when "\001"
4
when "\003"
recv(1).bytes.first
when "\004"
16
else
raise SOCKSError.for_response_code(connect_reply.bytes.to_a[3])
end
bind_addr_s = recv(bind_addr_len)
bind_addr = case connect_reply[3..3]
when "\001"
bind_addr_s.bytes.to_a.join('.')
when "\003"
bind_addr_s
when "\004"
i = 0
ip6 = ""
bind_addr_s.each_byte do |b|
if i > 0 and i % 2 == 0
ip6 += ":"
end
i += 1
ip6 += b.to_s(16).rjust(2, '0')
end
end
bind_port = recv(bind_addr_len + 2)
[bind_addr, bind_port.unpack('n')]
else
connect_reply = recv(8)
unless connect_reply[0] == "\000" and connect_reply[1] == "\x5A"
Socksify::debug_debug connect_reply.unpack 'H'
raise SOCKSError.new("Failed while connecting througth socks")
end
end
end