rubygems-update 3.5.5 → 3.5.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (192) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +54 -0
  3. data/Manifest.txt +81 -64
  4. data/bundler/CHANGELOG.md +33 -0
  5. data/bundler/lib/bundler/build_metadata.rb +2 -2
  6. data/bundler/lib/bundler/cli/binstubs.rb +1 -1
  7. data/bundler/lib/bundler/cli/gem.rb +1 -1
  8. data/bundler/lib/bundler/cli/lock.rb +5 -4
  9. data/bundler/lib/bundler/cli/plugin.rb +2 -2
  10. data/bundler/lib/bundler/cli.rb +2 -2
  11. data/bundler/lib/bundler/definition.rb +54 -28
  12. data/bundler/lib/bundler/dsl.rb +16 -1
  13. data/bundler/lib/bundler/environment_preserver.rb +3 -3
  14. data/bundler/lib/bundler/fetcher/downloader.rb +1 -1
  15. data/bundler/lib/bundler/fetcher.rb +2 -2
  16. data/bundler/lib/bundler/injector.rb +1 -1
  17. data/bundler/lib/bundler/installer.rb +2 -2
  18. data/bundler/lib/bundler/man/bundle-add.1 +1 -1
  19. data/bundler/lib/bundler/man/bundle-binstubs.1 +1 -1
  20. data/bundler/lib/bundler/man/bundle-cache.1 +1 -1
  21. data/bundler/lib/bundler/man/bundle-check.1 +1 -1
  22. data/bundler/lib/bundler/man/bundle-clean.1 +1 -1
  23. data/bundler/lib/bundler/man/bundle-config.1 +1 -1
  24. data/bundler/lib/bundler/man/bundle-console.1 +1 -1
  25. data/bundler/lib/bundler/man/bundle-doctor.1 +1 -1
  26. data/bundler/lib/bundler/man/bundle-exec.1 +1 -1
  27. data/bundler/lib/bundler/man/bundle-gem.1 +1 -1
  28. data/bundler/lib/bundler/man/bundle-help.1 +1 -1
  29. data/bundler/lib/bundler/man/bundle-info.1 +1 -1
  30. data/bundler/lib/bundler/man/bundle-init.1 +1 -1
  31. data/bundler/lib/bundler/man/bundle-inject.1 +1 -1
  32. data/bundler/lib/bundler/man/bundle-install.1 +3 -3
  33. data/bundler/lib/bundler/man/bundle-install.1.ronn +2 -2
  34. data/bundler/lib/bundler/man/bundle-list.1 +1 -1
  35. data/bundler/lib/bundler/man/bundle-lock.1 +1 -1
  36. data/bundler/lib/bundler/man/bundle-open.1 +1 -1
  37. data/bundler/lib/bundler/man/bundle-outdated.1 +1 -1
  38. data/bundler/lib/bundler/man/bundle-platform.1 +1 -1
  39. data/bundler/lib/bundler/man/bundle-plugin.1 +4 -4
  40. data/bundler/lib/bundler/man/bundle-plugin.1.ronn +3 -3
  41. data/bundler/lib/bundler/man/bundle-pristine.1 +1 -1
  42. data/bundler/lib/bundler/man/bundle-remove.1 +1 -1
  43. data/bundler/lib/bundler/man/bundle-show.1 +1 -1
  44. data/bundler/lib/bundler/man/bundle-update.1 +1 -1
  45. data/bundler/lib/bundler/man/bundle-version.1 +1 -1
  46. data/bundler/lib/bundler/man/bundle-viz.1 +1 -1
  47. data/bundler/lib/bundler/man/bundle.1 +1 -1
  48. data/bundler/lib/bundler/man/gemfile.5 +3 -3
  49. data/bundler/lib/bundler/man/gemfile.5.ronn +2 -2
  50. data/bundler/lib/bundler/mirror.rb +3 -3
  51. data/bundler/lib/bundler/plugin/api/source.rb +2 -2
  52. data/bundler/lib/bundler/plugin/installer.rb +5 -9
  53. data/bundler/lib/bundler/runtime.rb +1 -1
  54. data/bundler/lib/bundler/settings.rb +14 -11
  55. data/bundler/lib/bundler/source/git/git_proxy.rb +1 -1
  56. data/bundler/lib/bundler/source/git.rb +1 -1
  57. data/bundler/lib/bundler/source/rubygems/remote.rb +1 -1
  58. data/bundler/lib/bundler/source/rubygems.rb +2 -2
  59. data/bundler/lib/bundler/spec_set.rb +1 -1
  60. data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +4 -3
  61. data/bundler/lib/bundler/templates/newgem/rubocop.yml.tt +0 -5
  62. data/bundler/lib/bundler/uri_credentials_filter.rb +2 -2
  63. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +22 -22
  64. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb +1 -0
  65. data/bundler/lib/bundler/vendored_net_http.rb +7 -3
  66. data/bundler/lib/bundler/vendored_timeout.rb +7 -3
  67. data/bundler/lib/bundler/vendored_uri.rb +18 -1
  68. data/bundler/lib/bundler/version.rb +1 -1
  69. data/bundler/lib/bundler/yaml_serializer.rb +12 -0
  70. data/bundler/lib/bundler.rb +3 -2
  71. data/lib/rubygems/command.rb +1 -1
  72. data/lib/rubygems/command_manager.rb +1 -1
  73. data/lib/rubygems/commands/help_command.rb +2 -2
  74. data/lib/rubygems/commands/rdoc_command.rb +1 -8
  75. data/lib/rubygems/commands/sources_command.rb +2 -2
  76. data/lib/rubygems/defaults.rb +4 -4
  77. data/lib/rubygems/dependency.rb +2 -2
  78. data/lib/rubygems/dependency_list.rb +1 -1
  79. data/lib/rubygems/ext/cargo_builder.rb +1 -1
  80. data/lib/rubygems/gemcutter_utilities/webauthn_listener.rb +1 -1
  81. data/lib/rubygems/gemcutter_utilities.rb +40 -23
  82. data/lib/rubygems/local_remote_options.rb +6 -6
  83. data/lib/rubygems/remote_fetcher.rb +3 -3
  84. data/lib/rubygems/request.rb +5 -5
  85. data/lib/rubygems/request_set.rb +1 -1
  86. data/lib/rubygems/requirement.rb +5 -0
  87. data/lib/rubygems/resolver/api_set.rb +1 -1
  88. data/lib/rubygems/resolver/best_set.rb +1 -1
  89. data/lib/rubygems/resolver.rb +5 -5
  90. data/lib/rubygems/s3_uri_signer.rb +3 -3
  91. data/lib/rubygems/safe_yaml.rb +10 -1
  92. data/lib/rubygems/security.rb +1 -1
  93. data/lib/rubygems/source/git.rb +2 -2
  94. data/lib/rubygems/source_list.rb +1 -1
  95. data/lib/rubygems/specification.rb +6 -6
  96. data/lib/rubygems/specification_policy.rb +15 -7
  97. data/lib/rubygems/uri.rb +6 -6
  98. data/lib/rubygems/util/licenses.rb +43 -0
  99. data/lib/rubygems/util.rb +1 -1
  100. data/lib/rubygems/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +57 -0
  101. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/delegates/specification_provider.rb +11 -11
  102. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/action.rb +1 -1
  103. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +1 -1
  104. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +1 -1
  105. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +1 -1
  106. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +1 -1
  107. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/log.rb +1 -1
  108. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/set_payload.rb +1 -1
  109. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/tag.rb +1 -1
  110. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph/vertex.rb +1 -1
  111. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/dependency_graph.rb +2 -2
  112. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/errors.rb +1 -1
  113. data/lib/rubygems/vendor/molinillo/lib/molinillo/gem_metadata.rb +6 -0
  114. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/modules/specification_provider.rb +2 -2
  115. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/modules/ui.rb +1 -1
  116. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/resolution.rb +3 -3
  117. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/resolver.rb +1 -1
  118. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo/state.rb +1 -1
  119. data/lib/rubygems/{resolver → vendor}/molinillo/lib/molinillo.rb +2 -2
  120. data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/generic_request.rb +9 -9
  121. data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/header.rb +2 -2
  122. data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/request.rb +3 -3
  123. data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/requests.rb +30 -30
  124. data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/response.rb +2 -2
  125. data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/responses.rb +6 -6
  126. data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/status.rb +1 -1
  127. data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http.rb +15 -15
  128. data/lib/rubygems/{net-http → vendor/net-http}/lib/net/https.rb +1 -1
  129. data/lib/rubygems/vendor/optparse/lib/optparse/uri.rb +7 -0
  130. data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse.rb +11 -11
  131. data/lib/rubygems/{timeout → vendor/timeout}/lib/timeout.rb +1 -1
  132. data/lib/rubygems/{tsort → vendor/tsort}/lib/tsort.rb +2 -2
  133. data/lib/rubygems/vendor/uri/.document +1 -0
  134. data/lib/rubygems/vendor/uri/LICENSE.txt +22 -0
  135. data/lib/rubygems/vendor/uri/lib/uri/common.rb +853 -0
  136. data/lib/rubygems/vendor/uri/lib/uri/file.rb +100 -0
  137. data/lib/rubygems/vendor/uri/lib/uri/ftp.rb +267 -0
  138. data/lib/rubygems/vendor/uri/lib/uri/generic.rb +1588 -0
  139. data/lib/rubygems/vendor/uri/lib/uri/http.rb +125 -0
  140. data/lib/rubygems/vendor/uri/lib/uri/https.rb +23 -0
  141. data/lib/rubygems/vendor/uri/lib/uri/ldap.rb +261 -0
  142. data/lib/rubygems/vendor/uri/lib/uri/ldaps.rb +22 -0
  143. data/lib/rubygems/vendor/uri/lib/uri/mailto.rb +293 -0
  144. data/lib/rubygems/vendor/uri/lib/uri/rfc2396_parser.rb +539 -0
  145. data/lib/rubygems/vendor/uri/lib/uri/rfc3986_parser.rb +183 -0
  146. data/lib/rubygems/vendor/uri/lib/uri/version.rb +6 -0
  147. data/lib/rubygems/vendor/uri/lib/uri/ws.rb +83 -0
  148. data/lib/rubygems/vendor/uri/lib/uri/wss.rb +23 -0
  149. data/lib/rubygems/vendor/uri/lib/uri.rb +104 -0
  150. data/lib/rubygems/vendored_molinillo.rb +3 -0
  151. data/lib/rubygems/vendored_net_http.rb +5 -0
  152. data/lib/rubygems/vendored_optparse.rb +3 -0
  153. data/lib/rubygems/vendored_timeout.rb +5 -0
  154. data/lib/rubygems/vendored_tsort.rb +3 -0
  155. data/lib/rubygems/yaml_serializer.rb +12 -0
  156. data/lib/rubygems.rb +2 -2
  157. data/rubygems-update.gemspec +7 -2
  158. metadata +87 -67
  159. data/lib/rubygems/net/http.rb +0 -3
  160. data/lib/rubygems/optparse/lib/optparse/uri.rb +0 -7
  161. data/lib/rubygems/optparse.rb +0 -3
  162. data/lib/rubygems/resolver/molinillo/lib/molinillo/delegates/resolution_state.rb +0 -57
  163. data/lib/rubygems/resolver/molinillo/lib/molinillo/gem_metadata.rb +0 -6
  164. data/lib/rubygems/resolver/molinillo.rb +0 -3
  165. data/lib/rubygems/timeout.rb +0 -3
  166. data/lib/rubygems/tsort.rb +0 -3
  167. /data/lib/rubygems/{net-http → vendor/molinillo}/.document +0 -0
  168. /data/lib/rubygems/{resolver → vendor}/molinillo/LICENSE +0 -0
  169. /data/lib/rubygems/{net-protocol → vendor/net-http}/.document +0 -0
  170. /data/lib/rubygems/{net-http → vendor/net-http}/LICENSE.txt +0 -0
  171. /data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/backward.rb +0 -0
  172. /data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/exceptions.rb +0 -0
  173. /data/lib/rubygems/{net-http → vendor/net-http}/lib/net/http/proxy_delta.rb +0 -0
  174. /data/lib/rubygems/{optparse → vendor/net-protocol}/.document +0 -0
  175. /data/lib/rubygems/{net-protocol → vendor/net-protocol}/LICENSE.txt +0 -0
  176. /data/lib/rubygems/{net-protocol → vendor/net-protocol}/lib/net/protocol.rb +0 -0
  177. /data/lib/rubygems/{resolv → vendor/optparse}/.document +0 -0
  178. /data/lib/rubygems/{optparse → vendor/optparse}/COPYING +0 -0
  179. /data/lib/rubygems/{optparse → vendor/optparse}/lib/optionparser.rb +0 -0
  180. /data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/ac.rb +0 -0
  181. /data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/date.rb +0 -0
  182. /data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/kwargs.rb +0 -0
  183. /data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/shellwords.rb +0 -0
  184. /data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/time.rb +0 -0
  185. /data/lib/rubygems/{optparse → vendor/optparse}/lib/optparse/version.rb +0 -0
  186. /data/lib/rubygems/{resolver/molinillo → vendor/resolv}/.document +0 -0
  187. /data/lib/rubygems/{resolv → vendor/resolv}/LICENSE.txt +0 -0
  188. /data/lib/rubygems/{resolv → vendor/resolv}/lib/resolv.rb +0 -0
  189. /data/lib/rubygems/{timeout → vendor/timeout}/.document +0 -0
  190. /data/lib/rubygems/{timeout → vendor/timeout}/LICENSE.txt +0 -0
  191. /data/lib/rubygems/{tsort → vendor/tsort}/.document +0 -0
  192. /data/lib/rubygems/{tsort → vendor/tsort}/LICENSE.txt +0 -0
@@ -0,0 +1,853 @@
1
+ # frozen_string_literal: true
2
+ #--
3
+ # = uri/common.rb
4
+ #
5
+ # Author:: Akira Yamada <akira@ruby-lang.org>
6
+ # License::
7
+ # You can redistribute it and/or modify it under the same term as Ruby.
8
+ #
9
+ # See Gem::URI for general documentation
10
+ #
11
+
12
+ require_relative "rfc2396_parser"
13
+ require_relative "rfc3986_parser"
14
+
15
+ module Gem::URI
16
+ include RFC2396_REGEXP
17
+
18
+ REGEXP = RFC2396_REGEXP
19
+ Parser = RFC2396_Parser
20
+ RFC3986_PARSER = RFC3986_Parser.new
21
+ Ractor.make_shareable(RFC3986_PARSER) if defined?(Ractor)
22
+
23
+ # Gem::URI::Parser.new
24
+ DEFAULT_PARSER = Parser.new
25
+ DEFAULT_PARSER.pattern.each_pair do |sym, str|
26
+ unless REGEXP::PATTERN.const_defined?(sym)
27
+ REGEXP::PATTERN.const_set(sym, str)
28
+ end
29
+ end
30
+ DEFAULT_PARSER.regexp.each_pair do |sym, str|
31
+ const_set(sym, str)
32
+ end
33
+ Ractor.make_shareable(DEFAULT_PARSER) if defined?(Ractor)
34
+
35
+ module Util # :nodoc:
36
+ def make_components_hash(klass, array_hash)
37
+ tmp = {}
38
+ if array_hash.kind_of?(Array) &&
39
+ array_hash.size == klass.component.size - 1
40
+ klass.component[1..-1].each_index do |i|
41
+ begin
42
+ tmp[klass.component[i + 1]] = array_hash[i].clone
43
+ rescue TypeError
44
+ tmp[klass.component[i + 1]] = array_hash[i]
45
+ end
46
+ end
47
+
48
+ elsif array_hash.kind_of?(Hash)
49
+ array_hash.each do |key, value|
50
+ begin
51
+ tmp[key] = value.clone
52
+ rescue TypeError
53
+ tmp[key] = value
54
+ end
55
+ end
56
+ else
57
+ raise ArgumentError,
58
+ "expected Array of or Hash of components of #{klass} (#{klass.component[1..-1].join(', ')})"
59
+ end
60
+ tmp[:scheme] = klass.to_s.sub(/\A.*::/, '').downcase
61
+
62
+ return tmp
63
+ end
64
+ module_function :make_components_hash
65
+ end
66
+
67
+ module Schemes
68
+ end
69
+ private_constant :Schemes
70
+
71
+ # Registers the given +klass+ as the class to be instantiated
72
+ # when parsing a \Gem::URI with the given +scheme+:
73
+ #
74
+ # Gem::URI.register_scheme('MS_SEARCH', Gem::URI::Generic) # => Gem::URI::Generic
75
+ # Gem::URI.scheme_list['MS_SEARCH'] # => Gem::URI::Generic
76
+ #
77
+ # Note that after calling String#upcase on +scheme+, it must be a valid
78
+ # constant name.
79
+ def self.register_scheme(scheme, klass)
80
+ Schemes.const_set(scheme.to_s.upcase, klass)
81
+ end
82
+
83
+ # Returns a hash of the defined schemes:
84
+ #
85
+ # Gem::URI.scheme_list
86
+ # # =>
87
+ # {"MAILTO"=>Gem::URI::MailTo,
88
+ # "LDAPS"=>Gem::URI::LDAPS,
89
+ # "WS"=>Gem::URI::WS,
90
+ # "HTTP"=>Gem::URI::HTTP,
91
+ # "HTTPS"=>Gem::URI::HTTPS,
92
+ # "LDAP"=>Gem::URI::LDAP,
93
+ # "FILE"=>Gem::URI::File,
94
+ # "FTP"=>Gem::URI::FTP}
95
+ #
96
+ # Related: Gem::URI.register_scheme.
97
+ def self.scheme_list
98
+ Schemes.constants.map { |name|
99
+ [name.to_s.upcase, Schemes.const_get(name)]
100
+ }.to_h
101
+ end
102
+
103
+ INITIAL_SCHEMES = scheme_list
104
+ private_constant :INITIAL_SCHEMES
105
+ Ractor.make_shareable(INITIAL_SCHEMES) if defined?(Ractor)
106
+
107
+ # Returns a new object constructed from the given +scheme+, +arguments+,
108
+ # and +default+:
109
+ #
110
+ # - The new object is an instance of <tt>Gem::URI.scheme_list[scheme.upcase]</tt>.
111
+ # - The object is initialized by calling the class initializer
112
+ # using +scheme+ and +arguments+.
113
+ # See Gem::URI::Generic.new.
114
+ #
115
+ # Examples:
116
+ #
117
+ # values = ['john.doe', 'www.example.com', '123', nil, '/forum/questions/', nil, 'tag=networking&order=newest', 'top']
118
+ # Gem::URI.for('https', *values)
119
+ # # => #<Gem::URI::HTTPS https://john.doe@www.example.com:123/forum/questions/?tag=networking&order=newest#top>
120
+ # Gem::URI.for('foo', *values, default: Gem::URI::HTTP)
121
+ # # => #<Gem::URI::HTTP foo://john.doe@www.example.com:123/forum/questions/?tag=networking&order=newest#top>
122
+ #
123
+ def self.for(scheme, *arguments, default: Generic)
124
+ const_name = scheme.to_s.upcase
125
+
126
+ uri_class = INITIAL_SCHEMES[const_name]
127
+ uri_class ||= if /\A[A-Z]\w*\z/.match?(const_name) && Schemes.const_defined?(const_name, false)
128
+ Schemes.const_get(const_name, false)
129
+ end
130
+ uri_class ||= default
131
+
132
+ return uri_class.new(scheme, *arguments)
133
+ end
134
+
135
+ #
136
+ # Base class for all Gem::URI exceptions.
137
+ #
138
+ class Error < StandardError; end
139
+ #
140
+ # Not a Gem::URI.
141
+ #
142
+ class InvalidURIError < Error; end
143
+ #
144
+ # Not a Gem::URI component.
145
+ #
146
+ class InvalidComponentError < Error; end
147
+ #
148
+ # Gem::URI is valid, bad usage is not.
149
+ #
150
+ class BadURIError < Error; end
151
+
152
+ # Returns a 9-element array representing the parts of the \Gem::URI
153
+ # formed from the string +uri+;
154
+ # each array element is a string or +nil+:
155
+ #
156
+ # names = %w[scheme userinfo host port registry path opaque query fragment]
157
+ # values = Gem::URI.split('https://john.doe@www.example.com:123/forum/questions/?tag=networking&order=newest#top')
158
+ # names.zip(values)
159
+ # # =>
160
+ # [["scheme", "https"],
161
+ # ["userinfo", "john.doe"],
162
+ # ["host", "www.example.com"],
163
+ # ["port", "123"],
164
+ # ["registry", nil],
165
+ # ["path", "/forum/questions/"],
166
+ # ["opaque", nil],
167
+ # ["query", "tag=networking&order=newest"],
168
+ # ["fragment", "top"]]
169
+ #
170
+ def self.split(uri)
171
+ RFC3986_PARSER.split(uri)
172
+ end
173
+
174
+ # Returns a new \Gem::URI object constructed from the given string +uri+:
175
+ #
176
+ # Gem::URI.parse('https://john.doe@www.example.com:123/forum/questions/?tag=networking&order=newest#top')
177
+ # # => #<Gem::URI::HTTPS https://john.doe@www.example.com:123/forum/questions/?tag=networking&order=newest#top>
178
+ # Gem::URI.parse('http://john.doe@www.example.com:123/forum/questions/?tag=networking&order=newest#top')
179
+ # # => #<Gem::URI::HTTP http://john.doe@www.example.com:123/forum/questions/?tag=networking&order=newest#top>
180
+ #
181
+ # It's recommended to first ::escape string +uri+
182
+ # if it may contain invalid Gem::URI characters.
183
+ #
184
+ def self.parse(uri)
185
+ RFC3986_PARSER.parse(uri)
186
+ end
187
+
188
+ # Merges the given Gem::URI strings +str+
189
+ # per {RFC 2396}[https://www.rfc-editor.org/rfc/rfc2396.html].
190
+ #
191
+ # Each string in +str+ is converted to an
192
+ # {RFC3986 Gem::URI}[https://www.rfc-editor.org/rfc/rfc3986.html] before being merged.
193
+ #
194
+ # Examples:
195
+ #
196
+ # Gem::URI.join("http://example.com/","main.rbx")
197
+ # # => #<Gem::URI::HTTP http://example.com/main.rbx>
198
+ #
199
+ # Gem::URI.join('http://example.com', 'foo')
200
+ # # => #<Gem::URI::HTTP http://example.com/foo>
201
+ #
202
+ # Gem::URI.join('http://example.com', '/foo', '/bar')
203
+ # # => #<Gem::URI::HTTP http://example.com/bar>
204
+ #
205
+ # Gem::URI.join('http://example.com', '/foo', 'bar')
206
+ # # => #<Gem::URI::HTTP http://example.com/bar>
207
+ #
208
+ # Gem::URI.join('http://example.com', '/foo/', 'bar')
209
+ # # => #<Gem::URI::HTTP http://example.com/foo/bar>
210
+ #
211
+ def self.join(*str)
212
+ RFC3986_PARSER.join(*str)
213
+ end
214
+
215
+ #
216
+ # == Synopsis
217
+ #
218
+ # Gem::URI::extract(str[, schemes][,&blk])
219
+ #
220
+ # == Args
221
+ #
222
+ # +str+::
223
+ # String to extract URIs from.
224
+ # +schemes+::
225
+ # Limit Gem::URI matching to specific schemes.
226
+ #
227
+ # == Description
228
+ #
229
+ # Extracts URIs from a string. If block given, iterates through all matched URIs.
230
+ # Returns nil if block given or array with matches.
231
+ #
232
+ # == Usage
233
+ #
234
+ # require "rubygems/vendor/uri/lib/uri"
235
+ #
236
+ # Gem::URI.extract("text here http://foo.example.org/bla and here mailto:test@example.com and here also.")
237
+ # # => ["http://foo.example.com/bla", "mailto:test@example.com"]
238
+ #
239
+ def self.extract(str, schemes = nil, &block) # :nodoc:
240
+ warn "Gem::URI.extract is obsolete", uplevel: 1 if $VERBOSE
241
+ DEFAULT_PARSER.extract(str, schemes, &block)
242
+ end
243
+
244
+ #
245
+ # == Synopsis
246
+ #
247
+ # Gem::URI::regexp([match_schemes])
248
+ #
249
+ # == Args
250
+ #
251
+ # +match_schemes+::
252
+ # Array of schemes. If given, resulting regexp matches to URIs
253
+ # whose scheme is one of the match_schemes.
254
+ #
255
+ # == Description
256
+ #
257
+ # Returns a Regexp object which matches to Gem::URI-like strings.
258
+ # The Regexp object returned by this method includes arbitrary
259
+ # number of capture group (parentheses). Never rely on its number.
260
+ #
261
+ # == Usage
262
+ #
263
+ # require 'rubygems/vendor/uri/lib/uri'
264
+ #
265
+ # # extract first Gem::URI from html_string
266
+ # html_string.slice(Gem::URI.regexp)
267
+ #
268
+ # # remove ftp URIs
269
+ # html_string.sub(Gem::URI.regexp(['ftp']), '')
270
+ #
271
+ # # You should not rely on the number of parentheses
272
+ # html_string.scan(Gem::URI.regexp) do |*matches|
273
+ # p $&
274
+ # end
275
+ #
276
+ def self.regexp(schemes = nil)# :nodoc:
277
+ warn "Gem::URI.regexp is obsolete", uplevel: 1 if $VERBOSE
278
+ DEFAULT_PARSER.make_regexp(schemes)
279
+ end
280
+
281
+ TBLENCWWWCOMP_ = {} # :nodoc:
282
+ 256.times do |i|
283
+ TBLENCWWWCOMP_[-i.chr] = -('%%%02X' % i)
284
+ end
285
+ TBLENCURICOMP_ = TBLENCWWWCOMP_.dup.freeze
286
+ TBLENCWWWCOMP_[' '] = '+'
287
+ TBLENCWWWCOMP_.freeze
288
+ TBLDECWWWCOMP_ = {} # :nodoc:
289
+ 256.times do |i|
290
+ h, l = i>>4, i&15
291
+ TBLDECWWWCOMP_[-('%%%X%X' % [h, l])] = -i.chr
292
+ TBLDECWWWCOMP_[-('%%%x%X' % [h, l])] = -i.chr
293
+ TBLDECWWWCOMP_[-('%%%X%x' % [h, l])] = -i.chr
294
+ TBLDECWWWCOMP_[-('%%%x%x' % [h, l])] = -i.chr
295
+ end
296
+ TBLDECWWWCOMP_['+'] = ' '
297
+ TBLDECWWWCOMP_.freeze
298
+
299
+ # Returns a URL-encoded string derived from the given string +str+.
300
+ #
301
+ # The returned string:
302
+ #
303
+ # - Preserves:
304
+ #
305
+ # - Characters <tt>'*'</tt>, <tt>'.'</tt>, <tt>'-'</tt>, and <tt>'_'</tt>.
306
+ # - Character in ranges <tt>'a'..'z'</tt>, <tt>'A'..'Z'</tt>,
307
+ # and <tt>'0'..'9'</tt>.
308
+ #
309
+ # Example:
310
+ #
311
+ # Gem::URI.encode_www_form_component('*.-_azAZ09')
312
+ # # => "*.-_azAZ09"
313
+ #
314
+ # - Converts:
315
+ #
316
+ # - Character <tt>' '</tt> to character <tt>'+'</tt>.
317
+ # - Any other character to "percent notation";
318
+ # the percent notation for character <i>c</i> is <tt>'%%%X' % c.ord</tt>.
319
+ #
320
+ # Example:
321
+ #
322
+ # Gem::URI.encode_www_form_component('Here are some punctuation characters: ,;?:')
323
+ # # => "Here+are+some+punctuation+characters%3A+%2C%3B%3F%3A"
324
+ #
325
+ # Encoding:
326
+ #
327
+ # - If +str+ has encoding Encoding::ASCII_8BIT, argument +enc+ is ignored.
328
+ # - Otherwise +str+ is converted first to Encoding::UTF_8
329
+ # (with suitable character replacements),
330
+ # and then to encoding +enc+.
331
+ #
332
+ # In either case, the returned string has forced encoding Encoding::US_ASCII.
333
+ #
334
+ # Related: Gem::URI.encode_uri_component (encodes <tt>' '</tt> as <tt>'%20'</tt>).
335
+ def self.encode_www_form_component(str, enc=nil)
336
+ _encode_uri_component(/[^*\-.0-9A-Z_a-z]/, TBLENCWWWCOMP_, str, enc)
337
+ end
338
+
339
+ # Returns a string decoded from the given \URL-encoded string +str+.
340
+ #
341
+ # The given string is first encoded as Encoding::ASCII-8BIT (using String#b),
342
+ # then decoded (as below), and finally force-encoded to the given encoding +enc+.
343
+ #
344
+ # The returned string:
345
+ #
346
+ # - Preserves:
347
+ #
348
+ # - Characters <tt>'*'</tt>, <tt>'.'</tt>, <tt>'-'</tt>, and <tt>'_'</tt>.
349
+ # - Character in ranges <tt>'a'..'z'</tt>, <tt>'A'..'Z'</tt>,
350
+ # and <tt>'0'..'9'</tt>.
351
+ #
352
+ # Example:
353
+ #
354
+ # Gem::URI.decode_www_form_component('*.-_azAZ09')
355
+ # # => "*.-_azAZ09"
356
+ #
357
+ # - Converts:
358
+ #
359
+ # - Character <tt>'+'</tt> to character <tt>' '</tt>.
360
+ # - Each "percent notation" to an ASCII character.
361
+ #
362
+ # Example:
363
+ #
364
+ # Gem::URI.decode_www_form_component('Here+are+some+punctuation+characters%3A+%2C%3B%3F%3A')
365
+ # # => "Here are some punctuation characters: ,;?:"
366
+ #
367
+ # Related: Gem::URI.decode_uri_component (preserves <tt>'+'</tt>).
368
+ def self.decode_www_form_component(str, enc=Encoding::UTF_8)
369
+ _decode_uri_component(/\+|%\h\h/, str, enc)
370
+ end
371
+
372
+ # Like Gem::URI.encode_www_form_component, except that <tt>' '</tt> (space)
373
+ # is encoded as <tt>'%20'</tt> (instead of <tt>'+'</tt>).
374
+ def self.encode_uri_component(str, enc=nil)
375
+ _encode_uri_component(/[^*\-.0-9A-Z_a-z]/, TBLENCURICOMP_, str, enc)
376
+ end
377
+
378
+ # Like Gem::URI.decode_www_form_component, except that <tt>'+'</tt> is preserved.
379
+ def self.decode_uri_component(str, enc=Encoding::UTF_8)
380
+ _decode_uri_component(/%\h\h/, str, enc)
381
+ end
382
+
383
+ def self._encode_uri_component(regexp, table, str, enc)
384
+ str = str.to_s.dup
385
+ if str.encoding != Encoding::ASCII_8BIT
386
+ if enc && enc != Encoding::ASCII_8BIT
387
+ str.encode!(Encoding::UTF_8, invalid: :replace, undef: :replace)
388
+ str.encode!(enc, fallback: ->(x){"&##{x.ord};"})
389
+ end
390
+ str.force_encoding(Encoding::ASCII_8BIT)
391
+ end
392
+ str.gsub!(regexp, table)
393
+ str.force_encoding(Encoding::US_ASCII)
394
+ end
395
+ private_class_method :_encode_uri_component
396
+
397
+ def self._decode_uri_component(regexp, str, enc)
398
+ raise ArgumentError, "invalid %-encoding (#{str})" if /%(?!\h\h)/.match?(str)
399
+ str.b.gsub(regexp, TBLDECWWWCOMP_).force_encoding(enc)
400
+ end
401
+ private_class_method :_decode_uri_component
402
+
403
+ # Returns a URL-encoded string derived from the given
404
+ # {Enumerable}[https://docs.ruby-lang.org/en/master/Enumerable.html#module-Enumerable-label-Enumerable+in+Ruby+Classes]
405
+ # +enum+.
406
+ #
407
+ # The result is suitable for use as form data
408
+ # for an \HTTP request whose <tt>Content-Type</tt> is
409
+ # <tt>'application/x-www-form-urlencoded'</tt>.
410
+ #
411
+ # The returned string consists of the elements of +enum+,
412
+ # each converted to one or more URL-encoded strings,
413
+ # and all joined with character <tt>'&'</tt>.
414
+ #
415
+ # Simple examples:
416
+ #
417
+ # Gem::URI.encode_www_form([['foo', 0], ['bar', 1], ['baz', 2]])
418
+ # # => "foo=0&bar=1&baz=2"
419
+ # Gem::URI.encode_www_form({foo: 0, bar: 1, baz: 2})
420
+ # # => "foo=0&bar=1&baz=2"
421
+ #
422
+ # The returned string is formed using method Gem::URI.encode_www_form_component,
423
+ # which converts certain characters:
424
+ #
425
+ # Gem::URI.encode_www_form('f#o': '/', 'b-r': '$', 'b z': '@')
426
+ # # => "f%23o=%2F&b-r=%24&b+z=%40"
427
+ #
428
+ # When +enum+ is Array-like, each element +ele+ is converted to a field:
429
+ #
430
+ # - If +ele+ is an array of two or more elements,
431
+ # the field is formed from its first two elements
432
+ # (and any additional elements are ignored):
433
+ #
434
+ # name = Gem::URI.encode_www_form_component(ele[0], enc)
435
+ # value = Gem::URI.encode_www_form_component(ele[1], enc)
436
+ # "#{name}=#{value}"
437
+ #
438
+ # Examples:
439
+ #
440
+ # Gem::URI.encode_www_form([%w[foo bar], %w[baz bat bah]])
441
+ # # => "foo=bar&baz=bat"
442
+ # Gem::URI.encode_www_form([['foo', 0], ['bar', :baz, 'bat']])
443
+ # # => "foo=0&bar=baz"
444
+ #
445
+ # - If +ele+ is an array of one element,
446
+ # the field is formed from <tt>ele[0]</tt>:
447
+ #
448
+ # Gem::URI.encode_www_form_component(ele[0])
449
+ #
450
+ # Example:
451
+ #
452
+ # Gem::URI.encode_www_form([['foo'], [:bar], [0]])
453
+ # # => "foo&bar&0"
454
+ #
455
+ # - Otherwise the field is formed from +ele+:
456
+ #
457
+ # Gem::URI.encode_www_form_component(ele)
458
+ #
459
+ # Example:
460
+ #
461
+ # Gem::URI.encode_www_form(['foo', :bar, 0])
462
+ # # => "foo&bar&0"
463
+ #
464
+ # The elements of an Array-like +enum+ may be mixture:
465
+ #
466
+ # Gem::URI.encode_www_form([['foo', 0], ['bar', 1, 2], ['baz'], :bat])
467
+ # # => "foo=0&bar=1&baz&bat"
468
+ #
469
+ # When +enum+ is Hash-like,
470
+ # each +key+/+value+ pair is converted to one or more fields:
471
+ #
472
+ # - If +value+ is
473
+ # {Array-convertible}[https://docs.ruby-lang.org/en/master/implicit_conversion_rdoc.html#label-Array-Convertible+Objects],
474
+ # each element +ele+ in +value+ is paired with +key+ to form a field:
475
+ #
476
+ # name = Gem::URI.encode_www_form_component(key, enc)
477
+ # value = Gem::URI.encode_www_form_component(ele, enc)
478
+ # "#{name}=#{value}"
479
+ #
480
+ # Example:
481
+ #
482
+ # Gem::URI.encode_www_form({foo: [:bar, 1], baz: [:bat, :bam, 2]})
483
+ # # => "foo=bar&foo=1&baz=bat&baz=bam&baz=2"
484
+ #
485
+ # - Otherwise, +key+ and +value+ are paired to form a field:
486
+ #
487
+ # name = Gem::URI.encode_www_form_component(key, enc)
488
+ # value = Gem::URI.encode_www_form_component(value, enc)
489
+ # "#{name}=#{value}"
490
+ #
491
+ # Example:
492
+ #
493
+ # Gem::URI.encode_www_form({foo: 0, bar: 1, baz: 2})
494
+ # # => "foo=0&bar=1&baz=2"
495
+ #
496
+ # The elements of a Hash-like +enum+ may be mixture:
497
+ #
498
+ # Gem::URI.encode_www_form({foo: [0, 1], bar: 2})
499
+ # # => "foo=0&foo=1&bar=2"
500
+ #
501
+ def self.encode_www_form(enum, enc=nil)
502
+ enum.map do |k,v|
503
+ if v.nil?
504
+ encode_www_form_component(k, enc)
505
+ elsif v.respond_to?(:to_ary)
506
+ v.to_ary.map do |w|
507
+ str = encode_www_form_component(k, enc)
508
+ unless w.nil?
509
+ str << '='
510
+ str << encode_www_form_component(w, enc)
511
+ end
512
+ end.join('&')
513
+ else
514
+ str = encode_www_form_component(k, enc)
515
+ str << '='
516
+ str << encode_www_form_component(v, enc)
517
+ end
518
+ end.join('&')
519
+ end
520
+
521
+ # Returns name/value pairs derived from the given string +str+,
522
+ # which must be an ASCII string.
523
+ #
524
+ # The method may be used to decode the body of Net::HTTPResponse object +res+
525
+ # for which <tt>res['Content-Type']</tt> is <tt>'application/x-www-form-urlencoded'</tt>.
526
+ #
527
+ # The returned data is an array of 2-element subarrays;
528
+ # each subarray is a name/value pair (both are strings).
529
+ # Each returned string has encoding +enc+,
530
+ # and has had invalid characters removed via
531
+ # {String#scrub}[https://docs.ruby-lang.org/en/master/String.html#method-i-scrub].
532
+ #
533
+ # A simple example:
534
+ #
535
+ # Gem::URI.decode_www_form('foo=0&bar=1&baz')
536
+ # # => [["foo", "0"], ["bar", "1"], ["baz", ""]]
537
+ #
538
+ # The returned strings have certain conversions,
539
+ # similar to those performed in Gem::URI.decode_www_form_component:
540
+ #
541
+ # Gem::URI.decode_www_form('f%23o=%2F&b-r=%24&b+z=%40')
542
+ # # => [["f#o", "/"], ["b-r", "$"], ["b z", "@"]]
543
+ #
544
+ # The given string may contain consecutive separators:
545
+ #
546
+ # Gem::URI.decode_www_form('foo=0&&bar=1&&baz=2')
547
+ # # => [["foo", "0"], ["", ""], ["bar", "1"], ["", ""], ["baz", "2"]]
548
+ #
549
+ # A different separator may be specified:
550
+ #
551
+ # Gem::URI.decode_www_form('foo=0--bar=1--baz', separator: '--')
552
+ # # => [["foo", "0"], ["bar", "1"], ["baz", ""]]
553
+ #
554
+ def self.decode_www_form(str, enc=Encoding::UTF_8, separator: '&', use__charset_: false, isindex: false)
555
+ raise ArgumentError, "the input of #{self.name}.#{__method__} must be ASCII only string" unless str.ascii_only?
556
+ ary = []
557
+ return ary if str.empty?
558
+ enc = Encoding.find(enc)
559
+ str.b.each_line(separator) do |string|
560
+ string.chomp!(separator)
561
+ key, sep, val = string.partition('=')
562
+ if isindex
563
+ if sep.empty?
564
+ val = key
565
+ key = +''
566
+ end
567
+ isindex = false
568
+ end
569
+
570
+ if use__charset_ and key == '_charset_' and e = get_encoding(val)
571
+ enc = e
572
+ use__charset_ = false
573
+ end
574
+
575
+ key.gsub!(/\+|%\h\h/, TBLDECWWWCOMP_)
576
+ if val
577
+ val.gsub!(/\+|%\h\h/, TBLDECWWWCOMP_)
578
+ else
579
+ val = +''
580
+ end
581
+
582
+ ary << [key, val]
583
+ end
584
+ ary.each do |k, v|
585
+ k.force_encoding(enc)
586
+ k.scrub!
587
+ v.force_encoding(enc)
588
+ v.scrub!
589
+ end
590
+ ary
591
+ end
592
+
593
+ private
594
+ =begin command for WEB_ENCODINGS_
595
+ curl https://encoding.spec.whatwg.org/encodings.json|
596
+ ruby -rjson -e 'H={}
597
+ h={
598
+ "shift_jis"=>"Windows-31J",
599
+ "euc-jp"=>"cp51932",
600
+ "iso-2022-jp"=>"cp50221",
601
+ "x-mac-cyrillic"=>"macCyrillic",
602
+ }
603
+ JSON($<.read).map{|x|x["encodings"]}.flatten.each{|x|
604
+ Encoding.find(n=h.fetch(n=x["name"].downcase,n))rescue next
605
+ x["labels"].each{|y|H[y]=n}
606
+ }
607
+ puts "{"
608
+ H.each{|k,v|puts %[ #{k.dump}=>#{v.dump},]}
609
+ puts "}"
610
+ '
611
+ =end
612
+ WEB_ENCODINGS_ = {
613
+ "unicode-1-1-utf-8"=>"utf-8",
614
+ "utf-8"=>"utf-8",
615
+ "utf8"=>"utf-8",
616
+ "866"=>"ibm866",
617
+ "cp866"=>"ibm866",
618
+ "csibm866"=>"ibm866",
619
+ "ibm866"=>"ibm866",
620
+ "csisolatin2"=>"iso-8859-2",
621
+ "iso-8859-2"=>"iso-8859-2",
622
+ "iso-ir-101"=>"iso-8859-2",
623
+ "iso8859-2"=>"iso-8859-2",
624
+ "iso88592"=>"iso-8859-2",
625
+ "iso_8859-2"=>"iso-8859-2",
626
+ "iso_8859-2:1987"=>"iso-8859-2",
627
+ "l2"=>"iso-8859-2",
628
+ "latin2"=>"iso-8859-2",
629
+ "csisolatin3"=>"iso-8859-3",
630
+ "iso-8859-3"=>"iso-8859-3",
631
+ "iso-ir-109"=>"iso-8859-3",
632
+ "iso8859-3"=>"iso-8859-3",
633
+ "iso88593"=>"iso-8859-3",
634
+ "iso_8859-3"=>"iso-8859-3",
635
+ "iso_8859-3:1988"=>"iso-8859-3",
636
+ "l3"=>"iso-8859-3",
637
+ "latin3"=>"iso-8859-3",
638
+ "csisolatin4"=>"iso-8859-4",
639
+ "iso-8859-4"=>"iso-8859-4",
640
+ "iso-ir-110"=>"iso-8859-4",
641
+ "iso8859-4"=>"iso-8859-4",
642
+ "iso88594"=>"iso-8859-4",
643
+ "iso_8859-4"=>"iso-8859-4",
644
+ "iso_8859-4:1988"=>"iso-8859-4",
645
+ "l4"=>"iso-8859-4",
646
+ "latin4"=>"iso-8859-4",
647
+ "csisolatincyrillic"=>"iso-8859-5",
648
+ "cyrillic"=>"iso-8859-5",
649
+ "iso-8859-5"=>"iso-8859-5",
650
+ "iso-ir-144"=>"iso-8859-5",
651
+ "iso8859-5"=>"iso-8859-5",
652
+ "iso88595"=>"iso-8859-5",
653
+ "iso_8859-5"=>"iso-8859-5",
654
+ "iso_8859-5:1988"=>"iso-8859-5",
655
+ "arabic"=>"iso-8859-6",
656
+ "asmo-708"=>"iso-8859-6",
657
+ "csiso88596e"=>"iso-8859-6",
658
+ "csiso88596i"=>"iso-8859-6",
659
+ "csisolatinarabic"=>"iso-8859-6",
660
+ "ecma-114"=>"iso-8859-6",
661
+ "iso-8859-6"=>"iso-8859-6",
662
+ "iso-8859-6-e"=>"iso-8859-6",
663
+ "iso-8859-6-i"=>"iso-8859-6",
664
+ "iso-ir-127"=>"iso-8859-6",
665
+ "iso8859-6"=>"iso-8859-6",
666
+ "iso88596"=>"iso-8859-6",
667
+ "iso_8859-6"=>"iso-8859-6",
668
+ "iso_8859-6:1987"=>"iso-8859-6",
669
+ "csisolatingreek"=>"iso-8859-7",
670
+ "ecma-118"=>"iso-8859-7",
671
+ "elot_928"=>"iso-8859-7",
672
+ "greek"=>"iso-8859-7",
673
+ "greek8"=>"iso-8859-7",
674
+ "iso-8859-7"=>"iso-8859-7",
675
+ "iso-ir-126"=>"iso-8859-7",
676
+ "iso8859-7"=>"iso-8859-7",
677
+ "iso88597"=>"iso-8859-7",
678
+ "iso_8859-7"=>"iso-8859-7",
679
+ "iso_8859-7:1987"=>"iso-8859-7",
680
+ "sun_eu_greek"=>"iso-8859-7",
681
+ "csiso88598e"=>"iso-8859-8",
682
+ "csisolatinhebrew"=>"iso-8859-8",
683
+ "hebrew"=>"iso-8859-8",
684
+ "iso-8859-8"=>"iso-8859-8",
685
+ "iso-8859-8-e"=>"iso-8859-8",
686
+ "iso-ir-138"=>"iso-8859-8",
687
+ "iso8859-8"=>"iso-8859-8",
688
+ "iso88598"=>"iso-8859-8",
689
+ "iso_8859-8"=>"iso-8859-8",
690
+ "iso_8859-8:1988"=>"iso-8859-8",
691
+ "visual"=>"iso-8859-8",
692
+ "csisolatin6"=>"iso-8859-10",
693
+ "iso-8859-10"=>"iso-8859-10",
694
+ "iso-ir-157"=>"iso-8859-10",
695
+ "iso8859-10"=>"iso-8859-10",
696
+ "iso885910"=>"iso-8859-10",
697
+ "l6"=>"iso-8859-10",
698
+ "latin6"=>"iso-8859-10",
699
+ "iso-8859-13"=>"iso-8859-13",
700
+ "iso8859-13"=>"iso-8859-13",
701
+ "iso885913"=>"iso-8859-13",
702
+ "iso-8859-14"=>"iso-8859-14",
703
+ "iso8859-14"=>"iso-8859-14",
704
+ "iso885914"=>"iso-8859-14",
705
+ "csisolatin9"=>"iso-8859-15",
706
+ "iso-8859-15"=>"iso-8859-15",
707
+ "iso8859-15"=>"iso-8859-15",
708
+ "iso885915"=>"iso-8859-15",
709
+ "iso_8859-15"=>"iso-8859-15",
710
+ "l9"=>"iso-8859-15",
711
+ "iso-8859-16"=>"iso-8859-16",
712
+ "cskoi8r"=>"koi8-r",
713
+ "koi"=>"koi8-r",
714
+ "koi8"=>"koi8-r",
715
+ "koi8-r"=>"koi8-r",
716
+ "koi8_r"=>"koi8-r",
717
+ "koi8-ru"=>"koi8-u",
718
+ "koi8-u"=>"koi8-u",
719
+ "dos-874"=>"windows-874",
720
+ "iso-8859-11"=>"windows-874",
721
+ "iso8859-11"=>"windows-874",
722
+ "iso885911"=>"windows-874",
723
+ "tis-620"=>"windows-874",
724
+ "windows-874"=>"windows-874",
725
+ "cp1250"=>"windows-1250",
726
+ "windows-1250"=>"windows-1250",
727
+ "x-cp1250"=>"windows-1250",
728
+ "cp1251"=>"windows-1251",
729
+ "windows-1251"=>"windows-1251",
730
+ "x-cp1251"=>"windows-1251",
731
+ "ansi_x3.4-1968"=>"windows-1252",
732
+ "ascii"=>"windows-1252",
733
+ "cp1252"=>"windows-1252",
734
+ "cp819"=>"windows-1252",
735
+ "csisolatin1"=>"windows-1252",
736
+ "ibm819"=>"windows-1252",
737
+ "iso-8859-1"=>"windows-1252",
738
+ "iso-ir-100"=>"windows-1252",
739
+ "iso8859-1"=>"windows-1252",
740
+ "iso88591"=>"windows-1252",
741
+ "iso_8859-1"=>"windows-1252",
742
+ "iso_8859-1:1987"=>"windows-1252",
743
+ "l1"=>"windows-1252",
744
+ "latin1"=>"windows-1252",
745
+ "us-ascii"=>"windows-1252",
746
+ "windows-1252"=>"windows-1252",
747
+ "x-cp1252"=>"windows-1252",
748
+ "cp1253"=>"windows-1253",
749
+ "windows-1253"=>"windows-1253",
750
+ "x-cp1253"=>"windows-1253",
751
+ "cp1254"=>"windows-1254",
752
+ "csisolatin5"=>"windows-1254",
753
+ "iso-8859-9"=>"windows-1254",
754
+ "iso-ir-148"=>"windows-1254",
755
+ "iso8859-9"=>"windows-1254",
756
+ "iso88599"=>"windows-1254",
757
+ "iso_8859-9"=>"windows-1254",
758
+ "iso_8859-9:1989"=>"windows-1254",
759
+ "l5"=>"windows-1254",
760
+ "latin5"=>"windows-1254",
761
+ "windows-1254"=>"windows-1254",
762
+ "x-cp1254"=>"windows-1254",
763
+ "cp1255"=>"windows-1255",
764
+ "windows-1255"=>"windows-1255",
765
+ "x-cp1255"=>"windows-1255",
766
+ "cp1256"=>"windows-1256",
767
+ "windows-1256"=>"windows-1256",
768
+ "x-cp1256"=>"windows-1256",
769
+ "cp1257"=>"windows-1257",
770
+ "windows-1257"=>"windows-1257",
771
+ "x-cp1257"=>"windows-1257",
772
+ "cp1258"=>"windows-1258",
773
+ "windows-1258"=>"windows-1258",
774
+ "x-cp1258"=>"windows-1258",
775
+ "x-mac-cyrillic"=>"macCyrillic",
776
+ "x-mac-ukrainian"=>"macCyrillic",
777
+ "chinese"=>"gbk",
778
+ "csgb2312"=>"gbk",
779
+ "csiso58gb231280"=>"gbk",
780
+ "gb2312"=>"gbk",
781
+ "gb_2312"=>"gbk",
782
+ "gb_2312-80"=>"gbk",
783
+ "gbk"=>"gbk",
784
+ "iso-ir-58"=>"gbk",
785
+ "x-gbk"=>"gbk",
786
+ "gb18030"=>"gb18030",
787
+ "big5"=>"big5",
788
+ "big5-hkscs"=>"big5",
789
+ "cn-big5"=>"big5",
790
+ "csbig5"=>"big5",
791
+ "x-x-big5"=>"big5",
792
+ "cseucpkdfmtjapanese"=>"cp51932",
793
+ "euc-jp"=>"cp51932",
794
+ "x-euc-jp"=>"cp51932",
795
+ "csiso2022jp"=>"cp50221",
796
+ "iso-2022-jp"=>"cp50221",
797
+ "csshiftjis"=>"Windows-31J",
798
+ "ms932"=>"Windows-31J",
799
+ "ms_kanji"=>"Windows-31J",
800
+ "shift-jis"=>"Windows-31J",
801
+ "shift_jis"=>"Windows-31J",
802
+ "sjis"=>"Windows-31J",
803
+ "windows-31j"=>"Windows-31J",
804
+ "x-sjis"=>"Windows-31J",
805
+ "cseuckr"=>"euc-kr",
806
+ "csksc56011987"=>"euc-kr",
807
+ "euc-kr"=>"euc-kr",
808
+ "iso-ir-149"=>"euc-kr",
809
+ "korean"=>"euc-kr",
810
+ "ks_c_5601-1987"=>"euc-kr",
811
+ "ks_c_5601-1989"=>"euc-kr",
812
+ "ksc5601"=>"euc-kr",
813
+ "ksc_5601"=>"euc-kr",
814
+ "windows-949"=>"euc-kr",
815
+ "utf-16be"=>"utf-16be",
816
+ "utf-16"=>"utf-16le",
817
+ "utf-16le"=>"utf-16le",
818
+ } # :nodoc:
819
+ Ractor.make_shareable(WEB_ENCODINGS_) if defined?(Ractor)
820
+
821
+ # :nodoc:
822
+ # return encoding or nil
823
+ # http://encoding.spec.whatwg.org/#concept-encoding-get
824
+ def self.get_encoding(label)
825
+ Encoding.find(WEB_ENCODINGS_[label.to_str.strip.downcase]) rescue nil
826
+ end
827
+ end # module Gem::URI
828
+
829
+ module Gem
830
+
831
+ #
832
+ # Returns a \Gem::URI object derived from the given +uri+,
833
+ # which may be a \Gem::URI string or an existing \Gem::URI object:
834
+ #
835
+ # # Returns a new Gem::URI.
836
+ # uri = Gem::URI('http://github.com/ruby/ruby')
837
+ # # => #<Gem::URI::HTTP http://github.com/ruby/ruby>
838
+ # # Returns the given Gem::URI.
839
+ # Gem::URI(uri)
840
+ # # => #<Gem::URI::HTTP http://github.com/ruby/ruby>
841
+ #
842
+ def URI(uri)
843
+ if uri.is_a?(Gem::URI::Generic)
844
+ uri
845
+ elsif uri = String.try_convert(uri)
846
+ Gem::URI.parse(uri)
847
+ else
848
+ raise ArgumentError,
849
+ "bad argument (expected Gem::URI object or Gem::URI string)"
850
+ end
851
+ end
852
+ module_function :URI
853
+ end