[前][次][番号順一覧][スレッド一覧]

ruby-changes:66319

From: Hiroshi <ko1@a...>
Date: Thu, 27 May 2021 14:42:37 +0900 (JST)
Subject: [ruby-changes:66319] 350bc29107 (master): Guard for the ftp protocol feature of OpenURI

https://git.ruby-lang.org/ruby.git/commit/?id=350bc29107

From 350bc29107e96871030ccffaf334c3e0a9d80f5f Mon Sep 17 00:00:00 2001
From: Hiroshi SHIBATA <hsbt@r...>
Date: Wed, 26 May 2021 20:18:46 +0900
Subject: Guard for the ftp protocol feature of OpenURI

---
 lib/open-uri.rb                |   7 +-
 test/open-uri/test_open-uri.rb | 250 +++++++++++++++++++++--------------------
 2 files changed, 134 insertions(+), 123 deletions(-)

diff --git a/lib/open-uri.rb b/lib/open-uri.rb
index 421a82e..e33e57a 100644
--- a/lib/open-uri.rb
+++ b/lib/open-uri.rb
@@ -750,7 +750,12 @@ module URI https://github.com/ruby/ruby/blob/trunk/lib/open-uri.rb#L750
         OpenURI.open_http(buf, self, proxy, options)
         return
       end
-      require 'net/ftp'
+
+      begin
+        require 'net/ftp'
+      rescue LoadError
+        abort "net/ftp is not found. You may need to `gem install net-ftp` to install net/ftp."
+      end
 
       path = self.path
       path = path.sub(%r{\A/}, '%2F') # re-encode the beginning slash because uri library decodes it.
diff --git a/test/open-uri/test_open-uri.rb b/test/open-uri/test_open-uri.rb
index 51e8e50..72ebcdb 100644
--- a/test/open-uri/test_open-uri.rb
+++ b/test/open-uri/test_open-uri.rb
@@ -703,143 +703,149 @@ class TestOpenURI < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/open-uri/test_open-uri.rb#L703
 
   # 192.0.2.0/24 is TEST-NET.  [RFC3330]
 
-  def test_ftp_invalid_request
-    assert_raise(ArgumentError) { URI("ftp://127.0.0.1/").read }
-    assert_raise(ArgumentError) { URI("ftp://127.0.0.1/a%0Db").read }
-    assert_raise(ArgumentError) { URI("ftp://127.0.0.1/a%0Ab").read }
-    assert_raise(ArgumentError) { URI("ftp://127.0.0.1/a%0Db/f").read }
-    assert_raise(ArgumentError) { URI("ftp://127.0.0.1/a%0Ab/f").read }
-    assert_nothing_raised(URI::InvalidComponentError) { URI("ftp://127.0.0.1/d/f;type=x") }
-  end
+  begin
+    require 'net/ftp'
+
+    def test_ftp_invalid_request
+      assert_raise(ArgumentError) { URI("ftp://127.0.0.1/").read }
+      assert_raise(ArgumentError) { URI("ftp://127.0.0.1/a%0Db").read }
+      assert_raise(ArgumentError) { URI("ftp://127.0.0.1/a%0Ab").read }
+      assert_raise(ArgumentError) { URI("ftp://127.0.0.1/a%0Db/f").read }
+      assert_raise(ArgumentError) { URI("ftp://127.0.0.1/a%0Ab/f").read }
+      assert_nothing_raised(URI::InvalidComponentError) { URI("ftp://127.0.0.1/d/f;type=x") }
+    end
 
-  def test_ftp
-    TCPServer.open("127.0.0.1", 0) {|serv|
-      _, port, _, host = serv.addr
-      th = Thread.new {
-        s = serv.accept
+    def test_ftp
+      TCPServer.open("127.0.0.1", 0) {|serv|
+        _, port, _, host = serv.addr
+        th = Thread.new {
+          s = serv.accept
+          begin
+            s.print "220 Test FTP Server\r\n"
+            assert_equal("USER anonymous\r\n", s.gets); s.print "331 name ok\r\n"
+            assert_match(/\APASS .*\r\n\z/, s.gets); s.print "230 logged in\r\n"
+            assert_equal("TYPE I\r\n", s.gets); s.print "200 type set to I\r\n"
+            assert_equal("CWD foo\r\n", s.gets); s.print "250 CWD successful\r\n"
+            assert_equal("PASV\r\n", s.gets)
+            TCPServer.open("127.0.0.1", 0) {|data_serv|
+              _, data_serv_port, _, _ = data_serv.addr
+              hi = data_serv_port >> 8
+              lo = data_serv_port & 0xff
+              s.print "227 Entering Passive Mode (127,0,0,1,#{hi},#{lo}).\r\n"
+              assert_equal("RETR bar\r\n", s.gets); s.print "150 file okay\r\n"
+              data_sock = data_serv.accept
+              begin
+                data_sock << "content"
+              ensure
+                data_sock.close
+              end
+              s.print "226 transfer complete\r\n"
+              assert_nil(s.gets)
+            }
+          ensure
+            s.close if s
+          end
+        }
         begin
-          s.print "220 Test FTP Server\r\n"
-          assert_equal("USER anonymous\r\n", s.gets); s.print "331 name ok\r\n"
-          assert_match(/\APASS .*\r\n\z/, s.gets); s.print "230 logged in\r\n"
-          assert_equal("TYPE I\r\n", s.gets); s.print "200 type set to I\r\n"
-          assert_equal("CWD foo\r\n", s.gets); s.print "250 CWD successful\r\n"
-          assert_equal("PASV\r\n", s.gets)
-          TCPServer.open("127.0.0.1", 0) {|data_serv|
-            _, data_serv_port, _, _ = data_serv.addr
-            hi = data_serv_port >> 8
-            lo = data_serv_port & 0xff
-            s.print "227 Entering Passive Mode (127,0,0,1,#{hi},#{lo}).\r\n"
-            assert_equal("RETR bar\r\n", s.gets); s.print "150 file okay\r\n"
-            data_sock = data_serv.accept
-            begin
-              data_sock << "content"
-            ensure
-              data_sock.close
-            end
-            s.print "226 transfer complete\r\n"
-            assert_nil(s.gets)
-          }
+          content = URI("ftp://#{host}:#{port}/foo/bar").read
+          assert_equal("content", content)
         ensure
-          s.close if s
+          Thread.kill(th)
+          th.join
         end
       }
-      begin
-        content = URI("ftp://#{host}:#{port}/foo/bar").read
-        assert_equal("content", content)
-      ensure
-        Thread.kill(th)
-        th.join
-      end
-    }
-  end
+    end
 
-  def test_ftp_active
-    TCPServer.open("127.0.0.1", 0) {|serv|
-      _, port, _, host = serv.addr
-      th = Thread.new {
-        s = serv.accept
+    def test_ftp_active
+      TCPServer.open("127.0.0.1", 0) {|serv|
+        _, port, _, host = serv.addr
+        th = Thread.new {
+          s = serv.accept
+          begin
+            content = "content"
+            s.print "220 Test FTP Server\r\n"
+            assert_equal("USER anonymous\r\n", s.gets); s.print "331 name ok\r\n"
+            assert_match(/\APASS .*\r\n\z/, s.gets); s.print "230 logged in\r\n"
+            assert_equal("TYPE I\r\n", s.gets); s.print "200 type set to I\r\n"
+            assert_equal("CWD foo\r\n", s.gets); s.print "250 CWD successful\r\n"
+            assert(m = /\APORT 127,0,0,1,(\d+),(\d+)\r\n\z/.match(s.gets))
+            active_port = m[1].to_i << 8 | m[2].to_i
+            TCPSocket.open("127.0.0.1", active_port) {|data_sock|
+              s.print "200 data connection opened\r\n"
+              assert_equal("RETR bar\r\n", s.gets); s.print "150 file okay\r\n"
+              begin
+                data_sock << content
+              ensure
+                data_sock.close
+              end
+              s.print "226 transfer complete\r\n"
+              assert_nil(s.gets)
+            }
+          ensure
+            s.close if s
+          end
+        }
         begin
-          content = "content"
-          s.print "220 Test FTP Server\r\n"
-          assert_equal("USER anonymous\r\n", s.gets); s.print "331 name ok\r\n"
-          assert_match(/\APASS .*\r\n\z/, s.gets); s.print "230 logged in\r\n"
-          assert_equal("TYPE I\r\n", s.gets); s.print "200 type set to I\r\n"
-          assert_equal("CWD foo\r\n", s.gets); s.print "250 CWD successful\r\n"
-          assert(m = /\APORT 127,0,0,1,(\d+),(\d+)\r\n\z/.match(s.gets))
-          active_port = m[1].to_i << 8 | m[2].to_i
-          TCPSocket.open("127.0.0.1", active_port) {|data_sock|
-            s.print "200 data connection opened\r\n"
-            assert_equal("RETR bar\r\n", s.gets); s.print "150 file okay\r\n"
-            begin
-              data_sock << content
-            ensure
-              data_sock.close
-            end
-            s.print "226 transfer complete\r\n"
-            assert_nil(s.gets)
-          }
+          content = URI("ftp://#{host}:#{port}/foo/bar").read(:ftp_active_mode=>true)
+          assert_equal("content", content)
         ensure
-          s.close if s
+          Thread.kill(th)
+          th.join
         end
       }
-      begin
-        content = URI("ftp://#{host}:#{port}/foo/bar").read(:ftp_active_mode=>true)
-        assert_equal("content", content)
-      ensure
-        Thread.kill(th)
-        th.join
-      end
-    }
-  end
+    end
 
-  def test_ftp_ascii
-    TCPServer.open("127.0.0.1", 0) {|serv|
-      _, port, _, host = serv.addr
-      th = Thread.new {
-        s = serv.accept
+    def test_ftp_ascii
+      TCPServer.open("127.0.0.1", 0) {|serv|
+        _, port, _, host = serv.addr
+        th = Thread.new {
+          s = serv.accept
+          begin
+            content = "content"
+            s.print "220 Test FTP Server\r\n"
+            assert_equal("USER anonymous\r\n", s.gets); s.print "331 name ok\r\n"
+            assert_match(/\APASS .*\r\n\z/, s.gets); s.print "230 logged in\r\n"
+            assert_equal("TYPE I\r\n", s.gets); s.print "200 type set to I\r\n"
+            assert_equal("CWD /foo\r\n", s.gets); s.print "250 CWD successful\r\n"
+            assert_equal("TYPE A\r\n", s.gets); s.print "200 type set to A\r\n"
+            assert_equal("SIZE bar\r\n", s.gets); s.print "213 #{content.bytesize}\r\n"
+            assert_equal("PASV\r\n", s.gets)
+            TCPServer.open("127.0.0.1", 0) {|data_serv|
+              _, data_serv_port, _, _ = data_serv.addr
+              hi = data_serv_port >> 8
+              lo = data_serv_port & 0xff
+              s.print "227 Entering Passive Mode (127,0,0,1,#{hi},#{lo}).\r\n"
+              assert_equal("RETR bar\r\n", s.gets); s.print "150 file okay\r\n"
+              data_sock = data_serv.accept
+              begin
+                data_sock << content
+              ensure
+                data_sock.close
+              end
+              s.print "226 transfer complete\r\n"
+              assert_nil(s.gets)
+            }
+          ensure
+            s.close if s
+          end
+        }
         begin
-          content = "content"
-          s.print "220 Test FTP Server\r\n"
-          assert_equal("USER anonymous\r\n", s.gets); s.print "331 name ok\r\n"
-          assert_match(/\APASS .*\r\n\z/, s.gets); s.print "23 (... truncated)

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]