diff options
author | naruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-03-08 09:38:01 +0000 |
---|---|---|
committer | naruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-03-08 09:38:01 +0000 |
commit | 6db869c1019948a878b2735ca205888af2e07ecb (patch) | |
tree | fbec34631a04841232c759fb83bba6b4cf6cd529 | |
parent | 0a2fb188e397d69a2b68d98b797fe0b68d4d11ee (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.rb | 6 | ||||
-rw-r--r-- | test/uri/test_parser.rb | 7 |
2 files changed, 10 insertions, 3 deletions
diff --git a/lib/uri/rfc2396_parser.rb b/lib/uri/rfc2396_parser.rb index b9e7b2b26e..a6e5df91f9 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 757ac86c74..b9cf4b7e1a 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 |