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

ruby-changes:22297

From: mrkn <ko1@a...>
Date: Fri, 20 Jan 2012 20:49:03 +0900 (JST)
Subject: [ruby-changes:22297] mrkn:r34346 (trunk): * lib/cgi/util.rb (CGI.escape): support a string with invalid byte

mrkn	2012-01-20 20:48:52 +0900 (Fri, 20 Jan 2012)

  New Revision: 34346

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

  Log:
    * lib/cgi/util.rb (CGI.escape): support a string with invalid byte
      sequence.
    
    * test/cgi/test_cgi_util.rb
      (test_cgi_escape_with_invalid_byte_sequence): test for the above
      change.

  Modified files:
    trunk/ChangeLog
    trunk/lib/cgi/util.rb
    trunk/test/cgi/test_cgi_util.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 34345)
+++ ChangeLog	(revision 34346)
@@ -1,3 +1,12 @@
+Fri Jan 20 20:47:37 2012  Kenta Murata  <mrkn@c...>
+
+	* lib/cgi/util.rb (CGI.escape): support a string with invalid byte
+	  sequence.
+
+	* test/cgi/test_cgi_util.rb
+	  (test_cgi_escape_with_invalid_byte_sequence): test for the above
+	  change.
+
 Fri Jan 20 17:37:37 2012  NARUSE, Yui  <naruse@r...>
 
 	* vm.c (vm_exec): remove workaround for LLVM because r34278 fixes it.
Index: lib/cgi/util.rb
===================================================================
--- lib/cgi/util.rb	(revision 34345)
+++ lib/cgi/util.rb	(revision 34346)
@@ -4,9 +4,10 @@
   #   url_encoded_string = CGI::escape("'Stop!' said Fred")
   #      # => "%27Stop%21%27+said+Fred"
   def CGI::escape(string)
-    string.gsub(/([^ a-zA-Z0-9_.-]+)/) do
+    encoding = string.encoding
+    string.dup.force_encoding('ASCII-8BIT').gsub(/([^ a-zA-Z0-9_.-]+)/) do
       '%' + $1.unpack('H2' * $1.bytesize).join('%').upcase
-    end.tr(' ', '+')
+    end.tr(' ', '+').force_encoding(encoding)
   end
 
   # URL-decode a string with encoding(optional).
Index: test/cgi/test_cgi_util.rb
===================================================================
--- test/cgi/test_cgi_util.rb	(revision 34345)
+++ test/cgi/test_cgi_util.rb	(revision 34346)
@@ -24,6 +24,12 @@
     assert_equal('%26%3C%3E%22+%E3%82%86%E3%82%93%E3%82%86%E3%82%93'.ascii_only?, CGI::escape(@str1).ascii_only?) if defined?(::Encoding)
   end
 
+  def test_cgi_escape_with_invalid_byte_sequence
+    assert_nothing_raised(ArgumentError) do
+      assert_equal('%C0%3C%3C', CGI::escape("\xC0<<".force_encoding("UTF-8")))
+    end
+  end
+
   def test_cgi_unescape
     assert_equal(@str1, CGI::unescape('%26%3C%3E%22+%E3%82%86%E3%82%93%E3%82%86%E3%82%93'))
     assert_equal(@str1.encoding, CGI::unescape('%26%3C%3E%22+%E3%82%86%E3%82%93%E3%82%86%E3%82%93').encoding) if defined?(::Encoding)

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

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