@@ -17,6 +17,8 @@ module URI
1717 Parser = RFC2396_Parser
1818 RFC3986_PARSER = RFC3986_Parser . new
1919
20+ Ractor . make_shareable ( RFC3986_PARSER ) if defined? ( Ractor )
21+
2022 # URI::Parser.new
2123 DEFAULT_PARSER = Parser . new
2224 DEFAULT_PARSER . pattern . each_pair do |sym , str |
@@ -27,6 +29,7 @@ module URI
2729 DEFAULT_PARSER . regexp . each_pair do |sym , str |
2830 const_set ( sym , str )
2931 end
32+ Ractor . make_shareable ( DEFAULT_PARSER ) if defined? ( Ractor )
3033
3134 module Util # :nodoc:
3235 def make_components_hash ( klass , array_hash )
@@ -62,10 +65,26 @@ def make_components_hash(klass, array_hash)
6265
6366 include REGEXP
6467
65- @@schemes = { }
68+ SCHEMES = { } . freeze
69+ private_constant :SCHEMES
70+
6671 # Returns a Hash of the defined schemes.
6772 def self . scheme_list
68- @@schemes
73+ SCHEMES
74+ end
75+
76+ # Registers a new scheme when adding custom URIs.
77+ # Example:
78+ # module URI
79+ # class RSYNC < Generic
80+ # DEFAULT_PORT = 873
81+ # end
82+ # register_scheme('RSYNC', RSYNC)
83+ # end
84+ def self . register_scheme ( name , mod )
85+ updated = SCHEMES . merge ( "#{ name } " => mod ) . freeze
86+ remove_const ( :SCHEMES )
87+ const_set ( :SCHEMES , updated )
6988 end
7089
7190 #
@@ -74,7 +93,7 @@ def self.scheme_list
7493 #
7594 def self . for ( scheme , *arguments , default : Generic )
7695 if scheme
77- uri_class = @@schemes [ scheme . upcase ] || default
96+ uri_class = SCHEMES [ scheme . upcase ] || default
7897 else
7998 uri_class = default
8099 end
0 commit comments