aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorshugo <shugo@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-11-26 09:29:11 +0000
committershugo <shugo@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-11-26 09:29:11 +0000
commit89551aeaa3f03da2bad01a22a24ec49a846452d8 (patch)
treea2a0eac1f791f523816e9fa28caa717beca2b0c6
parentcc8782ccc86563b5aae5713863a72806d2a1400d (diff)
downloadruby-89551aeaa3f03da2bad01a22a24ec49a846452d8.tar.gz
net/ftp: support timeout for TLS handshake.
Net::FTP inherits ssl_socket_connect from Net::Protocol to implement timeout. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56898 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--lib/net/ftp.rb4
-rw-r--r--test/net/ftp/test_ftp.rb24
2 files changed, 26 insertions, 2 deletions
diff --git a/lib/net/ftp.rb b/lib/net/ftp.rb
index 7aac61afe8..1f17e9bdc4 100644
--- a/lib/net/ftp.rb
+++ b/lib/net/ftp.rb
@@ -77,7 +77,7 @@ module Net
# - #rename
# - #delete
#
- class FTP
+ class FTP < Protocol
include MonitorMixin
if defined?(OpenSSL::SSL)
include OpenSSL
@@ -338,7 +338,7 @@ module Net
# ProFTPD returns 425 for data connections if session is not reused.
ssl_sock.session = @ssl_session
end
- ssl_sock.connect
+ ssl_socket_connect(ssl_sock, @open_timeout)
if @ssl_context.verify_mode != VERIFY_NONE
ssl_sock.post_connection_check(@host)
end
diff --git a/test/net/ftp/test_ftp.rb b/test/net/ftp/test_ftp.rb
index 5028bd410f..380b80259a 100644
--- a/test/net/ftp/test_ftp.rb
+++ b/test/net/ftp/test_ftp.rb
@@ -2100,6 +2100,30 @@ EOF
ftp.close
end
end
+
+ def test_tls_connect_timeout
+ server = TCPServer.new(SERVER_ADDR, 0)
+ port = server.addr[1]
+ commands = []
+ sock = nil
+ @thread = Thread.start do
+ sock = server.accept
+ sock.print("220 (test_ftp).\r\n")
+ commands.push(sock.gets)
+ sock.print("234 AUTH success.\r\n")
+ end
+ begin
+ assert_raise(Net::OpenTimeout) do
+ Net::FTP.new("localhost",
+ port: port,
+ ssl: { ca_file: CA_FILE },
+ open_timeout: 0.1)
+ end
+ ensure
+ sock.close if sock
+ server.close
+ end
+ end
end
def test_abort_tls