From cb09a80cb8f03f673473713fbe42e1587438ca11 Mon Sep 17 00:00:00 2001 From: Oskar Eichler Date: Thu, 27 Aug 2026 23:37:14 +0300 Subject: [PATCH 1/2] Preserve caller options when constructing an RFC2396 parser --- lib/uri/rfc2396_parser.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/uri/rfc2396_parser.rb b/lib/uri/rfc2396_parser.rb index cefd126..b0176a0 100644 --- a/lib/uri/rfc2396_parser.rb +++ b/lib/uri/rfc2396_parser.rb @@ -97,7 +97,7 @@ class RFC2396_Parser # u1.eql?(u2) #=> false # def initialize(opts = {}) - @pattern = initialize_pattern(opts) + @pattern = initialize_pattern(opts.transform_values(&:dup)) @pattern.each_value(&:freeze) @pattern.freeze From f3fca1347387d8ba44a47b89a0270f8e38cf82a6 Mon Sep 17 00:00:00 2001 From: Oskar Eichler <62393985+OskarEichler@users.noreply.github.com> Date: Fri, 28 Aug 2026 15:03:53 +0300 Subject: [PATCH 2/2] test: cover URI regression --- test/uri/test_parser.rb | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/test/uri/test_parser.rb b/test/uri/test_parser.rb index c14824f..78ba8da 100644 --- a/test/uri/test_parser.rb +++ b/test/uri/test_parser.rb @@ -7,6 +7,19 @@ def uri_to_ary(uri) uri.class.component.collect {|c| uri.send(c)} end + + def test_rfc2396_parser_preserves_options + escaped = "%[0-9a-fA-F]{2}" + options = {ESCAPED: escaped} + + parser = URI::RFC2396_Parser.new(options) + + assert_equal({ESCAPED: escaped}, options) + assert_equal(false, escaped.frozen?) + assert_equal("http://example.test/a%20b", parser.parse("http://example.test/a%20b").to_s) + assert_nothing_raised { URI::RFC2396_Parser.new(options.freeze) } + end + def test_inspect assert_match(/URI::RFC2396_Parser/, URI::RFC2396_Parser.new.inspect) assert_match(/URI::RFC3986_Parser/, URI::Parser.new.inspect)