From e50266f299758a49d8933f4023803470c5f09943 Mon Sep 17 00:00:00 2001 From: shugo Date: Wed, 23 Nov 2016 00:03:27 +0000 Subject: [PATCH] Add a new optinal argument pathname to FTP#stat. Based on the patch by soleboxy. [Fix GH-1478] [ruby-core:78240] [Feature #12965] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56879 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- NEWS | 1 + lib/net/ftp.rb | 10 ++++++---- test/net/ftp/test_ftp.rb | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index 050e8b83d7..60701a7e8b 100644 --- a/NEWS +++ b/NEWS @@ -205,6 +205,7 @@ with all sufficient information, see the ChangeLog file or Redmine * Support TLS (RFC 4217). * Support hash style options for Net::FTP.new. + * Add a new optional argument pathname to Net::FTP#status. * OpenSSL diff --git a/lib/net/ftp.rb b/lib/net/ftp.rb index bb280139db..9f2f76fb1d 100644 --- a/lib/net/ftp.rb +++ b/lib/net/ftp.rb @@ -1226,11 +1226,13 @@ module Net # # Returns the status (STAT command). + # pathname - when stat is invoked with pathname as a parameter it acts like + # list but alot faster and over the same tcp session. # - def status - line = "STAT" + CRLF - print "put: STAT\n" if @debug_mode - @sock.send(line, Socket::MSG_OOB) + def status(pathname = nil) + line = pathname ? "STAT #{pathname}" : "STAT" + print "put: #{line}\n" if @debug_mode + @sock.send(line + CRLF, Socket::MSG_OOB) return getresp end diff --git a/test/net/ftp/test_ftp.rb b/test/net/ftp/test_ftp.rb index 79885b3e57..2541e7954a 100644 --- a/test/net/ftp/test_ftp.rb +++ b/test/net/ftp/test_ftp.rb @@ -1316,6 +1316,39 @@ EOF end end + def test_status_path + commands = [] + server = create_ftp_server { |sock| + sock.print("220 (test_ftp).\r\n") + commands.push(sock.gets) + sock.print("331 Please specify the password.\r\n") + commands.push(sock.gets) + sock.print("230 Login successful.\r\n") + commands.push(sock.gets) + sock.print("200 Switching to Binary mode.\r\n") + commands.push(sock.gets) + sock.print("213 End of status\r\n") + } + begin + begin + ftp = Net::FTP.new + ftp.read_timeout = 0.2 + ftp.connect(SERVER_ADDR, server.port) + ftp.login + assert_match(/\AUSER /, commands.shift) + assert_match(/\APASS /, commands.shift) + assert_equal("TYPE I\r\n", commands.shift) + ftp.status "/" + assert_equal("STAT /\r\n", commands.shift) + assert_equal(nil, commands.shift) + ensure + ftp.close if ftp + end + ensure + server.close + end + end + def test_pathnames require 'pathname'