aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--lib/net/ftp.rb19
-rw-r--r--test/net/ftp/test_ftp.rb20
3 files changed, 24 insertions, 19 deletions
diff --git a/ChangeLog b/ChangeLog
index 6e2719a235..320be03fa8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Fri Oct 9 17:29:07 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * lib/net/ftp.rb (parse257): refactor.
+
Fri Oct 9 16:42:26 2015 Shugo Maeda <shugo@ruby-lang.org>
* lib/net/imap.rb: use frozen_string_literal: true.
diff --git a/lib/net/ftp.rb b/lib/net/ftp.rb
index 2269b750d1..32eef46543 100644
--- a/lib/net/ftp.rb
+++ b/lib/net/ftp.rb
@@ -1246,24 +1246,7 @@ module Net
if !resp.start_with?("257")
raise FTPReplyError, resp
end
- if resp[3, 2] != ' "'
- return ""
- end
- dirname = ""
- i = 5
- n = resp.length
- while i < n
- c = resp[i, 1]
- i = i + 1
- if c == '"'
- if i > n or resp[i, 1] != '"'
- break
- end
- i = i + 1
- end
- dirname = dirname + c
- end
- return dirname
+ return resp.slice(/"(([^"]|"")*)"/, 1).to_s.gsub(/""/, '"')
end
private :parse257
diff --git a/test/net/ftp/test_ftp.rb b/test/net/ftp/test_ftp.rb
index ae3649ec1c..cd84733b2c 100644
--- a/test/net/ftp/test_ftp.rb
+++ b/test/net/ftp/test_ftp.rb
@@ -1318,8 +1318,26 @@ EOF
end
end
- private
+ def test_parse257
+ ftp = Net::FTP.new
+ assert_equal('/foo/bar',
+ ftp.send(:parse257, '257 "/foo/bar" directory created'))
+ assert_equal('/foo/bar"baz',
+ ftp.send(:parse257, '257 "/foo/bar""baz" directory created'))
+ assert_equal('/foo/x"y"z',
+ ftp.send(:parse257, '257 "/foo/x""y""z" directory created'))
+ assert_equal('/foo/bar',
+ ftp.send(:parse257, '257 "/foo/bar" "comment"'))
+ assert_equal('',
+ ftp.send(:parse257, '257 "" directory created'))
+ assert_equal('',
+ ftp.send(:parse257, '257 directory created'))
+ assert_raise(Net::FTPReplyError) do
+ ftp.send(:parse257, "500 Syntax error")
+ end
+ end
+ private
def create_ftp_server(sleep_time = nil)
server = TCPServer.new(SERVER_ADDR, 0)