@@ -64,38 +64,33 @@ def make_components_hash(klass, array_hash)
6464
6565 include REGEXP
6666
67- SCHEME_LIST_MUTEX = Mutex . new
68- private_constant :SCHEME_LIST_MUTEX
69-
70- # Returns a Hash of the defined schemes.
71- # The list is lazily calculated.
72- def self . scheme_list
73- return const_get ( :SCHEMES ) if defined? ( SCHEMES )
74-
75- SCHEME_LIST_MUTEX . synchronize do
76- const_set ( :SCHEMES , ObjectSpace .
77- each_object ( Class ) .
78- select { |klass | klass < URI ::Generic } .
79- each_with_object ( { } ) { |klass , acc | acc [ klass . name . split ( '::' ) . last . upcase ] = klass } .
80- freeze )
81- end
67+ module Schemes
8268 end
69+ private_constant :Schemes
8370
84- # Re-calculate scheme list
85- def self . refresh_scheme_list
86- SCHEME_LIST_MUTEX . synchronize do
87- remove_const ( :SCHEMES ) if defined? ( SCHEMES )
88- end
71+ def self . register_scheme ( scheme , klass )
72+ Schemes . const_set ( scheme , klass )
73+ end
8974
90- scheme_list
75+ # Returns a Hash of the defined schemes.
76+ def self . scheme_list
77+ Schemes . constants . map { |name |
78+ [ name . to_s . upcase , Schemes . const_get ( name ) ]
79+ } . to_h
9180 end
9281
9382 #
9483 # Construct a URI instance, using the scheme to detect the appropriate class
9584 # from +URI.scheme_list+.
9685 #
9786 def self . for ( scheme , *arguments , default : Generic )
98- uri_class = scheme_list [ scheme . to_s . upcase ] || default
87+ const_name = scheme . to_s . upcase
88+
89+ uri_class = INITIAL_SCHEMES [ const_name ]
90+ if !uri_class && !const_name . empty? && Schemes . const_defined? ( const_name , false )
91+ uri_class = Schemes . const_get ( const_name , false )
92+ end
93+ uri_class ||= default
9994
10095 return uri_class . new ( scheme , *arguments )
10196 end
@@ -671,6 +666,7 @@ def self.decode_www_form(str, enc=Encoding::UTF_8, separator: '&', use__charset_
671666 "utf-16" => "utf-16le" ,
672667 "utf-16le" => "utf-16le" ,
673668 } # :nodoc:
669+ Ractor . make_shareable ( WEB_ENCODINGS_ ) if defined? ( Ractor )
674670
675671 # :nodoc:
676672 # return encoding or nil
0 commit comments