diff --git a/lib/cgi/escape.rb b/lib/cgi/escape.rb index bdcdcdf..3385ffb 100644 --- a/lib/cgi/escape.rb +++ b/lib/cgi/escape.rb @@ -234,6 +234,6 @@ def unescapeElement(string, *elements) # Like StringValue in C def string_value(input) # :nodoc: - String.try_convert(input) || raise(TypeError, "no implicit conversion of #{input.class} into String") + String === input ? input : "" + input end end diff --git a/test/cgi/test_cgi_escape.rb b/test/cgi/test_cgi_escape.rb index 3278bde..e0c2179 100644 --- a/test/cgi/test_cgi_escape.rb +++ b/test/cgi/test_cgi_escape.rb @@ -404,6 +404,14 @@ def teardown end if defined?(CGI::EscapeExt) and CGI::EscapeExt.method_defined?(:_escapeHTML) end + def test_escapeHTML_type_error_matches_c_extension + assert_raise_with_message(TypeError, "no implicit conversion of nil into String") { CGI.escapeHTML(nil) } + assert_raise_with_message(TypeError, "no implicit conversion of true into String") { CGI.escapeHTML(true) } + assert_raise_with_message(TypeError, "no implicit conversion of false into String") { CGI.escapeHTML(false) } + assert_raise_with_message(TypeError, "no implicit conversion of nil into String") { CGI.unescapeHTML(nil) } + assert_raise(TypeError) { CGI.escapeHTML(BasicObject.new) } + end + include CGIEscapeTest::UnescapeHTMLTests def test_cgi_escapeHTML_with_invalid_byte_sequence