From 5d1f3fc95583c38e09a0cb2b645b6ee7ab7f83f5 Mon Sep 17 00:00:00 2001 From: youdie006 Date: Mon, 14 Sep 2026 09:59:31 +0900 Subject: [PATCH] Make string_value raise what StringValue raises It named nil/true/false by their class, and reaching input.class at all raised NoMethodError for a BasicObject rather than TypeError. Let core build the message, as the C extension does. --- lib/cgi/escape.rb | 2 +- test/cgi/test_cgi_escape.rb | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) 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