normalperson (Eric Wong) wrote:
https://bugs.ruby-lang.org/issues/14732
r63328 This also affects 2.3 for unescapeHTML.
I confirmed r63328, but could not understand the valid specification.
In Ruby 2.3, CGI.escape and CGI.unescape always return String instance regardless of class and value:
$ ruby -v -rcgi/util -e 'class S < String; end; puts CGI.escape(S.new("a")).class'
ruby 2.3.6p384 (2017-12-14 revision 61254) [x86_64-darwin17]
String
$ ruby -v -rcgi/util -e 'class S < String; end; puts CGI.escape(S.new(">")).class'
ruby 2.3.6p384 (2017-12-14 revision 61254) [x86_64-darwin17]
String
$ ruby -v -rcgi/util -e 'class S < String; end; puts CGI.unescape(S.new("a")).class'
ruby 2.3.6p384 (2017-12-14 revision 61254) [x86_64-darwin17]
String
$ ruby -v -rcgi/util -e 'class S < String; end; puts CGI.unescape(S.new("%3E")).class'
ruby 2.3.6p384 (2017-12-14 revision 61254) [x86_64-darwin17]
String
In Ruby 2.4, results differ according to argument values:
$ ruby -v -rcgi/util -e 'class S < String; end; puts CGI.escape(S.new("a")).class'
ruby 2.4.4p296 (2018-03-28 revision 63013) [x86_64-darwin17]
S
$ ruby -v -rcgi/util -e 'class S < String; end; puts CGI.escape(S.new(">")).class'
ruby 2.4.4p296 (2018-03-28 revision 63013) [x86_64-darwin17]
String
$ ruby -v -rcgi/util -e 'class S < String; end; puts CGI.unescape(S.new("a")).class'
ruby 2.4.4p296 (2018-03-28 revision 63013) [x86_64-darwin17]
S
$ ruby -v -rcgi/util -e 'class S < String; end; puts CGI.unescape(S.new("%3E")).class'
ruby 2.4.4p296 (2018-03-28 revision 63013) [x86_64-darwin17]
String
With r63328, I feel the all results would be the instance of "S" and this behavior is different from Ruby 2.3. But is this valid in Ruby 2.4?