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 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)