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

ruby-changes:13134

From: akr <ko1@a...>
Date: Sun, 13 Sep 2009 11:30:11 +0900 (JST)
Subject: [ruby-changes:13134] Ruby:r24885 (ruby_1_8, trunk): * lib/open-uri.rb (OpenURI::Meta#content_type_parse): strip quotes.

akr	2009-09-13 11:29:47 +0900 (Sun, 13 Sep 2009)

  New Revision: 24885

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=24885

  Log:
    * lib/open-uri.rb (OpenURI::Meta#content_type_parse): strip quotes.

  Modified files:
    branches/ruby_1_8/ChangeLog
    branches/ruby_1_8/lib/open-uri.rb
    trunk/ChangeLog
    trunk/lib/open-uri.rb
    trunk/test/open-uri/test_open-uri.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 24884)
+++ ChangeLog	(revision 24885)
@@ -1,3 +1,7 @@
+Sun Sep 13 11:06:12 2009  Tanaka Akira  <akr@f...>
+
+	* lib/open-uri.rb (OpenURI::Meta#content_type_parse): strip quotes.
+
 Sun Sep 13 09:38:06 2009  Nobuyoshi Nakada  <nobu@r...>
 
 	* lib/prime.rb (EratosthenesGenerator#initialize): call super.
Index: lib/open-uri.rb
===================================================================
--- lib/open-uri.rb	(revision 24884)
+++ lib/open-uri.rb	(revision 24885)
@@ -465,7 +465,9 @@
         subtype = $2.downcase
         parameters = []
         $3.scan(/;#{RE_LWS}?(#{RE_TOKEN})#{RE_LWS}?=#{RE_LWS}?(?:(#{RE_TOKEN})|(#{RE_QUOTED_STRING}))/no) {|att, val, qval|
-          val = qval.gsub(/[\r\n\t !#-\[\]-~\x80-\xff]+|(\\[\x00-\x7f])/n) { $1 ? $1[1,1] : $& } if qval
+          if qval
+            val = qval[1...-1].gsub(/[\r\n\t !#-\[\]-~\x80-\xff]+|(\\[\x00-\x7f])/n) { $1 ? $1[1,1] : $& }
+          end
           parameters << [att.downcase, val]
         }
         ["#{type}/#{subtype}", *parameters]
Index: test/open-uri/test_open-uri.rb
===================================================================
--- test/open-uri/test_open-uri.rb	(revision 24884)
+++ test/open-uri/test_open-uri.rb	(revision 24885)
@@ -29,6 +29,17 @@
     }
   end
 
+  def with_env(h)
+    begin
+      old = {}
+      h.each_key {|k| old[k] = ENV[k] }
+      h.each {|k, v| ENV[k] = v }
+      yield
+    ensure
+      h.each_key {|k| ENV[k] = old[k] }
+    end
+  end
+
   def setup
     @proxies = %w[http_proxy ftp_proxy no_proxy]
     @old_proxies = @proxies.map {|k| ENV[k] }
@@ -78,6 +89,10 @@
     }
   end
 
+  def test_open_too_many_arg
+    assert_raise(ArgumentError) { open("http://192.0.2.1/tma", "r", 0666, :extra) {} }
+  end
+
   def test_read_timeout
     TCPServer.open("127.0.0.1", 0) {|serv|
       port = serv.addr[1]
@@ -119,6 +134,13 @@
         assert_equal("mode", f.read)
       }
       assert_raise(ArgumentError) { open("#{url}/mode", "a") {} }
+      open("#{url}/mode", "r:us-ascii") {|f|
+        assert_equal(Encoding::US_ASCII, f.read.encoding)
+      }
+      open("#{url}/mode", "r:utf-8") {|f|
+        assert_equal(Encoding::UTF_8, f.read.encoding)
+      }
+      assert_raise(ArgumentError) { open("#{url}/mode", "r:invalid-encoding") {} }
     }
   end
 
@@ -135,12 +157,30 @@
     }
   end
 
+  def test_header
+    myheader1 = 'barrrr'
+    myheader2 = nil
+    with_http {|srv, dr, url|
+      srv.mount_proc("/h/") {|req, res| myheader2 = req['myheader']; res.body = "foo" }
+      open("#{url}/h/", 'MyHeader'=>myheader1) {|f|
+        assert_equal("foo", f.read)
+        assert_equal(myheader1, myheader2)
+      }
+    }
+  end
+
   def test_multi_proxy_opt
     assert_raise(ArgumentError) {
       open("http://127.0.0.1/", :proxy_http_basic_authentication=>true, :proxy=>true) {}
     }
   end
 
+  def test_non_http_proxy
+    assert_raise(RuntimeError) {
+      open("http://127.0.0.1/", :proxy=>URI("ftp://127.0.0.1/")) {}
+    }
+  end
+
   def test_proxy
     with_http {|srv, dr, url|
       log = ''
@@ -154,15 +194,16 @@
         :BindAddress => '127.0.0.1',
         :Port => 0})
       _, proxy_port, _, proxy_host = proxy.listeners[0].addr
+      proxy_url = "http://#{proxy_host}:#{proxy_port}/"
       begin
         th = proxy.start
         open("#{dr}/proxy", "w") {|f| f << "proxy" }
-        open("#{url}/proxy", :proxy=>"http://#{proxy_host}:#{proxy_port}/") {|f|
+        open("#{url}/proxy", :proxy=>proxy_url) {|f|
           assert_equal("200", f.status[0])
           assert_equal("proxy", f.read)
         }
         assert_match(/#{Regexp.quote url}/, log); log.clear
-        open("#{url}/proxy", :proxy=>URI("http://#{proxy_host}:#{proxy_port}/")) {|f|
+        open("#{url}/proxy", :proxy=>URI(proxy_url)) {|f|
           assert_equal("200", f.status[0])
           assert_equal("proxy", f.read)
         }
@@ -176,6 +217,14 @@
           open("#{url}/proxy", :proxy=>:invalid) {}
         }
         assert_equal("", log); log.clear
+        with_env("http_proxy"=>proxy_url) {
+          # should not use proxy for 127.0.0.0/8.
+          open("#{url}/proxy") {|f|
+            assert_equal("200", f.status[0])
+            assert_equal("proxy", f.read)
+          }
+        }
+        assert_equal("", log); log.clear
       ensure
         proxy.shutdown
       end
@@ -236,6 +285,14 @@
     }
   end
 
+  def test_redirect_loop
+    with_http {|srv, dr, url|
+      srv.mount_proc("/r1/") {|req, res| res.status = 301; res["location"] = "#{url}/r2"; res.body = "r1" }
+      srv.mount_proc("/r2/") {|req, res| res.status = 301; res["location"] = "#{url}/r1"; res.body = "r2" }
+      assert_raise(RuntimeError) { open("#{url}/r1/") {} }
+    }
+  end
+
   def test_redirect_relative
     TCPServer.open("127.0.0.1", 0) {|serv|
       port = serv.addr[1]
@@ -391,6 +448,18 @@
     }
   end
 
+  def test_quoted_attvalue
+    with_http {|srv, dr, url|
+      content_u8 = "\u3042"
+      srv.mount_proc("/qu8/") {|req, res| res.body = content_u8; res['content-type'] = 'text/plain; charset="utf\-8"' }
+      open("#{url}/qu8/") {|f|
+        assert_equal(content_u8, f.read)
+        assert_equal("text/plain", f.content_type)
+        assert_equal("utf-8", f.charset)
+      }
+    }
+  end
+
   def test_last_modified
     with_http {|srv, dr, url|
       srv.mount_proc("/data/") {|req, res| res.body = "foo"; res['last-modified'] = 'Fri, 07 Aug 2009 06:05:04 GMT' }
@@ -423,17 +492,6 @@
     }
   end
 
-  def with_env(h)
-    begin
-      old = {}
-      h.each_key {|k| old[k] = ENV[k] }
-      h.each {|k, v| ENV[k] = v }
-      yield
-    ensure
-      h.each_key {|k| ENV[k] = old[k] }
-    end
-  end
-
   # 192.0.2.0/24 is TEST-NET.  [RFC3330]
 
   def test_find_proxy
@@ -488,7 +546,7 @@
         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/, s.gets); s.print "230 logged in\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)
@@ -521,6 +579,45 @@
     }
   end
 
+  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 = URI("ftp://#{host}:#{port}/foo/bar").read(:ftp_active_mode=>true)
+        assert_equal("content", content)
+      ensure
+        Thread.kill(th)
+        th.join
+      end
+    }
+  end
+
   def test_ftp_ascii
     TCPServer.open("127.0.0.1", 0) {|serv|
       _, port, _, host = serv.addr
@@ -530,7 +627,7 @@
           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/, s.gets); s.print "230 logged in\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"
Index: ruby_1_8/ChangeLog
===================================================================
--- ruby_1_8/ChangeLog	(revision 24884)
+++ ruby_1_8/ChangeLog	(revision 24885)
@@ -1,3 +1,7 @@
+Sun Sep 13 11:06:12 2009  Tanaka Akira  <akr@f...>
+
+	* lib/open-uri.rb (OpenURI::Meta#content_type_parse): strip quotes.
+
 Sun Sep 13 01:55:32 2009  Tanaka Akira  <akr@f...>
 
 	* lib/open-uri.rb (URI::FTP#buffer_open): fix the %2F handling.
Index: ruby_1_8/lib/open-uri.rb
===================================================================
--- ruby_1_8/lib/open-uri.rb	(revision 24884)
+++ ruby_1_8/lib/open-uri.rb	(revision 24885)
@@ -435,7 +435,9 @@
         subtype = $2.downcase
         parameters = []
         $3.scan(/;#{RE_LWS}?(#{RE_TOKEN})#{RE_LWS}?=#{RE_LWS}?(?:(#{RE_TOKEN})|(#{RE_QUOTED_STRING}))/no) {|att, val, qval|
-          val = qval.gsub(/[\r\n\t !#-\[\]-~\x80-\xff]+|(\\[\x00-\x7f])/n) { $1 ? $1[1,1] : $& } if qval
+          if qval
+            val = qval[1...-1].gsub(/[\r\n\t !#-\[\]-~\x80-\xff]+|(\\[\x00-\x7f])/n) { $1 ? $1[1,1] : $& }
+          end
           parameters << [att.downcase, val]
         }
         ["#{type}/#{subtype}", *parameters]

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

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