@@ -16,6 +16,7 @@ module URI
16
16
REGEXP = RFC2396_REGEXP
17
17
Parser = RFC2396_Parser
18
18
RFC3986_PARSER = RFC3986_Parser . new
19
+ Ractor . make_shareable ( RFC3986_PARSER ) if defined? ( Ractor )
19
20
20
21
# URI::Parser.new
21
22
DEFAULT_PARSER = Parser . new
@@ -27,6 +28,7 @@ module URI
27
28
DEFAULT_PARSER . regexp . each_pair do |sym , str |
28
29
const_set ( sym , str )
29
30
end
31
+ Ractor . make_shareable ( DEFAULT_PARSER ) if defined? ( Ractor )
30
32
31
33
module Util # :nodoc:
32
34
def make_components_hash ( klass , array_hash )
@@ -62,22 +64,33 @@ def make_components_hash(klass, array_hash)
62
64
63
65
include REGEXP
64
66
65
- @@schemes = { }
67
+ module Schemes
68
+ end
69
+ private_constant :Schemes
70
+
71
+ def self . register_scheme ( scheme , klass )
72
+ Schemes . const_set ( scheme , klass )
73
+ end
74
+
66
75
# Returns a Hash of the defined schemes.
67
76
def self . scheme_list
68
- @@schemes
77
+ Schemes . constants . map { |name |
78
+ [ name . to_s . upcase , Schemes . const_get ( name ) ]
79
+ } . to_h
69
80
end
70
81
71
82
#
72
83
# Construct a URI instance, using the scheme to detect the appropriate class
73
84
# from +URI.scheme_list+.
74
85
#
75
86
def self . for ( scheme , *arguments , default : Generic )
76
- if scheme
77
- uri_class = @@schemes [ scheme . upcase ] || default
78
- else
79
- uri_class = 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 )
80
92
end
93
+ uri_class ||= default
81
94
82
95
return uri_class . new ( scheme , *arguments )
83
96
end
@@ -653,6 +666,7 @@ def self.decode_www_form(str, enc=Encoding::UTF_8, separator: '&', use__charset_
653
666
"utf-16" => "utf-16le" ,
654
667
"utf-16le" => "utf-16le" ,
655
668
} # :nodoc:
669
+ Ractor . make_shareable ( WEB_ENCODINGS_ ) if defined? ( Ractor )
656
670
657
671
# :nodoc:
658
672
# return encoding or nil
0 commit comments