stdlib_libraries/ftp_transfer.rb
tests/_examples/stdlib_libraries/ftp_transfer.rb in the metorex repository.
require 'socket'
require 'net/ftp'
# A server answering the handful of commands a listing and a download need.
listener = TCPServer.new('127.0.0.1', 0)
serving = Thread.new do
control = listener.accept
control.print("220 ready\r\n")
data = nil
while (line = control.gets)
line = line.chomp
case line
when /\APORT (.*)\z/
parts = Regexp.last_match(1).split(',')
data = TCPSocket.new(parts[0, 4].join('.'), parts[4].to_i * 256 + parts[5].to_i)
control.print("200 port opened\r\n")
when /\ALIST/
control.print("150 opening\r\n")
data.print("one.rb\r\n")
data.print("two.rb\r\n")
data.close
control.print("226 transfer complete\r\n")
when /\ARETR/
control.print("125 sending\r\n")
data.print("first line\r\nsecond line\r\n")
data.close
control.print("226 transfer complete\r\n")
when /\AMDTM/
control.print("213 19980705132316\r\n")
when /\AQUIT/
control.print("221 bye\r\n")
break
else
control.print("200 ok\r\n")
end
end
control.close
end
session = Net::FTP.new
session.passive = false
session.connect('127.0.0.1', listener.addr[1])
p(session.list('files'))
lines = []
session.retrlines('RETR notes.txt') { |line| lines << line }
p(lines)
p(session.mtime('notes.txt'))
p(session.quit)
serving.join
listener.close
Output:
["one.rb", "two.rb"]
["first line", "second line"]
1998-07-05 13:23:16 UTC
nil