summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-03-08 09:38:01 +0000
committernaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-03-08 09:38:01 +0000
commit6db869c1019948a878b2735ca205888af2e07ecb (patch)
treefbec34631a04841232c759fb83bba6b4cf6cd529
parent0a2fb188e397d69a2b68d98b797fe0b68d4d11ee (diff)
fix error if the input is mixed Unicode and percent-escapes
Reported by kivikakk (Ashe Connor) with tests and doc fix Patch based on mame and fix by naruse [Bug #14586] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62695 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--lib/uri/rfc2396_parser.rb6
-rw-r--r--test/uri/test_parser.rb7
2 files changed, 10 insertions, 3 deletions
diff --git a/lib/uri/rfc2396_parser.rb b/lib/uri/rfc2396_parser.rb
index b9e7b2b..a6e5df9 100644
--- a/lib/uri/rfc2396_parser.rb
+++ b/lib/uri/rfc2396_parser.rb
@@ -315,13 +315,13 @@ module URI
#
# :call-seq:
# unescape( str )
- # unescape( str, unsafe )
+ # unescape( str, escaped )
#
# == Args
#
# +str+::
# String to remove escapes from
- # +unsafe+::
+ # +escaped+::
# Regexp to apply. Defaults to self.regexp[:ESCAPED]
#
# == Description
@@ -329,7 +329,7 @@ module URI
# Removes escapes from +str+
#
def unescape(str, escaped = @regexp[:ESCAPED])
- str.gsub(escaped) { [$&[1, 2].hex].pack('C') }.force_encoding(str.encoding)
+ str.gsub(escaped) { [$&[1, 2]].pack('H2').force_encoding(str.encoding) }
end
@@to_s = Kernel.instance_method(:to_s)
diff --git a/test/uri/test_parser.rb b/test/uri/test_parser.rb
index 757ac86..b9cf4b7 100644
--- a/test/uri/test_parser.rb
+++ b/test/uri/test_parser.rb
@@ -45,4 +45,11 @@ class URI::TestParser < Test::Unit::TestCase
URI.parse(1)
end
end
+
+ def test_unescape
+ p1 = URI::Parser.new
+ assert_equal("\xe3\x83\x90", p1.unescape("\xe3\x83\x90"))
+ assert_equal("\xe3\x83\x90", p1.unescape('%e3%83%90'))
+ assert_equal("\xe3\x83\x90\xe3\x83\x90", p1.unescape("\xe3\x83\x90%e3%83%90"))
+ end
end