aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorshugo <shugo@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-12-03 15:41:14 +0000
committershugo <shugo@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-12-03 15:41:14 +0000
commit74b059896dd69e6bd727cb6082e9dbde6e00545f (patch)
tree8492a386b2fa8ce892039ac52e81a2d9bd9ecc93 /test
parent96e9bbca342dedc9fd91e5599d92c66d5006bb92 (diff)
downloadruby-74b059896dd69e6bd727cb6082e9dbde6e00545f.tar.gz
Use IPv6 if it's preferred.
I hope this fix makes tests faster on Windows. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56973 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'test')
-rw-r--r--test/net/ftp/test_ftp.rb191
1 files changed, 85 insertions, 106 deletions
diff --git a/test/net/ftp/test_ftp.rb b/test/net/ftp/test_ftp.rb
index 6b736f9eb7..e586e5e231 100644
--- a/test/net/ftp/test_ftp.rb
+++ b/test/net/ftp/test_ftp.rb
@@ -7,7 +7,8 @@ require "stringio"
require "tempfile"
class FTPTest < Test::Unit::TestCase
- SERVER_ADDR = "127.0.0.1"
+ SERVER_NAME = "localhost"
+ SERVER_ADDR = Addrinfo.getaddrinfo(SERVER_NAME, 0)[0].ip_address
CA_FILE = File.expand_path("../fixtures/cacert.pem", __dir__)
SERVER_KEY = File.expand_path("../fixtures/server.key", __dir__)
SERVER_CERT = File.expand_path("../fixtures/server.crt", __dir__)
@@ -405,10 +406,7 @@ class FTPTest < Test::Unit::TestCase
sock.print("200 Switching to ASCII mode.\r\n")
line = sock.gets
commands.push(line)
- port_args = line.slice(/\APORT (.*)/, 1).split(/,/)
- host = port_args[0, 4].join(".")
- port = port_args[4, 2].map(&:to_i).inject {|x, y| (x << 8) + y}
- sock.print("200 PORT command successful.\r\n")
+ host, port = process_port_or_eprt(sock, line)
commands.push(sock.gets)
sock.print("150 Here comes the directory listing.\r\n")
begin
@@ -441,7 +439,7 @@ class FTPTest < Test::Unit::TestCase
ftp.list
end
assert_equal("TYPE A\r\n", commands.shift)
- assert_match(/\APORT /, commands.shift)
+ assert_match(/\A(PORT|EPRT) /, commands.shift)
assert_equal("LIST\r\n", commands.shift)
assert_equal(nil, commands.shift)
ensure
@@ -471,10 +469,7 @@ class FTPTest < Test::Unit::TestCase
sock.print("200 Switching to ASCII mode.\r\n")
line = sock.gets
commands.push(line)
- port_args = line.slice(/\APORT (.*)/, 1).split(/,/)
- host = port_args[0, 4].join(".")
- port = port_args[4, 2].map(&:to_i).inject {|x, y| (x << 8) + y}
- sock.print("200 PORT command successful.\r\n")
+ host, port = process_port_or_eprt(sock, line)
commands.push(sock.gets)
sock.print("150 Here comes the directory listing.\r\n")
conn = TCPSocket.new(host, port)
@@ -498,7 +493,7 @@ class FTPTest < Test::Unit::TestCase
assert_equal("TYPE I\r\n", commands.shift)
assert_equal(list_lines, ftp.list)
assert_equal("TYPE A\r\n", commands.shift)
- assert_match(/\APORT /, commands.shift)
+ assert_match(/\A(PORT|EPRT) /, commands.shift)
assert_equal("LIST\r\n", commands.shift)
assert_equal("TYPE I\r\n", commands.shift)
assert_equal(nil, commands.shift)
@@ -524,7 +519,7 @@ class FTPTest < Test::Unit::TestCase
sock.print("200 Switching to ASCII mode.\r\n")
line = sock.gets
commands.push(line)
- sock.print("200 PORT command successful.\r\n")
+ host, port = process_port_or_eprt(sock, line)
commands.push(sock.gets)
sock.print("553 Requested action not taken.\r\n")
commands.push(sock.gets)
@@ -541,7 +536,7 @@ class FTPTest < Test::Unit::TestCase
assert_equal("TYPE I\r\n", commands.shift)
assert_raise(Net::FTPPermError){ ftp.list }
assert_equal("TYPE A\r\n", commands.shift)
- assert_match(/\APORT /, commands.shift)
+ assert_match(/\A(PORT|EPRT) /, commands.shift)
assert_equal("LIST\r\n", commands.shift)
assert_equal("TYPE I\r\n", commands.shift)
assert_equal(nil, commands.shift)
@@ -582,7 +577,7 @@ class FTPTest < Test::Unit::TestCase
assert_equal("TYPE I\r\n", commands.shift)
assert_raise(Net::FTPTempError){ ftp.list }
assert_equal("TYPE A\r\n", commands.shift)
- assert_match(/\APORT /, commands.shift)
+ assert_match(/\A(PORT|EPRT) /, commands.shift)
assert_equal("TYPE I\r\n", commands.shift)
assert_equal(nil, commands.shift)
ensure
@@ -606,10 +601,7 @@ class FTPTest < Test::Unit::TestCase
sock.print("200 Switching to Binary mode.\r\n")
line = sock.gets
commands.push(line)
- port_args = line.slice(/\APORT (.*)/, 1).split(/,/)
- host = port_args[0, 4].join(".")
- port = port_args[4, 2].map(&:to_i).inject {|x, y| (x << 8) + y}
- sock.print("200 PORT command successful.\r\n")
+ host, port = process_port_or_eprt(sock, line)
commands.push(sock.gets)
sock.print("150 Opening BINARY mode data connection for foo (#{binary_data.size} bytes)\r\n")
conn = TCPSocket.new(host, port)
@@ -637,7 +629,7 @@ class FTPTest < Test::Unit::TestCase
end
assert_equal(1024, buf.bytesize)
assert_equal(binary_data[0, 1024], buf)
- assert_match(/\APORT /, commands.shift)
+ assert_match(/\A(PORT|EPRT) /, commands.shift)
assert_equal("RETR foo\r\n", commands.shift)
assert_equal(nil, commands.shift)
ensure
@@ -661,10 +653,7 @@ class FTPTest < Test::Unit::TestCase
sock.print("200 Switching to Binary mode.\r\n")
line = sock.gets
commands.push(line)
- port_args = line.slice(/\APORT (.*)/, 1).split(/,/)
- host = port_args[0, 4].join(".")
- port = port_args[4, 2].map(&:to_i).inject {|x, y| (x << 8) + y}
- sock.print("200 PORT command successful.\r\n")
+ host, port = process_port_or_eprt(sock, line)
commands.push(sock.gets)
sock.print("150 Opening BINARY mode data connection for foo (#{binary_data.size} bytes)\r\n")
conn = TCPSocket.new(host, port)
@@ -692,7 +681,7 @@ class FTPTest < Test::Unit::TestCase
end
assert_equal(binary_data.bytesize, buf.bytesize)
assert_equal(binary_data, buf)
- assert_match(/\APORT /, commands.shift)
+ assert_match(/\A(PORT|EPRT) /, commands.shift)
assert_equal("RETR foo\r\n", commands.shift)
assert_equal(nil, commands.shift)
ensure
@@ -715,7 +704,7 @@ class FTPTest < Test::Unit::TestCase
sock.print("200 Switching to Binary mode.\r\n")
line = sock.gets
commands.push(line)
- sock.print("200 PORT command successful.\r\n")
+ host, port = process_port_or_eprt(sock, line)
commands.push(sock.gets)
sock.print("550 Requested action not taken.\r\n")
}
@@ -729,7 +718,7 @@ class FTPTest < Test::Unit::TestCase
assert_match(/\APASS /, commands.shift)
assert_equal("TYPE I\r\n", commands.shift)
assert_raise(Net::FTPPermError){ ftp.retrbinary("RETR foo", 1024) }
- assert_match(/\APORT /, commands.shift)
+ assert_match(/\A(PORT|EPRT) /, commands.shift)
assert_equal("RETR foo\r\n", commands.shift)
assert_equal(nil, commands.shift)
ensure
@@ -753,10 +742,7 @@ class FTPTest < Test::Unit::TestCase
sock.print("200 Switching to Binary mode.\r\n")
line = sock.gets
commands.push(line)
- port_args = line.slice(/\APORT (.*)/, 1).split(/,/)
- host = port_args[0, 4].join(".")
- port = port_args[4, 2].map(&:to_i).inject {|x, y| (x << 8) + y}
- sock.print("200 PORT command successful.\r\n")
+ host, port = process_port_or_eprt(sock, line)
commands.push(sock.gets)
sock.print("150 Opening BINARY mode data connection for foo (#{binary_data.size} bytes)\r\n")
conn = TCPSocket.new(host, port)
@@ -780,7 +766,7 @@ class FTPTest < Test::Unit::TestCase
buf = ftp.getbinaryfile("foo", nil)
assert_equal(binary_data, buf)
assert_equal(Encoding::ASCII_8BIT, buf.encoding)
- assert_match(/\APORT /, commands.shift)
+ assert_match(/\A(PORT|EPRT) /, commands.shift)
assert_equal("RETR foo\r\n", commands.shift)
assert_equal(nil, commands.shift)
ensure
@@ -804,10 +790,7 @@ class FTPTest < Test::Unit::TestCase
sock.print("200 Switching to Binary mode.\r\n")
line = sock.gets
commands.push(line)
- port_args = line.slice(/\APORT (.*)/, 1).split(/,/)
- host = port_args[0, 4].join(".")
- port = port_args[4, 2].map(&:to_i).inject {|x, y| (x << 8) + y}
- sock.print("200 PORT command successful.\r\n")
+ host, port = process_port_or_eprt(sock, line)
commands.push(sock.gets)
sock.print("150 Opening BINARY mode data connection for foo (#{binary_data.size} bytes)\r\n")
conn = TCPSocket.new(host, port)
@@ -828,7 +811,7 @@ class FTPTest < Test::Unit::TestCase
buf = ftp.getbinaryfile("foo", nil)
assert_equal(binary_data, buf)
assert_equal(Encoding::ASCII_8BIT, buf.encoding)
- assert_match(/\APORT /, commands.shift)
+ assert_match(/\A(PORT|EPRT) /, commands.shift)
assert_equal("RETR foo\r\n", commands.shift)
assert_equal(nil, commands.shift)
ensure
@@ -852,10 +835,7 @@ class FTPTest < Test::Unit::TestCase
sock.print("200 Switching to Binary mode.\r\n")
line = sock.gets
commands.push(line)
- port_args = line.slice(/\APORT (.*)/, 1).split(/,/)
- host = port_args[0, 4].join(".")
- port = port_args[4, 2].map(&:to_i).inject {|x, y| (x << 8) + y}
- sock.print("200 PORT command successful.\r\n")
+ host, port = process_port_or_eprt(sock, line)
commands.push(sock.gets)
sock.print("150 Opening BINARY mode data connection for foo (#{binary_data.size} bytes)\r\n")
conn = TCPSocket.new(host, port)
@@ -887,7 +867,7 @@ class FTPTest < Test::Unit::TestCase
assert_equal(Encoding::ASCII_8BIT, buf.encoding)
assert_equal(binary_data, f.read)
end
- assert_match(/\APORT /, commands.shift)
+ assert_match(/\A(PORT|EPRT) /, commands.shift)
assert_equal("RETR foo\r\n", commands.shift)
assert_equal(nil, commands.shift)
ensure
@@ -912,10 +892,7 @@ class FTPTest < Test::Unit::TestCase
sock.print("200 Switching to Binary mode.\r\n")
line = sock.gets
commands.push(line)
- port_args = line.slice(/\APORT (.*)/, 1).split(/,/)
- host = port_args[0, 4].join(".")
- port = port_args[4, 2].map(&:to_i).inject {|x, y| (x << 8) + y}
- sock.print("200 PORT command successful.\r\n")
+ host, port = process_port_or_eprt(sock, line)
commands.push(sock.gets)
sock.print("150 Opening BINARY mode data connection for foo\r\n")
conn = TCPSocket.new(host, port)
@@ -934,7 +911,7 @@ class FTPTest < Test::Unit::TestCase
assert_equal("TYPE I\r\n", commands.shift)
ftp.storbinary("STOR foo", StringIO.new(binary_data), 1024)
assert_equal(binary_data, stored_data)
- assert_match(/\APORT /, commands.shift)
+ assert_match(/\A(PORT|EPRT) /, commands.shift)
assert_equal("STOR foo\r\n", commands.shift)
assert_equal(nil, commands.shift)
ensure
@@ -958,7 +935,7 @@ class FTPTest < Test::Unit::TestCase
sock.print("200 Switching to Binary mode.\r\n")
line = sock.gets
commands.push(line)
- sock.print("200 PORT command successful.\r\n")
+ host, port = process_port_or_eprt(sock, line)
commands.push(sock.gets)
sock.print("452 Requested file action aborted.\r\n")
}
@@ -972,7 +949,7 @@ class FTPTest < Test::Unit::TestCase
assert_match(/\APASS /, commands.shift)
assert_equal("TYPE I\r\n", commands.shift)
assert_raise(Net::FTPTempError){ ftp.storbinary("STOR foo", StringIO.new(binary_data), 1024) }
- assert_match(/\APORT /, commands.shift)
+ assert_match(/\A(PORT|EPRT) /, commands.shift)
assert_equal("STOR foo\r\n", commands.shift)
assert_equal(nil, commands.shift)
ensure
@@ -1002,10 +979,7 @@ EOF
sock.print("200 Switching to ASCII mode.\r\n")
line = sock.gets
commands.push(line)
- port_args = line.slice(/\APORT (.*)/, 1).split(/,/)
- host = port_args[0, 4].join(".")
- port = port_args[4, 2].map(&:to_i).inject {|x, y| (x << 8) + y}
- sock.print("200 PORT command successful.\r\n")
+ host, port = process_port_or_eprt(sock, line)
commands.push(sock.gets)
sock.print("150 Opening TEXT mode data connection for foo (#{text_data.size} bytes)\r\n")
conn = TCPSocket.new(host, port)
@@ -1034,7 +1008,7 @@ EOF
assert_equal(text_data.bytesize, buf.bytesize)
assert_equal(text_data, buf)
assert_equal("TYPE A\r\n", commands.shift)
- assert_match(/\APORT /, commands.shift)
+ assert_match(/\A(PORT|EPRT) /, commands.shift)
assert_equal("RETR foo\r\n", commands.shift)
assert_equal("TYPE I\r\n", commands.shift)
assert_equal(nil, commands.shift)
@@ -1065,10 +1039,7 @@ EOF
sock.print("200 Switching to ASCII mode.\r\n")
line = sock.gets
commands.push(line)
- port_args = line.slice(/\APORT (.*)/, 1).split(/,/)
- host = port_args[0, 4].join(".")
- port = port_args[4, 2].map(&:to_i).inject {|x, y| (x << 8) + y}
- sock.print("200 PORT command successful.\r\n")
+ host, port = process_port_or_eprt(sock, line)
commands.push(sock.gets)
sock.print("150 Opening TEXT mode data connection for foo (#{text_data.size} bytes)\r\n")
conn = TCPSocket.new(host, port)
@@ -1094,7 +1065,7 @@ EOF
assert_equal(text_data.gsub(/\r\n/, "\n"), buf)
assert_equal(Encoding::ASCII_8BIT, buf.encoding)
assert_equal("TYPE A\r\n", commands.shift)
- assert_match(/\APORT /, commands.shift)
+ assert_match(/\A(PORT|EPRT) /, commands.shift)
assert_equal("RETR foo\r\n", commands.shift)
assert_equal("TYPE I\r\n", commands.shift)
assert_equal(nil, commands.shift)
@@ -1125,10 +1096,7 @@ EOF
sock.print("200 Switching to ASCII mode.\r\n")
line = sock.gets
commands.push(line)
- port_args = line.slice(/\APORT (.*)/, 1).split(/,/)
- host = port_args[0, 4].join(".")
- port = port_args[4, 2].map(&:to_i).inject {|x, y| (x << 8) + y}
- sock.print("200 PORT command successful.\r\n")
+ host, port = process_port_or_eprt(sock, line)
commands.push(sock.gets)
sock.print("150 Opening TEXT mode data connection for foo (#{text_data.size} bytes)\r\n")
conn = TCPSocket.new(host, port)
@@ -1161,7 +1129,7 @@ EOF
assert_equal(buf, f.read)
end
assert_equal("TYPE A\r\n", commands.shift)
- assert_match(/\APORT /, commands.shift)
+ assert_match(/\A(PORT|EPRT) /, commands.shift)
assert_equal("RETR foo\r\n", commands.shift)
assert_equal("TYPE I\r\n", commands.shift)
assert_equal(nil, commands.shift)
@@ -1193,10 +1161,7 @@ EOF
sock.print("200 Switching to ASCII mode.\r\n")
line = sock.gets
commands.push(line)
- port_args = line.slice(/\APORT (.*)/, 1).split(/,/)
- host = port_args[0, 4].join(".")
- port = port_args[4, 2].map(&:to_i).inject {|x, y| (x << 8) + y}
- sock.print("200 PORT command successful.\r\n")
+ host, port = process_port_or_eprt(sock, line)
commands.push(sock.gets)
sock.print("150 Here comes the directory listing.\r\n")
conn = TCPSocket.new(host, port)
@@ -1209,10 +1174,7 @@ EOF
sock.print("200 Switching to Binary mode.\r\n")
line = sock.gets
commands.push(line)
- port_args = line.slice(/\APORT (.*)/, 1).split(/,/)
- host = port_args[0, 4].join(".")
- port = port_args[4, 2].map(&:to_i).inject {|x, y| (x << 8) + y}
- sock.print("200 PORT command successful.\r\n")
+ host, port = process_port_or_eprt(sock, line)
commands.push(sock.gets)
sock.print("150 Opening BINARY mode data connection for foo (#{binary_data.size} bytes)\r\n")
conn = TCPSocket.new(host, port)
@@ -1236,10 +1198,10 @@ EOF
end
end
assert_equal("TYPE A\r\n", commands.shift)
- assert_match(/\APORT /, commands.shift)
+ assert_match(/\A(PORT|EPRT) /, commands.shift)
assert_equal("LIST\r\n", commands.shift)
assert_equal("TYPE I\r\n", commands.shift)
- assert_match(/\APORT /, commands.shift)
+ assert_match(/\A(PORT|EPRT) /, commands.shift)
assert_equal("RETR baz.bin\r\n", commands.shift)
assert_equal(nil, commands.shift)
ensure
@@ -1658,10 +1620,7 @@ EOF
sock.print("200 Switching to ASCII mode.\r\n")
line = sock.gets
commands.push(line)
- port_args = line.slice(/\APORT (.*)/, 1).split(/,/)
- host = port_args[0, 4].join(".")
- port = port_args[4, 2].map(&:to_i).inject {|x, y| (x << 8) + y}
- sock.print("200 PORT command successful.\r\n")
+ host, port = process_port_or_eprt(sock, line)
commands.push(sock.gets)
sock.print("150 Here comes the directory listing.\r\n")
begin
@@ -1705,7 +1664,7 @@ EOF
assert_equal(123456, modify.usec)
assert_equal(true, modify.utc?)
assert_equal("TYPE A\r\n", commands.shift)
- assert_match(/\APORT /, commands.shift)
+ assert_match(/\A(PORT|EPRT) /, commands.shift)
assert_match("MLSD /\r\n", commands.shift)
assert_equal("TYPE I\r\n", commands.shift)
assert_equal(nil, commands.shift)
@@ -1751,7 +1710,7 @@ EOF
assert_raise(OpenSSL::SSL::SSLError) do
tls_test do |port|
begin
- Net::FTP.new("localhost",
+ Net::FTP.new(SERVER_NAME,
:port => port,
:ssl => true)
rescue SystemCallError
@@ -1765,7 +1724,7 @@ EOF
assert_nothing_raised do
tls_test do |port|
begin
- Net::FTP.new("localhost",
+ Net::FTP.new(SERVER_NAME,
:port => port,
:ssl => { :ca_file => CA_FILE })
rescue SystemCallError
@@ -1832,10 +1791,7 @@ EOF
sock.print("200 Switching to Binary mode.\r\n")
line = sock.gets
commands.push(line)
- port_args = line.slice(/\APORT (.*)/, 1).split(/,/)
- host = port_args[0, 4].join(".")
- port = port_args[4, 2].map(&:to_i).inject {|x, y| (x << 8) + y}
- sock.print("200 PORT command successful.\r\n")
+ host, port = process_port_or_eprt(sock, line)
commands.push(sock.gets)
sock.print("150 Opening BINARY mode data connection for foo (#{binary_data.size} bytes)\r\n")
conn = TCPSocket.new(host, port)
@@ -1854,7 +1810,7 @@ EOF
server.close
end
end
- ftp = Net::FTP.new("localhost",
+ ftp = Net::FTP.new(SERVER_NAME,
port: port,
ssl: { ca_file: CA_FILE },
passive: false)
@@ -1869,7 +1825,7 @@ EOF
buf = ftp.getbinaryfile("foo", nil)
assert_equal(binary_data, buf)
assert_equal(Encoding::ASCII_8BIT, buf.encoding)
- assert_match(/\APORT /, commands.shift)
+ assert_match(/\A(PORT|EPRT) /, commands.shift)
assert_equal("RETR foo\r\n", commands.shift)
assert_equal(nil, commands.shift)
ensure
@@ -1911,10 +1867,7 @@ EOF
commands.push(sock.gets)
sock.print("200 Switching to Binary mode.\r\n")
commands.push(sock.gets)
- data_server = TCPServer.new(SERVER_ADDR, 0)
- port = data_server.local_address.ip_port
- sock.printf("227 Entering Passive Mode (127,0,0,1,%s).\r\n",
- port.divmod(256).join(","))
+ data_server = create_data_connection_server(sock)
commands.push(sock.gets)
sock.print("150 Opening BINARY mode data connection for foo (#{binary_data.size} bytes)\r\n")
conn = data_server.accept
@@ -1934,7 +1887,7 @@ EOF
server.close
end
end
- ftp = Net::FTP.new("localhost",
+ ftp = Net::FTP.new(SERVER_NAME,
port: port,
ssl: { ca_file: CA_FILE },
passive: true)
@@ -1949,7 +1902,7 @@ EOF
buf = ftp.getbinaryfile("foo", nil)
assert_equal(binary_data, buf)
assert_equal(Encoding::ASCII_8BIT, buf.encoding)
- assert_equal("PASV\r\n", commands.shift)
+ assert_match(/\A(PASV|EPSV)\r\n/, commands.shift)
assert_equal("RETR foo\r\n", commands.shift)
assert_equal(nil, commands.shift)
ensure
@@ -1988,10 +1941,7 @@ EOF
sock.print("200 Switching to Binary mode.\r\n")
line = sock.gets
commands.push(line)
- port_args = line.slice(/\APORT (.*)/, 1).split(/,/)
- host = port_args[0, 4].join(".")
- port = port_args[4, 2].map(&:to_i).inject {|x, y| (x << 8) + y}
- sock.print("200 PORT command successful.\r\n")
+ host, port = process_port_or_eprt(sock, line)
commands.push(sock.gets)
sock.print("150 Opening BINARY mode data connection for foo (#{binary_data.size} bytes)\r\n")
conn = TCPSocket.new(host, port)
@@ -2007,7 +1957,7 @@ EOF
server.close
end
end
- ftp = Net::FTP.new("localhost",
+ ftp = Net::FTP.new(SERVER_NAME,
port: port,
ssl: { ca_file: CA_FILE },
private_data_connection: false,
@@ -2021,7 +1971,7 @@ EOF
buf = ftp.getbinaryfile("foo", nil)
assert_equal(binary_data, buf)
assert_equal(Encoding::ASCII_8BIT, buf.encoding)
- assert_match(/\APORT /, commands.shift)
+ assert_match(/\A(PORT|EPRT) /, commands.shift)
assert_equal("RETR foo\r\n", commands.shift)
assert_equal(nil, commands.shift)
ensure
@@ -2059,10 +2009,7 @@ EOF
commands.push(sock.gets)
sock.print("200 Switching to Binary mode.\r\n")
commands.push(sock.gets)
- data_server = TCPServer.new(SERVER_ADDR, 0)
- port = data_server.local_address.ip_port
- sock.printf("227 Entering Passive Mode (127,0,0,1,%s).\r\n",
- port.divmod(256).join(","))
+ data_server = create_data_connection_server(sock)
commands.push(sock.gets)
sock.print("150 Opening BINARY mode data connection for foo (#{binary_data.size} bytes)\r\n")
conn = data_server.accept
@@ -2079,7 +2026,7 @@ EOF
server.close
end
end
- ftp = Net::FTP.new("localhost",
+ ftp = Net::FTP.new(SERVER_NAME,
port: port,
ssl: { ca_file: CA_FILE },
private_data_connection: false,
@@ -2093,7 +2040,7 @@ EOF
buf = ftp.getbinaryfile("foo", nil)
assert_equal(binary_data, buf)
assert_equal(Encoding::ASCII_8BIT, buf.encoding)
- assert_equal("PASV\r\n", commands.shift)
+ assert_match(/\A(PASV|EPSV)\r\n/, commands.shift)
assert_equal("RETR foo\r\n", commands.shift)
assert_equal(nil, commands.shift)
ensure
@@ -2114,7 +2061,7 @@ EOF
end
begin
assert_raise(Net::OpenTimeout) do
- Net::FTP.new("localhost",
+ Net::FTP.new(SERVER_NAME,
port: port,
ssl: { ca_file: CA_FILE },
ssl_handshake_timeout: 0.1)
@@ -2159,7 +2106,7 @@ EOF
}
begin
begin
- ftp = Net::FTP.new("localhost",
+ ftp = Net::FTP.new(SERVER_NAME,
port: server.port,
ssl: { ca_file: CA_FILE })
assert_equal("AUTH TLS\r\n", commands.shift)
@@ -2244,4 +2191,36 @@ EOF
assert_equal("PBSZ 0\r\n", commands.shift)
assert_equal("PROT P\r\n", commands.shift)
end
+
+ def process_port_or_eprt(sock, line)
+ case line
+ when /\APORT (.*)/
+ port_args = $1.split(/,/)
+ host = port_args[0, 4].join(".")
+ port = port_args[4, 2].map(&:to_i).inject {|x, y| (x << 8) + y}
+ sock.print("200 PORT command successful.\r\n")
+ return host, port
+ when /\AEPRT \|2\|(.*?)\|(.*?)\|/
+ host = $1
+ port = $2.to_i
+ sock.print("200 EPRT command successful.\r\n")
+ return host, port
+ else
+ flunk "PORT or EPRT expected"
+ end
+ end
+
+ def create_data_connection_server(sock)
+ data_server = TCPServer.new(SERVER_ADDR, 0)
+ port = data_server.local_address.ip_port
+ if data_server.local_address.ipv4?
+ sock.printf("227 Entering Passive Mode (127,0,0,1,%s).\r\n",
+ port.divmod(256).join(","))
+ elsif data_server.local_address.ipv6?
+ sock.printf("229 Entering Extended Passive Mode (|||%d|)\r\n", port)
+ else
+ flunk "Invalid local address"
+ end
+ return data_server
+ end
end