From d7dc19ad3fc5efe094abb4bffbe6b80a1d7aacae Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Wed, 17 Jul 2024 18:53:54 +0900 Subject: [PATCH 1/7] Added URI.parser= method for switch back to RFC2396_Parser --- lib/uri/common.rb | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/lib/uri/common.rb b/lib/uri/common.rb index faf75f0..1d381e7 100644 --- a/lib/uri/common.rb +++ b/lib/uri/common.rb @@ -13,24 +13,34 @@ require_relative "rfc3986_parser" module URI - include RFC2396_REGEXP + RFC2396_PARSER = RFC2396_Parser.new + Ractor.make_shareable(RFC2396_PARSER) if defined?(Ractor) - REGEXP = RFC2396_REGEXP - Parser = RFC2396_Parser RFC3986_PARSER = RFC3986_Parser.new Ractor.make_shareable(RFC3986_PARSER) if defined?(Ractor) - # URI::Parser.new - DEFAULT_PARSER = Parser.new - DEFAULT_PARSER.pattern.each_pair do |sym, str| - unless REGEXP::PATTERN.const_defined?(sym) - REGEXP::PATTERN.const_set(sym, str) + DEFAULT_PARSER = RFC3986_PARSER + Ractor.make_shareable(DEFAULT_PARSER) if defined?(Ractor) + + def self.parser=(parser = RFC3986_PARSER) + remove_const(:Parser) if defined?(Parser) + const_set("Parser", parser.class) + + if Parser == RFC2396_Parser + remove_const(:REGEXP) if defined?(REGEXP) + const_set("REGEXP", URI::RFC2396_REGEXP) + Parser.new.pattern.each_pair do |sym, str| + unless REGEXP::PATTERN.const_defined?(sym) + REGEXP::PATTERN.const_set(sym, str) + end + end + end + Parser.new.regexp.each_pair do |sym, str| + remove_const(sym) if const_defined?(sym) + const_set(sym, str) end end - DEFAULT_PARSER.regexp.each_pair do |sym, str| - const_set(sym, str) - end - Ractor.make_shareable(DEFAULT_PARSER) if defined?(Ractor) + self.parser = RFC3986_PARSER module Util # :nodoc: def make_components_hash(klass, array_hash) From bbb8a40eae3d11521113a111e5f8ab8f6d6f40c3 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Thu, 18 Jul 2024 10:11:13 +0900 Subject: [PATCH 2/7] Added compatibility methods for RFC2396 parser --- lib/uri/rfc3986_parser.rb | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/lib/uri/rfc3986_parser.rb b/lib/uri/rfc3986_parser.rb index 092a1ac..dbb352f 100644 --- a/lib/uri/rfc3986_parser.rb +++ b/lib/uri/rfc3986_parser.rb @@ -135,12 +135,31 @@ def parse(uri) # :nodoc: URI.for(*self.split(uri), self) end - def join(*uris) # :nodoc: uris[0] = convert_to_uri(uris[0]) uris.inject :merge end + # Compatibility for RFC2396 parser + def extract(str, schemes = nil) # :nodoc: + RFC2396_PARSER.extract(str, schemes) + end + + # Compatibility for RFC2396 parser + def make_regexp(schemes = nil) # :nodoc: + RFC2396_PARSER.make_regexp(schemes) + end + + # Compatibility for RFC2396 parser + def escape(str, unsafe = nil) # :nodoc: + unsafe ? RFC2396_PARSER.escape(str, unsafe) : RFC2396_PARSER.escape(str) + end + + # Compatibility for RFC2396 parser + def unescape(str, escaped = nil) # :nodoc: + escaped ? RFC2396_PARSER.unescape(str, escaped) : RFC2396_PARSER.unescape(str) + end + @@to_s = Kernel.instance_method(:to_s) if @@to_s.respond_to?(:bind_call) def inspect From 0ab9abbf088654f1a71de5302b6282006cfb3942 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Thu, 18 Jul 2024 10:11:29 +0900 Subject: [PATCH 3/7] Switch to inspect with default parser --- test/uri/test_parser.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/uri/test_parser.rb b/test/uri/test_parser.rb index 75c02fe..f400de2 100644 --- a/test/uri/test_parser.rb +++ b/test/uri/test_parser.rb @@ -8,8 +8,8 @@ def uri_to_ary(uri) end def test_inspect - assert_match(/URI::RFC2396_Parser/, URI::Parser.new.inspect) - assert_match(/URI::RFC3986_Parser/, URI::RFC3986_Parser.new.inspect) + assert_match(/URI::RFC2396_Parser/, URI::RFC2396_Parser.new.inspect) + assert_match(/URI::RFC3986_Parser/, URI::Parser.new.inspect) end def test_compare From 2e0f73f05e9ad226356a2dde89f53feb41d59cc9 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Thu, 18 Jul 2024 10:27:25 +0900 Subject: [PATCH 4/7] Rename and switch RFC2396_PARSER test --- test/uri/test_parser.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/test/uri/test_parser.rb b/test/uri/test_parser.rb index f400de2..9105d47 100644 --- a/test/uri/test_parser.rb +++ b/test/uri/test_parser.rb @@ -33,7 +33,9 @@ def test_compare assert(!u2.equal?(u3)) end - def test_parse + def test_parse_rfc2396_parser + URI.parser = URI::RFC2396_PARSER + escaped = URI::REGEXP::PATTERN::ESCAPED hex = URI::REGEXP::PATTERN::HEX p1 = URI::Parser.new(:ESCAPED => "(?:#{escaped}|%u[#{hex}]{4})") @@ -43,6 +45,8 @@ def test_parse u1.path = '/%uDCBA' assert_equal(['http', nil, 'a', URI::HTTP.default_port, '/%uDCBA', nil, nil], uri_to_ary(u1)) + ensure + URI.parser = URI::DEFAULT_PARSER end def test_parse_query_pct_encoded From 984145c407c074d93ab7ca50e12afc2be7333804 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Thu, 18 Jul 2024 11:58:26 +0900 Subject: [PATCH 5/7] URI.extract needs to pass block If given block to URI.extract, it returns nil. --- lib/uri/rfc3986_parser.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/uri/rfc3986_parser.rb b/lib/uri/rfc3986_parser.rb index dbb352f..529ecfa 100644 --- a/lib/uri/rfc3986_parser.rb +++ b/lib/uri/rfc3986_parser.rb @@ -141,8 +141,8 @@ def join(*uris) # :nodoc: end # Compatibility for RFC2396 parser - def extract(str, schemes = nil) # :nodoc: - RFC2396_PARSER.extract(str, schemes) + def extract(str, schemes = nil, &block) # :nodoc: + RFC2396_PARSER.extract(str, schemes, &block) end # Compatibility for RFC2396 parser From 6f616d97fc9ec9e74c21a396206c2eb9ba907552 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Thu, 18 Jul 2024 13:16:20 +0900 Subject: [PATCH 6/7] Added test for constant definition and remove URI::REGEXP when using RFC3986_PARSER --- lib/uri/common.rb | 3 ++- test/uri/test_common.rb | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/lib/uri/common.rb b/lib/uri/common.rb index 1d381e7..034b91c 100644 --- a/lib/uri/common.rb +++ b/lib/uri/common.rb @@ -26,8 +26,8 @@ def self.parser=(parser = RFC3986_PARSER) remove_const(:Parser) if defined?(Parser) const_set("Parser", parser.class) + remove_const(:REGEXP) if defined?(REGEXP) if Parser == RFC2396_Parser - remove_const(:REGEXP) if defined?(REGEXP) const_set("REGEXP", URI::RFC2396_REGEXP) Parser.new.pattern.each_pair do |sym, str| unless REGEXP::PATTERN.const_defined?(sym) @@ -35,6 +35,7 @@ def self.parser=(parser = RFC3986_PARSER) end end end + Parser.new.regexp.each_pair do |sym, str| remove_const(sym) if const_defined?(sym) const_set(sym, str) diff --git a/test/uri/test_common.rb b/test/uri/test_common.rb index 1df19e6..8d0a206 100644 --- a/test/uri/test_common.rb +++ b/test/uri/test_common.rb @@ -10,6 +10,23 @@ def setup def teardown end + def test_parser_switch + assert_equal(URI::Parser, URI::RFC3986_Parser) + refute defined?(::URI::REGEXP) + + URI.parser = URI::RFC2396_PARSER + + assert_equal(URI::Parser, URI::RFC2396_Parser) + assert defined?(URI::REGEXP) + + URI.parser = URI::RFC3986_PARSER + + assert_equal(URI::Parser, URI::RFC3986_Parser) + refute defined?(URI::REGEXP) + ensure + URI.parser = URI::RFC3986_PARSER + end + def test_extract EnvUtil.suppress_warning do assert_equal(['http://example.com'], From 823697edb4eb1d6f43e6864d00e99797888265a6 Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Thu, 18 Jul 2024 13:31:17 +0900 Subject: [PATCH 7/7] Also support URI::PATTERN with switch-back --- lib/uri/common.rb | 2 ++ test/uri/test_common.rb | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/uri/common.rb b/lib/uri/common.rb index 034b91c..b5b6177 100644 --- a/lib/uri/common.rb +++ b/lib/uri/common.rb @@ -27,8 +27,10 @@ def self.parser=(parser = RFC3986_PARSER) const_set("Parser", parser.class) remove_const(:REGEXP) if defined?(REGEXP) + remove_const(:PATTERN) if defined?(PATTERN) if Parser == RFC2396_Parser const_set("REGEXP", URI::RFC2396_REGEXP) + const_set("PATTERN", URI::RFC2396_REGEXP::PATTERN) Parser.new.pattern.each_pair do |sym, str| unless REGEXP::PATTERN.const_defined?(sym) REGEXP::PATTERN.const_set(sym, str) diff --git a/test/uri/test_common.rb b/test/uri/test_common.rb index 8d0a206..aa9c689 100644 --- a/test/uri/test_common.rb +++ b/test/uri/test_common.rb @@ -12,17 +12,21 @@ def teardown def test_parser_switch assert_equal(URI::Parser, URI::RFC3986_Parser) - refute defined?(::URI::REGEXP) + refute defined?(URI::REGEXP) + refute defined?(URI::PATTERN) URI.parser = URI::RFC2396_PARSER assert_equal(URI::Parser, URI::RFC2396_Parser) assert defined?(URI::REGEXP) + assert defined?(URI::PATTERN) + assert defined?(URI::PATTERN::ESCAPED) URI.parser = URI::RFC3986_PARSER assert_equal(URI::Parser, URI::RFC3986_Parser) refute defined?(URI::REGEXP) + refute defined?(URI::PATTERN) ensure URI.parser = URI::RFC3986_PARSER end