rubygems-update 3.4.22 → 3.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (540) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +105 -2
  3. data/Manifest.txt +46 -221
  4. data/README.md +1 -3
  5. data/bundler/CHANGELOG.md +63 -0
  6. data/bundler/bundler.gemspec +4 -2
  7. data/bundler/exe/bundle +1 -10
  8. data/bundler/lib/bundler/build_metadata.rb +3 -3
  9. data/bundler/lib/bundler/capistrano.rb +1 -1
  10. data/bundler/lib/bundler/checksum.rb +254 -0
  11. data/bundler/lib/bundler/ci_detector.rb +75 -0
  12. data/bundler/lib/bundler/cli/add.rb +3 -3
  13. data/bundler/lib/bundler/cli/binstubs.rb +4 -4
  14. data/bundler/lib/bundler/cli/cache.rb +1 -1
  15. data/bundler/lib/bundler/cli/check.rb +1 -1
  16. data/bundler/lib/bundler/cli/common.rb +9 -1
  17. data/bundler/lib/bundler/cli/config.rb +8 -7
  18. data/bundler/lib/bundler/cli/console.rb +3 -2
  19. data/bundler/lib/bundler/cli/doctor.rb +2 -2
  20. data/bundler/lib/bundler/cli/exec.rb +1 -1
  21. data/bundler/lib/bundler/cli/gem.rb +28 -23
  22. data/bundler/lib/bundler/cli/info.rb +2 -13
  23. data/bundler/lib/bundler/cli/install.rb +5 -4
  24. data/bundler/lib/bundler/cli/issue.rb +1 -1
  25. data/bundler/lib/bundler/cli/lock.rb +4 -4
  26. data/bundler/lib/bundler/cli/open.rb +1 -1
  27. data/bundler/lib/bundler/cli/outdated.rb +6 -6
  28. data/bundler/lib/bundler/cli/plugin.rb +7 -14
  29. data/bundler/lib/bundler/cli/pristine.rb +38 -30
  30. data/bundler/lib/bundler/cli/show.rb +2 -2
  31. data/bundler/lib/bundler/cli/update.rb +5 -5
  32. data/bundler/lib/bundler/cli.rb +215 -263
  33. data/bundler/lib/bundler/compact_index_client/cache.rb +29 -9
  34. data/bundler/lib/bundler/compact_index_client/cache_file.rb +153 -0
  35. data/bundler/lib/bundler/compact_index_client/gem_parser.rb +7 -3
  36. data/bundler/lib/bundler/compact_index_client/updater.rb +79 -81
  37. data/bundler/lib/bundler/compact_index_client.rb +14 -7
  38. data/bundler/lib/bundler/constants.rb +1 -1
  39. data/bundler/lib/bundler/current_ruby.rb +5 -21
  40. data/bundler/lib/bundler/definition.rb +42 -15
  41. data/bundler/lib/bundler/dependency.rb +16 -12
  42. data/bundler/lib/bundler/digest.rb +2 -2
  43. data/bundler/lib/bundler/dsl.rb +46 -30
  44. data/bundler/lib/bundler/endpoint_specification.rb +5 -1
  45. data/bundler/lib/bundler/env.rb +1 -3
  46. data/bundler/lib/bundler/errors.rb +43 -0
  47. data/bundler/lib/bundler/fetcher/base.rb +3 -1
  48. data/bundler/lib/bundler/fetcher/compact_index.rb +4 -4
  49. data/bundler/lib/bundler/fetcher/downloader.rb +13 -11
  50. data/bundler/lib/bundler/fetcher/gem_remote_fetcher.rb +16 -0
  51. data/bundler/lib/bundler/fetcher/index.rb +1 -1
  52. data/bundler/lib/bundler/fetcher.rb +28 -25
  53. data/bundler/lib/bundler/friendly_errors.rb +5 -5
  54. data/bundler/lib/bundler/gem_helper.rb +1 -1
  55. data/bundler/lib/bundler/gem_helpers.rb +5 -2
  56. data/bundler/lib/bundler/graph.rb +9 -9
  57. data/bundler/lib/bundler/index.rb +1 -2
  58. data/bundler/lib/bundler/injector.rb +1 -1
  59. data/bundler/lib/bundler/inline.rb +3 -3
  60. data/bundler/lib/bundler/installer/gem_installer.rb +5 -5
  61. data/bundler/lib/bundler/installer/parallel_installer.rb +16 -8
  62. data/bundler/lib/bundler/installer/standalone.rb +2 -3
  63. data/bundler/lib/bundler/installer.rb +9 -9
  64. data/bundler/lib/bundler/lazy_specification.rb +24 -17
  65. data/bundler/lib/bundler/lockfile_generator.rb +9 -0
  66. data/bundler/lib/bundler/lockfile_parser.rb +81 -10
  67. data/bundler/lib/bundler/man/bundle-add.1 +3 -26
  68. data/bundler/lib/bundler/man/bundle-binstubs.1 +4 -16
  69. data/bundler/lib/bundler/man/bundle-cache.1 +3 -24
  70. data/bundler/lib/bundler/man/bundle-check.1 +3 -12
  71. data/bundler/lib/bundler/man/bundle-clean.1 +3 -10
  72. data/bundler/lib/bundler/man/bundle-config.1 +20 -211
  73. data/bundler/lib/bundler/man/bundle-config.1.ronn +6 -0
  74. data/bundler/lib/bundler/man/bundle-console.1 +4 -22
  75. data/bundler/lib/bundler/man/bundle-doctor.1 +4 -18
  76. data/bundler/lib/bundler/man/bundle-exec.1 +12 -73
  77. data/bundler/lib/bundler/man/bundle-gem.1 +13 -49
  78. data/bundler/lib/bundler/man/bundle-help.1 +3 -7
  79. data/bundler/lib/bundler/man/bundle-info.1 +3 -9
  80. data/bundler/lib/bundler/man/bundle-init.1 +3 -12
  81. data/bundler/lib/bundler/man/bundle-inject.1 +6 -19
  82. data/bundler/lib/bundler/man/bundle-install.1 +27 -125
  83. data/bundler/lib/bundler/man/bundle-install.1.ronn +1 -0
  84. data/bundler/lib/bundler/man/bundle-list.1 +4 -19
  85. data/bundler/lib/bundler/man/bundle-lock.1 +5 -29
  86. data/bundler/lib/bundler/man/bundle-open.1 +7 -27
  87. data/bundler/lib/bundler/man/bundle-outdated.1 +3 -55
  88. data/bundler/lib/bundler/man/bundle-outdated.1.ronn +1 -0
  89. data/bundler/lib/bundler/man/bundle-platform.1 +5 -27
  90. data/bundler/lib/bundler/man/bundle-plugin.1 +3 -29
  91. data/bundler/lib/bundler/man/bundle-pristine.1 +5 -16
  92. data/bundler/lib/bundler/man/bundle-remove.1 +4 -14
  93. data/bundler/lib/bundler/man/bundle-show.1 +3 -10
  94. data/bundler/lib/bundler/man/bundle-update.1 +18 -137
  95. data/bundler/lib/bundler/man/bundle-version.1 +3 -16
  96. data/bundler/lib/bundler/man/bundle-viz.1 +4 -16
  97. data/bundler/lib/bundler/man/bundle.1 +5 -44
  98. data/bundler/lib/bundler/man/gemfile.5 +24 -301
  99. data/bundler/lib/bundler/man/gemfile.5.ronn +4 -0
  100. data/bundler/lib/bundler/match_metadata.rb +4 -0
  101. data/bundler/lib/bundler/match_platform.rb +1 -1
  102. data/bundler/lib/bundler/plugin/api/source.rb +3 -2
  103. data/bundler/lib/bundler/plugin/installer.rb +1 -1
  104. data/bundler/lib/bundler/plugin.rb +3 -3
  105. data/bundler/lib/bundler/resolver/base.rb +1 -1
  106. data/bundler/lib/bundler/resolver/incompatibility.rb +1 -1
  107. data/bundler/lib/bundler/resolver/spec_group.rb +1 -4
  108. data/bundler/lib/bundler/resolver.rb +16 -16
  109. data/bundler/lib/bundler/ruby_dsl.rb +20 -12
  110. data/bundler/lib/bundler/ruby_version.rb +1 -1
  111. data/bundler/lib/bundler/rubygems_ext.rb +24 -50
  112. data/bundler/lib/bundler/rubygems_gem_installer.rb +6 -56
  113. data/bundler/lib/bundler/rubygems_integration.rb +25 -94
  114. data/bundler/lib/bundler/runtime.rb +2 -2
  115. data/bundler/lib/bundler/self_manager.rb +23 -7
  116. data/bundler/lib/bundler/settings.rb +27 -7
  117. data/bundler/lib/bundler/setup.rb +4 -1
  118. data/bundler/lib/bundler/shared_helpers.rb +35 -13
  119. data/bundler/lib/bundler/source/git/git_proxy.rb +15 -15
  120. data/bundler/lib/bundler/source/git.rb +4 -3
  121. data/bundler/lib/bundler/source/metadata.rb +15 -15
  122. data/bundler/lib/bundler/source/path.rb +7 -6
  123. data/bundler/lib/bundler/source/rubygems.rb +21 -14
  124. data/bundler/lib/bundler/source.rb +2 -0
  125. data/bundler/lib/bundler/spec_set.rb +38 -10
  126. data/bundler/lib/bundler/stub_specification.rb +1 -0
  127. data/bundler/lib/bundler/templates/Executable.bundler +1 -1
  128. data/bundler/lib/bundler/templates/newgem/README.md.tt +3 -3
  129. data/bundler/lib/bundler/templates/newgem/Rakefile.tt +2 -6
  130. data/bundler/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +1 -1
  131. data/bundler/lib/bundler/templates/newgem/standard.yml.tt +1 -1
  132. data/bundler/lib/bundler/ui/shell.rb +1 -1
  133. data/bundler/lib/bundler/vendor/connection_pool/.document +1 -0
  134. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +1 -1
  135. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +53 -6
  136. data/bundler/lib/bundler/vendor/fileutils/.document +1 -0
  137. data/bundler/lib/bundler/vendor/fileutils/lib/fileutils.rb +8 -20
  138. data/bundler/lib/bundler/vendor/net-http-persistent/.document +1 -0
  139. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +3 -3
  140. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +2 -2
  141. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +1 -1
  142. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +34 -34
  143. data/bundler/lib/bundler/vendor/pub_grub/.document +1 -0
  144. data/bundler/lib/bundler/vendor/thor/.document +1 -0
  145. data/bundler/lib/bundler/vendor/tsort/.document +1 -0
  146. data/bundler/lib/bundler/vendor/tsort/lib/tsort.rb +3 -0
  147. data/bundler/lib/bundler/vendor/uri/.document +1 -0
  148. data/bundler/lib/bundler/vendor/uri/lib/uri/common.rb +256 -132
  149. data/bundler/lib/bundler/vendor/uri/lib/uri/generic.rb +1 -0
  150. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +95 -31
  151. data/bundler/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
  152. data/bundler/lib/bundler/vendored_net_http.rb +8 -0
  153. data/bundler/lib/bundler/vendored_persistent.rb +0 -4
  154. data/bundler/lib/bundler/vendored_timeout.rb +8 -0
  155. data/bundler/lib/bundler/version.rb +1 -1
  156. data/bundler/lib/bundler/vlad.rb +1 -1
  157. data/bundler/lib/bundler/yaml_serializer.rb +3 -3
  158. data/bundler/lib/bundler.rb +41 -32
  159. data/lib/rubygems/available_set.rb +4 -4
  160. data/lib/rubygems/basic_specification.rb +35 -37
  161. data/lib/rubygems/bundler_version_finder.rb +4 -4
  162. data/lib/rubygems/ci_detector.rb +75 -0
  163. data/lib/rubygems/command.rb +13 -15
  164. data/lib/rubygems/command_manager.rb +5 -4
  165. data/lib/rubygems/commands/build_command.rb +2 -2
  166. data/lib/rubygems/commands/cert_command.rb +1 -2
  167. data/lib/rubygems/commands/check_command.rb +4 -4
  168. data/lib/rubygems/commands/cleanup_command.rb +12 -14
  169. data/lib/rubygems/commands/contents_command.rb +4 -4
  170. data/lib/rubygems/commands/dependency_command.rb +4 -5
  171. data/lib/rubygems/commands/environment_command.rb +1 -3
  172. data/lib/rubygems/commands/exec_command.rb +1 -1
  173. data/lib/rubygems/commands/fetch_command.rb +2 -2
  174. data/lib/rubygems/commands/generate_index_command.rb +39 -74
  175. data/lib/rubygems/commands/help_command.rb +3 -3
  176. data/lib/rubygems/commands/info_command.rb +2 -2
  177. data/lib/rubygems/commands/install_command.rb +8 -16
  178. data/lib/rubygems/commands/list_command.rb +2 -2
  179. data/lib/rubygems/commands/lock_command.rb +1 -1
  180. data/lib/rubygems/commands/open_command.rb +1 -1
  181. data/lib/rubygems/commands/owner_command.rb +1 -1
  182. data/lib/rubygems/commands/pristine_command.rb +13 -15
  183. data/lib/rubygems/commands/push_command.rb +2 -2
  184. data/lib/rubygems/commands/query_command.rb +4 -5
  185. data/lib/rubygems/commands/rdoc_command.rb +2 -2
  186. data/lib/rubygems/commands/search_command.rb +2 -2
  187. data/lib/rubygems/commands/setup_command.rb +31 -34
  188. data/lib/rubygems/commands/sources_command.rb +12 -12
  189. data/lib/rubygems/commands/specification_command.rb +10 -10
  190. data/lib/rubygems/commands/stale_command.rb +1 -1
  191. data/lib/rubygems/commands/uninstall_command.rb +9 -10
  192. data/lib/rubygems/commands/unpack_command.rb +4 -4
  193. data/lib/rubygems/commands/update_command.rb +10 -12
  194. data/lib/rubygems/commands/which_command.rb +1 -1
  195. data/lib/rubygems/commands/yank_command.rb +1 -1
  196. data/lib/rubygems/compatibility.rb +5 -6
  197. data/lib/rubygems/config_file.rb +4 -4
  198. data/lib/rubygems/core_ext/kernel_gem.rb +0 -2
  199. data/lib/rubygems/core_ext/kernel_require.rb +19 -48
  200. data/lib/rubygems/core_ext/kernel_warn.rb +1 -1
  201. data/lib/rubygems/core_ext/tcpsocket_init.rb +1 -1
  202. data/lib/rubygems/defaults.rb +15 -3
  203. data/lib/rubygems/dependency.rb +12 -14
  204. data/lib/rubygems/dependency_installer.rb +29 -30
  205. data/lib/rubygems/dependency_list.rb +1 -1
  206. data/lib/rubygems/deprecate.rb +16 -15
  207. data/lib/rubygems/doctor.rb +5 -5
  208. data/lib/rubygems/errors.rb +2 -6
  209. data/lib/rubygems/exceptions.rb +2 -1
  210. data/lib/rubygems/ext/builder.rb +15 -10
  211. data/lib/rubygems/ext/cargo_builder.rb +5 -5
  212. data/lib/rubygems/ext/ext_conf_builder.rb +1 -3
  213. data/lib/rubygems/gem_runner.rb +4 -4
  214. data/lib/rubygems/gemcutter_utilities/webauthn_listener/response.rb +3 -3
  215. data/lib/rubygems/gemcutter_utilities/webauthn_poller.rb +3 -3
  216. data/lib/rubygems/gemcutter_utilities.rb +18 -19
  217. data/lib/rubygems/install_update_options.rb +18 -19
  218. data/lib/rubygems/installer.rb +59 -33
  219. data/lib/rubygems/installer_uninstaller_utils.rb +0 -2
  220. data/lib/rubygems/local_remote_options.rb +7 -10
  221. data/lib/rubygems/name_tuple.rb +7 -9
  222. data/lib/rubygems/net/http.rb +3 -0
  223. data/lib/rubygems/net-http/.document +1 -0
  224. data/lib/rubygems/net-http/LICENSE.txt +22 -0
  225. data/lib/rubygems/net-http/lib/net/http/backward.rb +40 -0
  226. data/lib/rubygems/net-http/lib/net/http/exceptions.rb +34 -0
  227. data/lib/rubygems/net-http/lib/net/http/generic_request.rb +414 -0
  228. data/lib/rubygems/net-http/lib/net/http/header.rb +981 -0
  229. data/lib/rubygems/net-http/lib/net/http/proxy_delta.rb +17 -0
  230. data/lib/rubygems/net-http/lib/net/http/request.rb +88 -0
  231. data/lib/rubygems/net-http/lib/net/http/requests.rb +425 -0
  232. data/lib/rubygems/net-http/lib/net/http/response.rb +738 -0
  233. data/lib/rubygems/net-http/lib/net/http/responses.rb +1174 -0
  234. data/lib/rubygems/net-http/lib/net/http/status.rb +84 -0
  235. data/lib/rubygems/net-http/lib/net/http.rb +2496 -0
  236. data/lib/rubygems/net-http/lib/net/https.rb +23 -0
  237. data/lib/rubygems/net-protocol/.document +1 -0
  238. data/lib/rubygems/net-protocol/LICENSE.txt +22 -0
  239. data/lib/rubygems/net-protocol/lib/net/protocol.rb +544 -0
  240. data/lib/rubygems/optparse/lib/optparse.rb +39 -17
  241. data/lib/rubygems/package/old.rb +2 -2
  242. data/lib/rubygems/package/tar_header.rb +45 -39
  243. data/lib/rubygems/package/tar_reader/entry.rb +5 -4
  244. data/lib/rubygems/package/tar_reader.rb +5 -3
  245. data/lib/rubygems/package/tar_writer.rb +19 -17
  246. data/lib/rubygems/package.rb +27 -26
  247. data/lib/rubygems/package_task.rb +2 -2
  248. data/lib/rubygems/path_support.rb +9 -10
  249. data/lib/rubygems/platform.rb +60 -45
  250. data/lib/rubygems/query_utils.rb +7 -9
  251. data/lib/rubygems/remote_fetcher.rb +15 -15
  252. data/lib/rubygems/request/connection_pools.rb +3 -3
  253. data/lib/rubygems/request.rb +20 -17
  254. data/lib/rubygems/request_set/gem_dependency_api.rb +119 -122
  255. data/lib/rubygems/request_set/lockfile/parser.rb +9 -9
  256. data/lib/rubygems/request_set/lockfile/tokenizer.rb +20 -12
  257. data/lib/rubygems/request_set/lockfile.rb +6 -11
  258. data/lib/rubygems/request_set.rb +5 -5
  259. data/lib/rubygems/requirement.rb +7 -7
  260. data/lib/rubygems/resolv/.document +1 -0
  261. data/lib/rubygems/resolv/LICENSE.txt +22 -0
  262. data/lib/rubygems/resolv/lib/resolv.rb +3387 -0
  263. data/lib/rubygems/resolver/activation_request.rb +1 -3
  264. data/lib/rubygems/resolver/api_set/gem_parser.rb +7 -3
  265. data/lib/rubygems/resolver/best_set.rb +1 -1
  266. data/lib/rubygems/resolver/composed_set.rb +1 -1
  267. data/lib/rubygems/resolver/conflict.rb +4 -12
  268. data/lib/rubygems/resolver/index_set.rb +4 -4
  269. data/lib/rubygems/resolver/index_specification.rb +2 -2
  270. data/lib/rubygems/resolver/installer_set.rb +5 -6
  271. data/lib/rubygems/resolver/lock_set.rb +1 -1
  272. data/lib/rubygems/resolver/molinillo/.document +1 -0
  273. data/lib/rubygems/resolver.rb +3 -10
  274. data/lib/rubygems/s3_uri_signer.rb +6 -6
  275. data/lib/rubygems/safe_marshal/elements.rb +138 -0
  276. data/lib/rubygems/safe_marshal/reader.rb +306 -0
  277. data/lib/rubygems/safe_marshal/visitors/stream_printer.rb +31 -0
  278. data/lib/rubygems/safe_marshal/visitors/to_ruby.rb +385 -0
  279. data/lib/rubygems/safe_marshal/visitors/visitor.rb +74 -0
  280. data/lib/rubygems/safe_marshal.rb +74 -0
  281. data/lib/rubygems/safe_yaml.rb +5 -28
  282. data/lib/rubygems/security/policies.rb +36 -38
  283. data/lib/rubygems/security/policy.rb +7 -11
  284. data/lib/rubygems/security/signer.rb +1 -1
  285. data/lib/rubygems/security/trust_dir.rb +3 -3
  286. data/lib/rubygems/security.rb +8 -22
  287. data/lib/rubygems/source/git.rb +1 -3
  288. data/lib/rubygems/source/installed.rb +0 -2
  289. data/lib/rubygems/source/local.rb +5 -8
  290. data/lib/rubygems/source/lock.rb +1 -3
  291. data/lib/rubygems/source/specific_file.rb +0 -1
  292. data/lib/rubygems/source/vendor.rb +0 -2
  293. data/lib/rubygems/source.rb +12 -12
  294. data/lib/rubygems/source_list.rb +4 -4
  295. data/lib/rubygems/spec_fetcher.rb +29 -29
  296. data/lib/rubygems/specification.rb +125 -138
  297. data/lib/rubygems/specification_policy.rb +55 -25
  298. data/lib/rubygems/stub_specification.rb +4 -5
  299. data/lib/rubygems/text.rb +1 -2
  300. data/lib/rubygems/timeout/.document +1 -0
  301. data/lib/rubygems/timeout/LICENSE.txt +22 -0
  302. data/lib/rubygems/timeout/lib/timeout.rb +199 -0
  303. data/lib/rubygems/timeout.rb +3 -0
  304. data/lib/rubygems/tsort/lib/tsort.rb +3 -0
  305. data/lib/rubygems/uninstaller.rb +7 -9
  306. data/lib/rubygems/update_suggestion.rb +5 -18
  307. data/lib/rubygems/uri_formatter.rb +1 -1
  308. data/lib/rubygems/user_interaction.rb +15 -21
  309. data/lib/rubygems/util/licenses.rb +65 -35
  310. data/lib/rubygems/util/list.rb +3 -1
  311. data/lib/rubygems/util.rb +2 -4
  312. data/lib/rubygems/validator.rb +5 -3
  313. data/lib/rubygems/version.rb +34 -28
  314. data/lib/rubygems/version_option.rb +2 -5
  315. data/lib/rubygems/yaml_serializer.rb +3 -3
  316. data/lib/rubygems.rb +37 -37
  317. data/rubygems-update.gemspec +4 -4
  318. data/setup.rb +2 -2
  319. metadata +50 -225
  320. data/lib/rubygems/indexer.rb +0 -428
  321. data/lib/rubygems/mock_gem_ui.rb +0 -86
  322. data/test/rubygems/alternate_cert.pem +0 -19
  323. data/test/rubygems/alternate_cert_32.pem +0 -19
  324. data/test/rubygems/alternate_key.pem +0 -27
  325. data/test/rubygems/bad_rake.rb +0 -3
  326. data/test/rubygems/bundler_test_gem.rb +0 -424
  327. data/test/rubygems/ca_cert.pem +0 -77
  328. data/test/rubygems/child_cert.pem +0 -19
  329. data/test/rubygems/child_cert_32.pem +0 -19
  330. data/test/rubygems/child_key.pem +0 -27
  331. data/test/rubygems/client.pem +0 -107
  332. data/test/rubygems/data/excon-0.7.7.gemspec.rz +0 -0
  333. data/test/rubygems/data/gem-private_key.pem +0 -27
  334. data/test/rubygems/data/gem-public_cert.pem +0 -20
  335. data/test/rubygems/data/null-required-ruby-version.gemspec.rz +0 -0
  336. data/test/rubygems/data/null-required-rubygems-version.gemspec.rz +0 -0
  337. data/test/rubygems/data/pry-0.4.7.gemspec.rz +0 -0
  338. data/test/rubygems/encrypted_private_key.pem +0 -30
  339. data/test/rubygems/expired_cert.pem +0 -19
  340. data/test/rubygems/fake_certlib/openssl.rb +0 -9
  341. data/test/rubygems/foo/discover.rb +0 -1
  342. data/test/rubygems/future_cert.pem +0 -19
  343. data/test/rubygems/future_cert_32.pem +0 -19
  344. data/test/rubygems/good_rake.rb +0 -3
  345. data/test/rubygems/grandchild_cert.pem +0 -19
  346. data/test/rubygems/grandchild_cert_32.pem +0 -19
  347. data/test/rubygems/grandchild_key.pem +0 -27
  348. data/test/rubygems/helper.rb +0 -1649
  349. data/test/rubygems/installer_test_case.rb +0 -248
  350. data/test/rubygems/invalid_client.pem +0 -49
  351. data/test/rubygems/invalid_issuer_cert.pem +0 -20
  352. data/test/rubygems/invalid_issuer_cert_32.pem +0 -20
  353. data/test/rubygems/invalid_key.pem +0 -27
  354. data/test/rubygems/invalid_signer_cert.pem +0 -19
  355. data/test/rubygems/invalid_signer_cert_32.pem +0 -19
  356. data/test/rubygems/invalidchild_cert.pem +0 -19
  357. data/test/rubygems/invalidchild_cert_32.pem +0 -19
  358. data/test/rubygems/invalidchild_key.pem +0 -27
  359. data/test/rubygems/multifactor_auth_utilities.rb +0 -111
  360. data/test/rubygems/package/tar_test_case.rb +0 -175
  361. data/test/rubygems/packages/Bluebie-legs-0.6.2.gem +0 -0
  362. data/test/rubygems/packages/ascii_binder-0.1.10.1.gem +0 -0
  363. data/test/rubygems/packages/ill-formatted-platform-1.0.0.10.gem +0 -0
  364. data/test/rubygems/plugin/exception/rubygems_plugin.rb +0 -4
  365. data/test/rubygems/plugin/load/rubygems_plugin.rb +0 -5
  366. data/test/rubygems/plugin/standarderror/rubygems_plugin.rb +0 -4
  367. data/test/rubygems/private3072_key.pem +0 -40
  368. data/test/rubygems/private_ec_key.pem +0 -9
  369. data/test/rubygems/private_key.pem +0 -27
  370. data/test/rubygems/public3072_cert.pem +0 -25
  371. data/test/rubygems/public_cert.pem +0 -20
  372. data/test/rubygems/public_cert_32.pem +0 -19
  373. data/test/rubygems/public_key.pem +0 -9
  374. data/test/rubygems/rubygems/commands/crash_command.rb +0 -5
  375. data/test/rubygems/rubygems_plugin.rb +0 -24
  376. data/test/rubygems/sff/discover.rb +0 -1
  377. data/test/rubygems/simple_gem.rb +0 -68
  378. data/test/rubygems/specifications/bar-0.0.2.gemspec +0 -9
  379. data/test/rubygems/specifications/foo-0.0.1-x86-mswin32.gemspec +0 -0
  380. data/test/rubygems/specifications/rubyforge-0.0.1.gemspec +0 -14
  381. data/test/rubygems/ssl_cert.pem +0 -80
  382. data/test/rubygems/ssl_key.pem +0 -27
  383. data/test/rubygems/test_bundled_ca.rb +0 -61
  384. data/test/rubygems/test_config.rb +0 -28
  385. data/test/rubygems/test_deprecate.rb +0 -158
  386. data/test/rubygems/test_exit.rb +0 -17
  387. data/test/rubygems/test_gem.rb +0 -1799
  388. data/test/rubygems/test_gem_available_set.rb +0 -130
  389. data/test/rubygems/test_gem_bundler_version_finder.rb +0 -127
  390. data/test/rubygems/test_gem_command.rb +0 -403
  391. data/test/rubygems/test_gem_command_manager.rb +0 -400
  392. data/test/rubygems/test_gem_commands_build_command.rb +0 -739
  393. data/test/rubygems/test_gem_commands_cert_command.rb +0 -866
  394. data/test/rubygems/test_gem_commands_check_command.rb +0 -68
  395. data/test/rubygems/test_gem_commands_cleanup_command.rb +0 -292
  396. data/test/rubygems/test_gem_commands_contents_command.rb +0 -271
  397. data/test/rubygems/test_gem_commands_dependency_command.rb +0 -228
  398. data/test/rubygems/test_gem_commands_environment_command.rb +0 -169
  399. data/test/rubygems/test_gem_commands_exec_command.rb +0 -857
  400. data/test/rubygems/test_gem_commands_fetch_command.rb +0 -258
  401. data/test/rubygems/test_gem_commands_generate_index_command.rb +0 -81
  402. data/test/rubygems/test_gem_commands_help_command.rb +0 -94
  403. data/test/rubygems/test_gem_commands_info_command.rb +0 -70
  404. data/test/rubygems/test_gem_commands_install_command.rb +0 -1573
  405. data/test/rubygems/test_gem_commands_list_command.rb +0 -33
  406. data/test/rubygems/test_gem_commands_lock_command.rb +0 -67
  407. data/test/rubygems/test_gem_commands_mirror.rb +0 -20
  408. data/test/rubygems/test_gem_commands_open_command.rb +0 -101
  409. data/test/rubygems/test_gem_commands_outdated_command.rb +0 -50
  410. data/test/rubygems/test_gem_commands_owner_command.rb +0 -503
  411. data/test/rubygems/test_gem_commands_pristine_command.rb +0 -708
  412. data/test/rubygems/test_gem_commands_push_command.rb +0 -603
  413. data/test/rubygems/test_gem_commands_query_command.rb +0 -858
  414. data/test/rubygems/test_gem_commands_search_command.rb +0 -16
  415. data/test/rubygems/test_gem_commands_server_command.rb +0 -20
  416. data/test/rubygems/test_gem_commands_setup_command.rb +0 -474
  417. data/test/rubygems/test_gem_commands_signin_command.rb +0 -259
  418. data/test/rubygems/test_gem_commands_signout_command.rb +0 -30
  419. data/test/rubygems/test_gem_commands_sources_command.rb +0 -534
  420. data/test/rubygems/test_gem_commands_specification_command.rb +0 -277
  421. data/test/rubygems/test_gem_commands_stale_command.rb +0 -43
  422. data/test/rubygems/test_gem_commands_uninstall_command.rb +0 -542
  423. data/test/rubygems/test_gem_commands_unpack_command.rb +0 -224
  424. data/test/rubygems/test_gem_commands_update_command.rb +0 -836
  425. data/test/rubygems/test_gem_commands_which_command.rb +0 -85
  426. data/test/rubygems/test_gem_commands_yank_command.rb +0 -299
  427. data/test/rubygems/test_gem_config_file.rb +0 -551
  428. data/test/rubygems/test_gem_dependency.rb +0 -398
  429. data/test/rubygems/test_gem_dependency_installer.rb +0 -1190
  430. data/test/rubygems/test_gem_dependency_list.rb +0 -265
  431. data/test/rubygems/test_gem_dependency_resolution_error.rb +0 -27
  432. data/test/rubygems/test_gem_doctor.rb +0 -195
  433. data/test/rubygems/test_gem_ext_builder.rb +0 -337
  434. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/.gitignore +0 -1
  435. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/custom_name.gemspec +0 -10
  436. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/Cargo.lock +0 -249
  437. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/Cargo.toml +0 -10
  438. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/src/lib.rs +0 -27
  439. data/test/rubygems/test_gem_ext_cargo_builder/custom_name/lib/custom_name.rb +0 -3
  440. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/.gitignore +0 -1
  441. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.lock +0 -249
  442. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.toml +0 -10
  443. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/rust_ruby_example.gemspec +0 -10
  444. data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs +0 -51
  445. data/test/rubygems/test_gem_ext_cargo_builder.rb +0 -167
  446. data/test/rubygems/test_gem_ext_cargo_builder_link_flag_converter.rb +0 -34
  447. data/test/rubygems/test_gem_ext_cargo_builder_unit.rb +0 -60
  448. data/test/rubygems/test_gem_ext_cmake_builder.rb +0 -84
  449. data/test/rubygems/test_gem_ext_configure_builder.rb +0 -80
  450. data/test/rubygems/test_gem_ext_ext_conf_builder.rb +0 -229
  451. data/test/rubygems/test_gem_ext_rake_builder.rb +0 -113
  452. data/test/rubygems/test_gem_gem_runner.rb +0 -119
  453. data/test/rubygems/test_gem_gemcutter_utilities.rb +0 -361
  454. data/test/rubygems/test_gem_impossible_dependencies_error.rb +0 -60
  455. data/test/rubygems/test_gem_indexer.rb +0 -381
  456. data/test/rubygems/test_gem_install_update_options.rb +0 -208
  457. data/test/rubygems/test_gem_installer.rb +0 -2512
  458. data/test/rubygems/test_gem_local_remote_options.rb +0 -133
  459. data/test/rubygems/test_gem_name_tuple.rb +0 -43
  460. data/test/rubygems/test_gem_package.rb +0 -1306
  461. data/test/rubygems/test_gem_package_old.rb +0 -91
  462. data/test/rubygems/test_gem_package_tar_header.rb +0 -226
  463. data/test/rubygems/test_gem_package_tar_reader.rb +0 -150
  464. data/test/rubygems/test_gem_package_tar_reader_entry.rb +0 -350
  465. data/test/rubygems/test_gem_package_tar_writer.rb +0 -331
  466. data/test/rubygems/test_gem_package_task.rb +0 -118
  467. data/test/rubygems/test_gem_path_support.rb +0 -139
  468. data/test/rubygems/test_gem_platform.rb +0 -497
  469. data/test/rubygems/test_gem_rdoc.rb +0 -137
  470. data/test/rubygems/test_gem_remote_fetcher.rb +0 -1227
  471. data/test/rubygems/test_gem_request.rb +0 -547
  472. data/test/rubygems/test_gem_request_connection_pools.rb +0 -152
  473. data/test/rubygems/test_gem_request_set.rb +0 -672
  474. data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +0 -853
  475. data/test/rubygems/test_gem_request_set_lockfile.rb +0 -469
  476. data/test/rubygems/test_gem_request_set_lockfile_parser.rb +0 -544
  477. data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +0 -307
  478. data/test/rubygems/test_gem_requirement.rb +0 -505
  479. data/test/rubygems/test_gem_resolver.rb +0 -859
  480. data/test/rubygems/test_gem_resolver_activation_request.rb +0 -43
  481. data/test/rubygems/test_gem_resolver_api_set.rb +0 -210
  482. data/test/rubygems/test_gem_resolver_api_specification.rb +0 -167
  483. data/test/rubygems/test_gem_resolver_best_set.rb +0 -159
  484. data/test/rubygems/test_gem_resolver_composed_set.rb +0 -44
  485. data/test/rubygems/test_gem_resolver_conflict.rb +0 -82
  486. data/test/rubygems/test_gem_resolver_dependency_request.rb +0 -83
  487. data/test/rubygems/test_gem_resolver_git_set.rb +0 -188
  488. data/test/rubygems/test_gem_resolver_git_specification.rb +0 -114
  489. data/test/rubygems/test_gem_resolver_index_set.rb +0 -88
  490. data/test/rubygems/test_gem_resolver_index_specification.rb +0 -93
  491. data/test/rubygems/test_gem_resolver_installed_specification.rb +0 -47
  492. data/test/rubygems/test_gem_resolver_installer_set.rb +0 -320
  493. data/test/rubygems/test_gem_resolver_local_specification.rb +0 -44
  494. data/test/rubygems/test_gem_resolver_lock_set.rb +0 -62
  495. data/test/rubygems/test_gem_resolver_lock_specification.rb +0 -98
  496. data/test/rubygems/test_gem_resolver_requirement_list.rb +0 -19
  497. data/test/rubygems/test_gem_resolver_specification.rb +0 -63
  498. data/test/rubygems/test_gem_resolver_vendor_set.rb +0 -82
  499. data/test/rubygems/test_gem_resolver_vendor_specification.rb +0 -82
  500. data/test/rubygems/test_gem_security.rb +0 -341
  501. data/test/rubygems/test_gem_security_policy.rb +0 -535
  502. data/test/rubygems/test_gem_security_signer.rb +0 -218
  503. data/test/rubygems/test_gem_security_trust_dir.rb +0 -99
  504. data/test/rubygems/test_gem_silent_ui.rb +0 -123
  505. data/test/rubygems/test_gem_source.rb +0 -254
  506. data/test/rubygems/test_gem_source_fetch_problem.rb +0 -37
  507. data/test/rubygems/test_gem_source_git.rb +0 -310
  508. data/test/rubygems/test_gem_source_installed.rb +0 -35
  509. data/test/rubygems/test_gem_source_list.rb +0 -119
  510. data/test/rubygems/test_gem_source_local.rb +0 -107
  511. data/test/rubygems/test_gem_source_lock.rb +0 -113
  512. data/test/rubygems/test_gem_source_specific_file.rb +0 -76
  513. data/test/rubygems/test_gem_source_subpath_problem.rb +0 -50
  514. data/test/rubygems/test_gem_source_vendor.rb +0 -30
  515. data/test/rubygems/test_gem_spec_fetcher.rb +0 -338
  516. data/test/rubygems/test_gem_specification.rb +0 -3856
  517. data/test/rubygems/test_gem_stream_ui.rb +0 -255
  518. data/test/rubygems/test_gem_stub_specification.rb +0 -278
  519. data/test/rubygems/test_gem_text.rb +0 -103
  520. data/test/rubygems/test_gem_uninstaller.rb +0 -675
  521. data/test/rubygems/test_gem_unsatisfiable_dependency_error.rb +0 -31
  522. data/test/rubygems/test_gem_update_suggestion.rb +0 -209
  523. data/test/rubygems/test_gem_uri.rb +0 -41
  524. data/test/rubygems/test_gem_uri_formatter.rb +0 -27
  525. data/test/rubygems/test_gem_util.rb +0 -91
  526. data/test/rubygems/test_gem_validator.rb +0 -42
  527. data/test/rubygems/test_gem_version.rb +0 -305
  528. data/test/rubygems/test_gem_version_option.rb +0 -165
  529. data/test/rubygems/test_kernel.rb +0 -124
  530. data/test/rubygems/test_project_sanity.rb +0 -49
  531. data/test/rubygems/test_remote_fetch_error.rb +0 -20
  532. data/test/rubygems/test_require.rb +0 -732
  533. data/test/rubygems/test_rubygems.rb +0 -76
  534. data/test/rubygems/test_webauthn_listener.rb +0 -143
  535. data/test/rubygems/test_webauthn_listener_response.rb +0 -93
  536. data/test/rubygems/test_webauthn_poller.rb +0 -124
  537. data/test/rubygems/utilities.rb +0 -436
  538. data/test/rubygems/wrong_key_cert.pem +0 -19
  539. data/test/rubygems/wrong_key_cert_32.pem +0 -19
  540. data/test/test_changelog_generator.rb +0 -17
@@ -0,0 +1,738 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This class is the base class for \Gem::Net::HTTP response classes.
4
+ #
5
+ # == About the Examples
6
+ #
7
+ # :include: doc/net-http/examples.rdoc
8
+ #
9
+ # == Returned Responses
10
+ #
11
+ # \Method Gem::Net::HTTP.get_response returns
12
+ # an instance of one of the subclasses of \Gem::Net::HTTPResponse:
13
+ #
14
+ # Gem::Net::HTTP.get_response(uri)
15
+ # # => #<Gem::Net::HTTPOK 200 OK readbody=true>
16
+ # Gem::Net::HTTP.get_response(hostname, '/nosuch')
17
+ # # => #<Gem::Net::HTTPNotFound 404 Not Found readbody=true>
18
+ #
19
+ # As does method Gem::Net::HTTP#request:
20
+ #
21
+ # req = Gem::Net::HTTP::Get.new(uri)
22
+ # Gem::Net::HTTP.start(hostname) do |http|
23
+ # http.request(req)
24
+ # end # => #<Gem::Net::HTTPOK 200 OK readbody=true>
25
+ #
26
+ # \Class \Gem::Net::HTTPResponse includes module Gem::Net::HTTPHeader,
27
+ # which provides access to response header values via (among others):
28
+ #
29
+ # - \Hash-like method <tt>[]</tt>.
30
+ # - Specific reader methods, such as +content_type+.
31
+ #
32
+ # Examples:
33
+ #
34
+ # res = Gem::Net::HTTP.get_response(uri) # => #<Gem::Net::HTTPOK 200 OK readbody=true>
35
+ # res['Content-Type'] # => "text/html; charset=UTF-8"
36
+ # res.content_type # => "text/html"
37
+ #
38
+ # == Response Subclasses
39
+ #
40
+ # \Class \Gem::Net::HTTPResponse has a subclass for each
41
+ # {HTTP status code}[https://en.wikipedia.org/wiki/List_of_HTTP_status_codes].
42
+ # You can look up the response class for a given code:
43
+ #
44
+ # Gem::Net::HTTPResponse::CODE_TO_OBJ['200'] # => Gem::Net::HTTPOK
45
+ # Gem::Net::HTTPResponse::CODE_TO_OBJ['400'] # => Gem::Net::HTTPBadRequest
46
+ # Gem::Net::HTTPResponse::CODE_TO_OBJ['404'] # => Gem::Net::HTTPNotFound
47
+ #
48
+ # And you can retrieve the status code for a response object:
49
+ #
50
+ # Gem::Net::HTTP.get_response(uri).code # => "200"
51
+ # Gem::Net::HTTP.get_response(hostname, '/nosuch').code # => "404"
52
+ #
53
+ # The response subclasses (indentation shows class hierarchy):
54
+ #
55
+ # - Gem::Net::HTTPUnknownResponse (for unhandled \HTTP extensions).
56
+ #
57
+ # - Gem::Net::HTTPInformation:
58
+ #
59
+ # - Gem::Net::HTTPContinue (100)
60
+ # - Gem::Net::HTTPSwitchProtocol (101)
61
+ # - Gem::Net::HTTPProcessing (102)
62
+ # - Gem::Net::HTTPEarlyHints (103)
63
+ #
64
+ # - Gem::Net::HTTPSuccess:
65
+ #
66
+ # - Gem::Net::HTTPOK (200)
67
+ # - Gem::Net::HTTPCreated (201)
68
+ # - Gem::Net::HTTPAccepted (202)
69
+ # - Gem::Net::HTTPNonAuthoritativeInformation (203)
70
+ # - Gem::Net::HTTPNoContent (204)
71
+ # - Gem::Net::HTTPResetContent (205)
72
+ # - Gem::Net::HTTPPartialContent (206)
73
+ # - Gem::Net::HTTPMultiStatus (207)
74
+ # - Gem::Net::HTTPAlreadyReported (208)
75
+ # - Gem::Net::HTTPIMUsed (226)
76
+ #
77
+ # - Gem::Net::HTTPRedirection:
78
+ #
79
+ # - Gem::Net::HTTPMultipleChoices (300)
80
+ # - Gem::Net::HTTPMovedPermanently (301)
81
+ # - Gem::Net::HTTPFound (302)
82
+ # - Gem::Net::HTTPSeeOther (303)
83
+ # - Gem::Net::HTTPNotModified (304)
84
+ # - Gem::Net::HTTPUseProxy (305)
85
+ # - Gem::Net::HTTPTemporaryRedirect (307)
86
+ # - Gem::Net::HTTPPermanentRedirect (308)
87
+ #
88
+ # - Gem::Net::HTTPClientError:
89
+ #
90
+ # - Gem::Net::HTTPBadRequest (400)
91
+ # - Gem::Net::HTTPUnauthorized (401)
92
+ # - Gem::Net::HTTPPaymentRequired (402)
93
+ # - Gem::Net::HTTPForbidden (403)
94
+ # - Gem::Net::HTTPNotFound (404)
95
+ # - Gem::Net::HTTPMethodNotAllowed (405)
96
+ # - Gem::Net::HTTPNotAcceptable (406)
97
+ # - Gem::Net::HTTPProxyAuthenticationRequired (407)
98
+ # - Gem::Net::HTTPRequestTimeOut (408)
99
+ # - Gem::Net::HTTPConflict (409)
100
+ # - Gem::Net::HTTPGone (410)
101
+ # - Gem::Net::HTTPLengthRequired (411)
102
+ # - Gem::Net::HTTPPreconditionFailed (412)
103
+ # - Gem::Net::HTTPRequestEntityTooLarge (413)
104
+ # - Gem::Net::HTTPRequestURITooLong (414)
105
+ # - Gem::Net::HTTPUnsupportedMediaType (415)
106
+ # - Gem::Net::HTTPRequestedRangeNotSatisfiable (416)
107
+ # - Gem::Net::HTTPExpectationFailed (417)
108
+ # - Gem::Net::HTTPMisdirectedRequest (421)
109
+ # - Gem::Net::HTTPUnprocessableEntity (422)
110
+ # - Gem::Net::HTTPLocked (423)
111
+ # - Gem::Net::HTTPFailedDependency (424)
112
+ # - Gem::Net::HTTPUpgradeRequired (426)
113
+ # - Gem::Net::HTTPPreconditionRequired (428)
114
+ # - Gem::Net::HTTPTooManyRequests (429)
115
+ # - Gem::Net::HTTPRequestHeaderFieldsTooLarge (431)
116
+ # - Gem::Net::HTTPUnavailableForLegalReasons (451)
117
+ #
118
+ # - Gem::Net::HTTPServerError:
119
+ #
120
+ # - Gem::Net::HTTPInternalServerError (500)
121
+ # - Gem::Net::HTTPNotImplemented (501)
122
+ # - Gem::Net::HTTPBadGateway (502)
123
+ # - Gem::Net::HTTPServiceUnavailable (503)
124
+ # - Gem::Net::HTTPGatewayTimeOut (504)
125
+ # - Gem::Net::HTTPVersionNotSupported (505)
126
+ # - Gem::Net::HTTPVariantAlsoNegotiates (506)
127
+ # - Gem::Net::HTTPInsufficientStorage (507)
128
+ # - Gem::Net::HTTPLoopDetected (508)
129
+ # - Gem::Net::HTTPNotExtended (510)
130
+ # - Gem::Net::HTTPNetworkAuthenticationRequired (511)
131
+ #
132
+ # There is also the Gem::Net::HTTPBadResponse exception which is raised when
133
+ # there is a protocol error.
134
+ #
135
+ class Gem::Net::HTTPResponse
136
+ class << self
137
+ # true if the response has a body.
138
+ def body_permitted?
139
+ self::HAS_BODY
140
+ end
141
+
142
+ def exception_type # :nodoc: internal use only
143
+ self::EXCEPTION_TYPE
144
+ end
145
+
146
+ def read_new(sock) #:nodoc: internal use only
147
+ httpv, code, msg = read_status_line(sock)
148
+ res = response_class(code).new(httpv, code, msg)
149
+ each_response_header(sock) do |k,v|
150
+ res.add_field k, v
151
+ end
152
+ res
153
+ end
154
+
155
+ private
156
+
157
+ def read_status_line(sock)
158
+ str = sock.readline
159
+ m = /\AHTTP(?:\/(\d+\.\d+))?\s+(\d\d\d)(?:\s+(.*))?\z/in.match(str) or
160
+ raise Gem::Net::HTTPBadResponse, "wrong status line: #{str.dump}"
161
+ m.captures
162
+ end
163
+
164
+ def response_class(code)
165
+ CODE_TO_OBJ[code] or
166
+ CODE_CLASS_TO_OBJ[code[0,1]] or
167
+ Gem::Net::HTTPUnknownResponse
168
+ end
169
+
170
+ def each_response_header(sock)
171
+ key = value = nil
172
+ while true
173
+ line = sock.readuntil("\n", true).sub(/\s+\z/, '')
174
+ break if line.empty?
175
+ if line[0] == ?\s or line[0] == ?\t and value
176
+ value << ' ' unless value.empty?
177
+ value << line.strip
178
+ else
179
+ yield key, value if key
180
+ key, value = line.strip.split(/\s*:\s*/, 2)
181
+ raise Gem::Net::HTTPBadResponse, 'wrong header line format' if value.nil?
182
+ end
183
+ end
184
+ yield key, value if key
185
+ end
186
+ end
187
+
188
+ # next is to fix bug in RDoc, where the private inside class << self
189
+ # spills out.
190
+ public
191
+
192
+ include Gem::Net::HTTPHeader
193
+
194
+ def initialize(httpv, code, msg) #:nodoc: internal use only
195
+ @http_version = httpv
196
+ @code = code
197
+ @message = msg
198
+ initialize_http_header nil
199
+ @body = nil
200
+ @read = false
201
+ @uri = nil
202
+ @decode_content = false
203
+ @body_encoding = false
204
+ @ignore_eof = true
205
+ end
206
+
207
+ # The HTTP version supported by the server.
208
+ attr_reader :http_version
209
+
210
+ # The HTTP result code string. For example, '302'. You can also
211
+ # determine the response type by examining which response subclass
212
+ # the response object is an instance of.
213
+ attr_reader :code
214
+
215
+ # The HTTP result message sent by the server. For example, 'Not Found'.
216
+ attr_reader :message
217
+ alias msg message # :nodoc: obsolete
218
+
219
+ # The URI used to fetch this response. The response URI is only available
220
+ # if a URI was used to create the request.
221
+ attr_reader :uri
222
+
223
+ # Set to true automatically when the request did not contain an
224
+ # Accept-Encoding header from the user.
225
+ attr_accessor :decode_content
226
+
227
+ # Returns the value set by body_encoding=, or +false+ if none;
228
+ # see #body_encoding=.
229
+ attr_reader :body_encoding
230
+
231
+ # Sets the encoding that should be used when reading the body:
232
+ #
233
+ # - If the given value is an Encoding object, that encoding will be used.
234
+ # - Otherwise if the value is a string, the value of
235
+ # {Encoding#find(value)}[https://docs.ruby-lang.org/en/master/Encoding.html#method-c-find]
236
+ # will be used.
237
+ # - Otherwise an encoding will be deduced from the body itself.
238
+ #
239
+ # Examples:
240
+ #
241
+ # http = Gem::Net::HTTP.new(hostname)
242
+ # req = Gem::Net::HTTP::Get.new('/')
243
+ #
244
+ # http.request(req) do |res|
245
+ # p res.body.encoding # => #<Encoding:ASCII-8BIT>
246
+ # end
247
+ #
248
+ # http.request(req) do |res|
249
+ # res.body_encoding = "UTF-8"
250
+ # p res.body.encoding # => #<Encoding:UTF-8>
251
+ # end
252
+ #
253
+ def body_encoding=(value)
254
+ value = Encoding.find(value) if value.is_a?(String)
255
+ @body_encoding = value
256
+ end
257
+
258
+ # Whether to ignore EOF when reading bodies with a specified Content-Length
259
+ # header.
260
+ attr_accessor :ignore_eof
261
+
262
+ def inspect
263
+ "#<#{self.class} #{@code} #{@message} readbody=#{@read}>"
264
+ end
265
+
266
+ #
267
+ # response <-> exception relationship
268
+ #
269
+
270
+ def code_type #:nodoc:
271
+ self.class
272
+ end
273
+
274
+ def error! #:nodoc:
275
+ message = @code
276
+ message = "#{message} #{@message.dump}" if @message
277
+ raise error_type().new(message, self)
278
+ end
279
+
280
+ def error_type #:nodoc:
281
+ self.class::EXCEPTION_TYPE
282
+ end
283
+
284
+ # Raises an HTTP error if the response is not 2xx (success).
285
+ def value
286
+ error! unless self.kind_of?(Gem::Net::HTTPSuccess)
287
+ end
288
+
289
+ def uri= uri # :nodoc:
290
+ @uri = uri.dup if uri
291
+ end
292
+
293
+ #
294
+ # header (for backward compatibility only; DO NOT USE)
295
+ #
296
+
297
+ def response #:nodoc:
298
+ warn "Gem::Net::HTTPResponse#response is obsolete", uplevel: 1 if $VERBOSE
299
+ self
300
+ end
301
+
302
+ def header #:nodoc:
303
+ warn "Gem::Net::HTTPResponse#header is obsolete", uplevel: 1 if $VERBOSE
304
+ self
305
+ end
306
+
307
+ def read_header #:nodoc:
308
+ warn "Gem::Net::HTTPResponse#read_header is obsolete", uplevel: 1 if $VERBOSE
309
+ self
310
+ end
311
+
312
+ #
313
+ # body
314
+ #
315
+
316
+ def reading_body(sock, reqmethodallowbody) #:nodoc: internal use only
317
+ @socket = sock
318
+ @body_exist = reqmethodallowbody && self.class.body_permitted?
319
+ begin
320
+ yield
321
+ self.body # ensure to read body
322
+ ensure
323
+ @socket = nil
324
+ end
325
+ end
326
+
327
+ # Gets the entity body returned by the remote HTTP server.
328
+ #
329
+ # If a block is given, the body is passed to the block, and
330
+ # the body is provided in fragments, as it is read in from the socket.
331
+ #
332
+ # If +dest+ argument is given, response is read into that variable,
333
+ # with <code>dest#<<</code> method (it could be String or IO, or any
334
+ # other object responding to <code><<</code>).
335
+ #
336
+ # Calling this method a second or subsequent time for the same
337
+ # HTTPResponse object will return the value already read.
338
+ #
339
+ # http.request_get('/index.html') {|res|
340
+ # puts res.read_body
341
+ # }
342
+ #
343
+ # http.request_get('/index.html') {|res|
344
+ # p res.read_body.object_id # 538149362
345
+ # p res.read_body.object_id # 538149362
346
+ # }
347
+ #
348
+ # # using iterator
349
+ # http.request_get('/index.html') {|res|
350
+ # res.read_body do |segment|
351
+ # print segment
352
+ # end
353
+ # }
354
+ #
355
+ def read_body(dest = nil, &block)
356
+ if @read
357
+ raise IOError, "#{self.class}\#read_body called twice" if dest or block
358
+ return @body
359
+ end
360
+ to = procdest(dest, block)
361
+ stream_check
362
+ if @body_exist
363
+ read_body_0 to
364
+ @body = to
365
+ else
366
+ @body = nil
367
+ end
368
+ @read = true
369
+ return if @body.nil?
370
+
371
+ case enc = @body_encoding
372
+ when Encoding, false, nil
373
+ # Encoding: force given encoding
374
+ # false/nil: do not force encoding
375
+ else
376
+ # other value: detect encoding from body
377
+ enc = detect_encoding(@body)
378
+ end
379
+
380
+ @body.force_encoding(enc) if enc
381
+
382
+ @body
383
+ end
384
+
385
+ # Returns the string response body;
386
+ # note that repeated calls for the unmodified body return a cached string:
387
+ #
388
+ # path = '/todos/1'
389
+ # Gem::Net::HTTP.start(hostname) do |http|
390
+ # res = http.get(path)
391
+ # p res.body
392
+ # p http.head(path).body # No body.
393
+ # end
394
+ #
395
+ # Output:
396
+ #
397
+ # "{\n \"userId\": 1,\n \"id\": 1,\n \"title\": \"delectus aut autem\",\n \"completed\": false\n}"
398
+ # nil
399
+ #
400
+ def body
401
+ read_body()
402
+ end
403
+
404
+ # Sets the body of the response to the given value.
405
+ def body=(value)
406
+ @body = value
407
+ end
408
+
409
+ alias entity body #:nodoc: obsolete
410
+
411
+ private
412
+
413
+ # :nodoc:
414
+ def detect_encoding(str, encoding=nil)
415
+ if encoding
416
+ elsif encoding = type_params['charset']
417
+ elsif encoding = check_bom(str)
418
+ else
419
+ encoding = case content_type&.downcase
420
+ when %r{text/x(?:ht)?ml|application/(?:[^+]+\+)?xml}
421
+ /\A<xml[ \t\r\n]+
422
+ version[ \t\r\n]*=[ \t\r\n]*(?:"[0-9.]+"|'[0-9.]*')[ \t\r\n]+
423
+ encoding[ \t\r\n]*=[ \t\r\n]*
424
+ (?:"([A-Za-z][\-A-Za-z0-9._]*)"|'([A-Za-z][\-A-Za-z0-9._]*)')/x =~ str
425
+ encoding = $1 || $2 || Encoding::UTF_8
426
+ when %r{text/html.*}
427
+ sniff_encoding(str)
428
+ end
429
+ end
430
+ return encoding
431
+ end
432
+
433
+ # :nodoc:
434
+ def sniff_encoding(str, encoding=nil)
435
+ # the encoding sniffing algorithm
436
+ # http://www.w3.org/TR/html5/parsing.html#determining-the-character-encoding
437
+ if enc = scanning_meta(str)
438
+ enc
439
+ # 6. last visited page or something
440
+ # 7. frequency
441
+ elsif str.ascii_only?
442
+ Encoding::US_ASCII
443
+ elsif str.dup.force_encoding(Encoding::UTF_8).valid_encoding?
444
+ Encoding::UTF_8
445
+ end
446
+ # 8. implementation-defined or user-specified
447
+ end
448
+
449
+ # :nodoc:
450
+ def check_bom(str)
451
+ case str.byteslice(0, 2)
452
+ when "\xFE\xFF"
453
+ return Encoding::UTF_16BE
454
+ when "\xFF\xFE"
455
+ return Encoding::UTF_16LE
456
+ end
457
+ if "\xEF\xBB\xBF" == str.byteslice(0, 3)
458
+ return Encoding::UTF_8
459
+ end
460
+ nil
461
+ end
462
+
463
+ # :nodoc:
464
+ def scanning_meta(str)
465
+ require 'strscan'
466
+ ss = StringScanner.new(str)
467
+ if ss.scan_until(/<meta[\t\n\f\r ]*/)
468
+ attrs = {} # attribute_list
469
+ got_pragma = false
470
+ need_pragma = nil
471
+ charset = nil
472
+
473
+ # step: Attributes
474
+ while attr = get_attribute(ss)
475
+ name, value = *attr
476
+ next if attrs[name]
477
+ attrs[name] = true
478
+ case name
479
+ when 'http-equiv'
480
+ got_pragma = true if value == 'content-type'
481
+ when 'content'
482
+ encoding = extracting_encodings_from_meta_elements(value)
483
+ unless charset
484
+ charset = encoding
485
+ end
486
+ need_pragma = true
487
+ when 'charset'
488
+ need_pragma = false
489
+ charset = value
490
+ end
491
+ end
492
+
493
+ # step: Processing
494
+ return if need_pragma.nil?
495
+ return if need_pragma && !got_pragma
496
+
497
+ charset = Encoding.find(charset) rescue nil
498
+ return unless charset
499
+ charset = Encoding::UTF_8 if charset == Encoding::UTF_16
500
+ return charset # tentative
501
+ end
502
+ nil
503
+ end
504
+
505
+ def get_attribute(ss)
506
+ ss.scan(/[\t\n\f\r \/]*/)
507
+ if ss.peek(1) == '>'
508
+ ss.getch
509
+ return nil
510
+ end
511
+ name = ss.scan(/[^=\t\n\f\r \/>]*/)
512
+ name.downcase!
513
+ raise if name.empty?
514
+ ss.skip(/[\t\n\f\r ]*/)
515
+ if ss.getch != '='
516
+ value = ''
517
+ return [name, value]
518
+ end
519
+ ss.skip(/[\t\n\f\r ]*/)
520
+ case ss.peek(1)
521
+ when '"'
522
+ ss.getch
523
+ value = ss.scan(/[^"]+/)
524
+ value.downcase!
525
+ ss.getch
526
+ when "'"
527
+ ss.getch
528
+ value = ss.scan(/[^']+/)
529
+ value.downcase!
530
+ ss.getch
531
+ when '>'
532
+ value = ''
533
+ else
534
+ value = ss.scan(/[^\t\n\f\r >]+/)
535
+ value.downcase!
536
+ end
537
+ [name, value]
538
+ end
539
+
540
+ def extracting_encodings_from_meta_elements(value)
541
+ # http://dev.w3.org/html5/spec/fetching-resources.html#algorithm-for-extracting-an-encoding-from-a-meta-element
542
+ if /charset[\t\n\f\r ]*=(?:"([^"]*)"|'([^']*)'|["']|\z|([^\t\n\f\r ;]+))/i =~ value
543
+ return $1 || $2 || $3
544
+ end
545
+ return nil
546
+ end
547
+
548
+ ##
549
+ # Checks for a supported Content-Encoding header and yields an Inflate
550
+ # wrapper for this response's socket when zlib is present. If the
551
+ # Content-Encoding is not supported or zlib is missing, the plain socket is
552
+ # yielded.
553
+ #
554
+ # If a Content-Range header is present, a plain socket is yielded as the
555
+ # bytes in the range may not be a complete deflate block.
556
+
557
+ def inflater # :nodoc:
558
+ return yield @socket unless Gem::Net::HTTP::HAVE_ZLIB
559
+ return yield @socket unless @decode_content
560
+ return yield @socket if self['content-range']
561
+
562
+ v = self['content-encoding']
563
+ case v&.downcase
564
+ when 'deflate', 'gzip', 'x-gzip' then
565
+ self.delete 'content-encoding'
566
+
567
+ inflate_body_io = Inflater.new(@socket)
568
+
569
+ begin
570
+ yield inflate_body_io
571
+ success = true
572
+ ensure
573
+ begin
574
+ inflate_body_io.finish
575
+ if self['content-length']
576
+ self['content-length'] = inflate_body_io.bytes_inflated.to_s
577
+ end
578
+ rescue => err
579
+ # Ignore #finish's error if there is an exception from yield
580
+ raise err if success
581
+ end
582
+ end
583
+ when 'none', 'identity' then
584
+ self.delete 'content-encoding'
585
+
586
+ yield @socket
587
+ else
588
+ yield @socket
589
+ end
590
+ end
591
+
592
+ def read_body_0(dest)
593
+ inflater do |inflate_body_io|
594
+ if chunked?
595
+ read_chunked dest, inflate_body_io
596
+ return
597
+ end
598
+
599
+ @socket = inflate_body_io
600
+
601
+ clen = content_length()
602
+ if clen
603
+ @socket.read clen, dest, @ignore_eof
604
+ return
605
+ end
606
+ clen = range_length()
607
+ if clen
608
+ @socket.read clen, dest
609
+ return
610
+ end
611
+ @socket.read_all dest
612
+ end
613
+ end
614
+
615
+ ##
616
+ # read_chunked reads from +@socket+ for chunk-size, chunk-extension, CRLF,
617
+ # etc. and +chunk_data_io+ for chunk-data which may be deflate or gzip
618
+ # encoded.
619
+ #
620
+ # See RFC 2616 section 3.6.1 for definitions
621
+
622
+ def read_chunked(dest, chunk_data_io) # :nodoc:
623
+ total = 0
624
+ while true
625
+ line = @socket.readline
626
+ hexlen = line.slice(/[0-9a-fA-F]+/) or
627
+ raise Gem::Net::HTTPBadResponse, "wrong chunk size line: #{line}"
628
+ len = hexlen.hex
629
+ break if len == 0
630
+ begin
631
+ chunk_data_io.read len, dest
632
+ ensure
633
+ total += len
634
+ @socket.read 2 # \r\n
635
+ end
636
+ end
637
+ until @socket.readline.empty?
638
+ # none
639
+ end
640
+ end
641
+
642
+ def stream_check
643
+ raise IOError, 'attempt to read body out of block' if @socket.nil? || @socket.closed?
644
+ end
645
+
646
+ def procdest(dest, block)
647
+ raise ArgumentError, 'both arg and block given for HTTP method' if
648
+ dest and block
649
+ if block
650
+ Gem::Net::ReadAdapter.new(block)
651
+ else
652
+ dest || +''
653
+ end
654
+ end
655
+
656
+ ##
657
+ # Inflater is a wrapper around Gem::Net::BufferedIO that transparently inflates
658
+ # zlib and gzip streams.
659
+
660
+ class Inflater # :nodoc:
661
+
662
+ ##
663
+ # Creates a new Inflater wrapping +socket+
664
+
665
+ def initialize socket
666
+ @socket = socket
667
+ # zlib with automatic gzip detection
668
+ @inflate = Zlib::Inflate.new(32 + Zlib::MAX_WBITS)
669
+ end
670
+
671
+ ##
672
+ # Finishes the inflate stream.
673
+
674
+ def finish
675
+ return if @inflate.total_in == 0
676
+ @inflate.finish
677
+ end
678
+
679
+ ##
680
+ # The number of bytes inflated, used to update the Content-Length of
681
+ # the response.
682
+
683
+ def bytes_inflated
684
+ @inflate.total_out
685
+ end
686
+
687
+ ##
688
+ # Returns a Gem::Net::ReadAdapter that inflates each read chunk into +dest+.
689
+ #
690
+ # This allows a large response body to be inflated without storing the
691
+ # entire body in memory.
692
+
693
+ def inflate_adapter(dest)
694
+ if dest.respond_to?(:set_encoding)
695
+ dest.set_encoding(Encoding::ASCII_8BIT)
696
+ elsif dest.respond_to?(:force_encoding)
697
+ dest.force_encoding(Encoding::ASCII_8BIT)
698
+ end
699
+ block = proc do |compressed_chunk|
700
+ @inflate.inflate(compressed_chunk) do |chunk|
701
+ compressed_chunk.clear
702
+ dest << chunk
703
+ end
704
+ end
705
+
706
+ Gem::Net::ReadAdapter.new(block)
707
+ end
708
+
709
+ ##
710
+ # Reads +clen+ bytes from the socket, inflates them, then writes them to
711
+ # +dest+. +ignore_eof+ is passed down to Gem::Net::BufferedIO#read
712
+ #
713
+ # Unlike Gem::Net::BufferedIO#read, this method returns more than +clen+ bytes.
714
+ # At this time there is no way for a user of Gem::Net::HTTPResponse to read a
715
+ # specific number of bytes from the HTTP response body, so this internal
716
+ # API does not return the same number of bytes as were requested.
717
+ #
718
+ # See https://bugs.ruby-lang.org/issues/6492 for further discussion.
719
+
720
+ def read clen, dest, ignore_eof = false
721
+ temp_dest = inflate_adapter(dest)
722
+
723
+ @socket.read clen, temp_dest, ignore_eof
724
+ end
725
+
726
+ ##
727
+ # Reads the rest of the socket, inflates it, then writes it to +dest+.
728
+
729
+ def read_all dest
730
+ temp_dest = inflate_adapter(dest)
731
+
732
+ @socket.read_all temp_dest
733
+ end
734
+
735
+ end
736
+
737
+ end
738
+