rubygems-update 2.6.0 → 3.5.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (812) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +5941 -0
  3. data/CODE_OF_CONDUCT.md +76 -35
  4. data/CONTRIBUTING.md +231 -0
  5. data/MAINTAINERS.txt +8 -0
  6. data/Manifest.txt +439 -216
  7. data/POLICIES.md +135 -0
  8. data/README.md +112 -0
  9. data/UPGRADING.md +15 -0
  10. data/bundler/CHANGELOG.md +4753 -0
  11. data/bundler/LICENSE.md +22 -0
  12. data/bundler/README.md +58 -0
  13. data/bundler/UPGRADING.md +222 -0
  14. data/bundler/bundler.gemspec +46 -0
  15. data/bundler/exe/bundle +29 -0
  16. data/bundler/exe/bundler +4 -0
  17. data/bundler/lib/bundler/.document +1 -0
  18. data/bundler/lib/bundler/build_metadata.rb +45 -0
  19. data/bundler/lib/bundler/capistrano.rb +22 -0
  20. data/bundler/lib/bundler/checksum.rb +254 -0
  21. data/bundler/lib/bundler/ci_detector.rb +75 -0
  22. data/bundler/lib/bundler/cli/add.rb +47 -0
  23. data/bundler/lib/bundler/cli/binstubs.rb +57 -0
  24. data/bundler/lib/bundler/cli/cache.rb +43 -0
  25. data/bundler/lib/bundler/cli/check.rb +40 -0
  26. data/bundler/lib/bundler/cli/clean.rb +25 -0
  27. data/bundler/lib/bundler/cli/common.rb +138 -0
  28. data/bundler/lib/bundler/cli/config.rb +204 -0
  29. data/bundler/lib/bundler/cli/console.rb +44 -0
  30. data/bundler/lib/bundler/cli/doctor.rb +157 -0
  31. data/bundler/lib/bundler/cli/exec.rb +88 -0
  32. data/bundler/lib/bundler/cli/fund.rb +36 -0
  33. data/bundler/lib/bundler/cli/gem.rb +471 -0
  34. data/bundler/lib/bundler/cli/info.rb +83 -0
  35. data/bundler/lib/bundler/cli/init.rb +51 -0
  36. data/bundler/lib/bundler/cli/inject.rb +60 -0
  37. data/bundler/lib/bundler/cli/install.rb +190 -0
  38. data/bundler/lib/bundler/cli/issue.rb +41 -0
  39. data/bundler/lib/bundler/cli/list.rb +66 -0
  40. data/bundler/lib/bundler/cli/lock.rb +73 -0
  41. data/bundler/lib/bundler/cli/open.rb +29 -0
  42. data/bundler/lib/bundler/cli/outdated.rb +297 -0
  43. data/bundler/lib/bundler/cli/platform.rb +48 -0
  44. data/bundler/lib/bundler/cli/plugin.rb +34 -0
  45. data/bundler/lib/bundler/cli/pristine.rb +60 -0
  46. data/bundler/lib/bundler/cli/remove.rb +17 -0
  47. data/bundler/lib/bundler/cli/show.rb +75 -0
  48. data/bundler/lib/bundler/cli/update.rb +123 -0
  49. data/bundler/lib/bundler/cli/viz.rb +31 -0
  50. data/bundler/lib/bundler/cli.rb +846 -0
  51. data/bundler/lib/bundler/compact_index_client/cache.rb +121 -0
  52. data/bundler/lib/bundler/compact_index_client/cache_file.rb +153 -0
  53. data/bundler/lib/bundler/compact_index_client/gem_parser.rb +32 -0
  54. data/bundler/lib/bundler/compact_index_client/updater.rb +115 -0
  55. data/bundler/lib/bundler/compact_index_client.rb +126 -0
  56. data/bundler/lib/bundler/constants.rb +7 -0
  57. data/bundler/lib/bundler/current_ruby.rb +92 -0
  58. data/bundler/lib/bundler/definition.rb +1015 -0
  59. data/bundler/lib/bundler/dependency.rb +105 -0
  60. data/bundler/lib/bundler/deployment.rb +69 -0
  61. data/bundler/lib/bundler/deprecate.rb +44 -0
  62. data/bundler/lib/bundler/digest.rb +71 -0
  63. data/bundler/lib/bundler/dsl.rb +604 -0
  64. data/bundler/lib/bundler/endpoint_specification.rb +147 -0
  65. data/bundler/lib/bundler/env.rb +148 -0
  66. data/bundler/lib/bundler/environment_preserver.rb +86 -0
  67. data/bundler/lib/bundler/errors.rb +233 -0
  68. data/bundler/lib/bundler/feature_flag.rb +53 -0
  69. data/bundler/lib/bundler/fetcher/base.rb +52 -0
  70. data/bundler/lib/bundler/fetcher/compact_index.rb +129 -0
  71. data/bundler/lib/bundler/fetcher/dependency.rb +78 -0
  72. data/bundler/lib/bundler/fetcher/downloader.rb +91 -0
  73. data/bundler/lib/bundler/fetcher/gem_remote_fetcher.rb +16 -0
  74. data/bundler/lib/bundler/fetcher/index.rb +25 -0
  75. data/bundler/lib/bundler/fetcher.rb +324 -0
  76. data/bundler/lib/bundler/force_platform.rb +18 -0
  77. data/bundler/lib/bundler/friendly_errors.rb +126 -0
  78. data/bundler/lib/bundler/gem_helper.rb +237 -0
  79. data/bundler/lib/bundler/gem_helpers.rb +127 -0
  80. data/bundler/lib/bundler/gem_tasks.rb +7 -0
  81. data/bundler/lib/bundler/gem_version_promoter.rb +145 -0
  82. data/bundler/lib/bundler/graph.rb +152 -0
  83. data/bundler/lib/bundler/index.rb +205 -0
  84. data/bundler/lib/bundler/injector.rb +287 -0
  85. data/bundler/lib/bundler/inline.rb +73 -0
  86. data/bundler/lib/bundler/installer/gem_installer.rb +84 -0
  87. data/bundler/lib/bundler/installer/parallel_installer.rb +202 -0
  88. data/bundler/lib/bundler/installer/standalone.rb +116 -0
  89. data/bundler/lib/bundler/installer.rb +267 -0
  90. data/bundler/lib/bundler/lazy_specification.rb +172 -0
  91. data/bundler/lib/bundler/lockfile_generator.rb +104 -0
  92. data/bundler/lib/bundler/lockfile_parser.rb +289 -0
  93. data/bundler/lib/bundler/man/.document +1 -0
  94. data/bundler/lib/bundler/man/bundle-add.1 +59 -0
  95. data/bundler/lib/bundler/man/bundle-add.1.ronn +58 -0
  96. data/bundler/lib/bundler/man/bundle-binstubs.1 +30 -0
  97. data/bundler/lib/bundler/man/bundle-binstubs.1.ronn +41 -0
  98. data/bundler/lib/bundler/man/bundle-cache.1 +40 -0
  99. data/bundler/lib/bundler/man/bundle-cache.1.ronn +79 -0
  100. data/bundler/lib/bundler/man/bundle-check.1 +22 -0
  101. data/bundler/lib/bundler/man/bundle-check.1.ronn +26 -0
  102. data/bundler/lib/bundler/man/bundle-clean.1 +17 -0
  103. data/bundler/lib/bundler/man/bundle-clean.1.ronn +18 -0
  104. data/bundler/lib/bundler/man/bundle-config.1 +321 -0
  105. data/bundler/lib/bundler/man/bundle-config.1.ronn +411 -0
  106. data/bundler/lib/bundler/man/bundle-console.1 +35 -0
  107. data/bundler/lib/bundler/man/bundle-console.1.ronn +44 -0
  108. data/bundler/lib/bundler/man/bundle-doctor.1 +30 -0
  109. data/bundler/lib/bundler/man/bundle-doctor.1.ronn +33 -0
  110. data/bundler/lib/bundler/man/bundle-exec.1 +104 -0
  111. data/bundler/lib/bundler/man/bundle-exec.1.ronn +151 -0
  112. data/bundler/lib/bundler/man/bundle-gem.1 +69 -0
  113. data/bundler/lib/bundler/man/bundle-gem.1.ronn +117 -0
  114. data/bundler/lib/bundler/man/bundle-help.1 +9 -0
  115. data/bundler/lib/bundler/man/bundle-help.1.ronn +12 -0
  116. data/bundler/lib/bundler/man/bundle-info.1 +14 -0
  117. data/bundler/lib/bundler/man/bundle-info.1.ronn +17 -0
  118. data/bundler/lib/bundler/man/bundle-init.1 +20 -0
  119. data/bundler/lib/bundler/man/bundle-init.1.ronn +31 -0
  120. data/bundler/lib/bundler/man/bundle-inject.1 +23 -0
  121. data/bundler/lib/bundler/man/bundle-inject.1.ronn +24 -0
  122. data/bundler/lib/bundler/man/bundle-install.1 +215 -0
  123. data/bundler/lib/bundler/man/bundle-install.1.ronn +383 -0
  124. data/bundler/lib/bundler/man/bundle-list.1 +35 -0
  125. data/bundler/lib/bundler/man/bundle-list.1.ronn +33 -0
  126. data/bundler/lib/bundler/man/bundle-lock.1 +60 -0
  127. data/bundler/lib/bundler/man/bundle-lock.1.ronn +94 -0
  128. data/bundler/lib/bundler/man/bundle-open.1 +32 -0
  129. data/bundler/lib/bundler/man/bundle-open.1.ronn +27 -0
  130. data/bundler/lib/bundler/man/bundle-outdated.1 +100 -0
  131. data/bundler/lib/bundler/man/bundle-outdated.1.ronn +106 -0
  132. data/bundler/lib/bundler/man/bundle-platform.1 +49 -0
  133. data/bundler/lib/bundler/man/bundle-platform.1.ronn +49 -0
  134. data/bundler/lib/bundler/man/bundle-plugin.1 +55 -0
  135. data/bundler/lib/bundler/man/bundle-plugin.1.ronn +59 -0
  136. data/bundler/lib/bundler/man/bundle-pristine.1 +23 -0
  137. data/bundler/lib/bundler/man/bundle-pristine.1.ronn +34 -0
  138. data/bundler/lib/bundler/man/bundle-remove.1 +21 -0
  139. data/bundler/lib/bundler/man/bundle-remove.1.ronn +23 -0
  140. data/bundler/lib/bundler/man/bundle-show.1 +16 -0
  141. data/bundler/lib/bundler/man/bundle-show.1.ronn +21 -0
  142. data/bundler/lib/bundler/man/bundle-update.1 +275 -0
  143. data/bundler/lib/bundler/man/bundle-update.1.ronn +351 -0
  144. data/bundler/lib/bundler/man/bundle-version.1 +22 -0
  145. data/bundler/lib/bundler/man/bundle-version.1.ronn +24 -0
  146. data/bundler/lib/bundler/man/bundle-viz.1 +30 -0
  147. data/bundler/lib/bundler/man/bundle-viz.1.ronn +32 -0
  148. data/bundler/lib/bundler/man/bundle.1 +102 -0
  149. data/bundler/lib/bundler/man/bundle.1.ronn +116 -0
  150. data/bundler/lib/bundler/man/gemfile.5 +470 -0
  151. data/bundler/lib/bundler/man/gemfile.5.ronn +552 -0
  152. data/bundler/lib/bundler/man/index.txt +29 -0
  153. data/bundler/lib/bundler/match_metadata.rb +17 -0
  154. data/bundler/lib/bundler/match_platform.rb +23 -0
  155. data/bundler/lib/bundler/match_remote_metadata.rb +29 -0
  156. data/bundler/lib/bundler/mirror.rb +221 -0
  157. data/bundler/lib/bundler/plugin/api/source.rb +321 -0
  158. data/bundler/lib/bundler/plugin/api.rb +81 -0
  159. data/bundler/lib/bundler/plugin/dsl.rb +53 -0
  160. data/bundler/lib/bundler/plugin/events.rb +61 -0
  161. data/bundler/lib/bundler/plugin/index.rb +193 -0
  162. data/bundler/lib/bundler/plugin/installer/git.rb +34 -0
  163. data/bundler/lib/bundler/plugin/installer/rubygems.rb +19 -0
  164. data/bundler/lib/bundler/plugin/installer.rb +112 -0
  165. data/bundler/lib/bundler/plugin/source_list.rb +31 -0
  166. data/bundler/lib/bundler/plugin.rb +359 -0
  167. data/bundler/lib/bundler/process_lock.rb +24 -0
  168. data/bundler/lib/bundler/remote_specification.rb +121 -0
  169. data/bundler/lib/bundler/resolver/base.rb +107 -0
  170. data/bundler/lib/bundler/resolver/candidate.rb +94 -0
  171. data/bundler/lib/bundler/resolver/incompatibility.rb +15 -0
  172. data/bundler/lib/bundler/resolver/package.rb +77 -0
  173. data/bundler/lib/bundler/resolver/root.rb +25 -0
  174. data/bundler/lib/bundler/resolver/spec_group.rb +79 -0
  175. data/bundler/lib/bundler/resolver.rb +462 -0
  176. data/bundler/lib/bundler/retry.rb +66 -0
  177. data/bundler/lib/bundler/ruby_dsl.rb +53 -0
  178. data/bundler/lib/bundler/ruby_version.rb +131 -0
  179. data/bundler/lib/bundler/rubygems_ext.rb +328 -0
  180. data/bundler/lib/bundler/rubygems_gem_installer.rb +137 -0
  181. data/bundler/lib/bundler/rubygems_integration.rb +493 -0
  182. data/bundler/lib/bundler/runtime.rb +307 -0
  183. data/bundler/lib/bundler/safe_marshal.rb +31 -0
  184. data/bundler/lib/bundler/self_manager.rb +186 -0
  185. data/bundler/lib/bundler/settings/validator.rb +102 -0
  186. data/bundler/lib/bundler/settings.rb +588 -0
  187. data/bundler/lib/bundler/setup.rb +33 -0
  188. data/bundler/lib/bundler/shared_helpers.rb +380 -0
  189. data/bundler/lib/bundler/similarity_detector.rb +63 -0
  190. data/bundler/lib/bundler/source/gemspec.rb +18 -0
  191. data/bundler/lib/bundler/source/git/git_proxy.rb +455 -0
  192. data/bundler/lib/bundler/source/git.rb +380 -0
  193. data/bundler/lib/bundler/source/metadata.rb +62 -0
  194. data/bundler/lib/bundler/source/path/installer.rb +53 -0
  195. data/bundler/lib/bundler/source/path.rb +261 -0
  196. data/bundler/lib/bundler/source/rubygems/remote.rb +68 -0
  197. data/bundler/lib/bundler/source/rubygems.rb +516 -0
  198. data/bundler/lib/bundler/source/rubygems_aggregate.rb +68 -0
  199. data/bundler/lib/bundler/source.rb +116 -0
  200. data/bundler/lib/bundler/source_list.rb +227 -0
  201. data/bundler/lib/bundler/source_map.rb +71 -0
  202. data/bundler/lib/bundler/spec_set.rb +296 -0
  203. data/bundler/lib/bundler/stub_specification.rb +119 -0
  204. data/bundler/lib/bundler/templates/.document +1 -0
  205. data/bundler/lib/bundler/templates/Executable +27 -0
  206. data/bundler/lib/bundler/templates/Executable.bundler +109 -0
  207. data/bundler/lib/bundler/templates/Executable.standalone +14 -0
  208. data/bundler/lib/bundler/templates/Gemfile +5 -0
  209. data/bundler/lib/bundler/templates/newgem/CHANGELOG.md.tt +5 -0
  210. data/bundler/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +84 -0
  211. data/bundler/lib/bundler/templates/newgem/Cargo.toml.tt +7 -0
  212. data/bundler/lib/bundler/templates/newgem/Gemfile.tt +26 -0
  213. data/bundler/lib/bundler/templates/newgem/LICENSE.txt.tt +21 -0
  214. data/bundler/lib/bundler/templates/newgem/README.md.tt +45 -0
  215. data/bundler/lib/bundler/templates/newgem/Rakefile.tt +67 -0
  216. data/bundler/lib/bundler/templates/newgem/bin/console.tt +11 -0
  217. data/bundler/lib/bundler/templates/newgem/bin/setup.tt +8 -0
  218. data/bundler/lib/bundler/templates/newgem/circleci/config.yml.tt +25 -0
  219. data/bundler/lib/bundler/templates/newgem/exe/newgem.tt +3 -0
  220. data/bundler/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +15 -0
  221. data/bundler/lib/bundler/templates/newgem/ext/newgem/extconf-c.rb.tt +10 -0
  222. data/bundler/lib/bundler/templates/newgem/ext/newgem/extconf-rust.rb.tt +6 -0
  223. data/bundler/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt +9 -0
  224. data/bundler/lib/bundler/templates/newgem/ext/newgem/newgem.h.tt +6 -0
  225. data/bundler/lib/bundler/templates/newgem/ext/newgem/src/lib.rs.tt +12 -0
  226. data/bundler/lib/bundler/templates/newgem/github/workflows/main.yml.tt +37 -0
  227. data/bundler/lib/bundler/templates/newgem/gitignore.tt +23 -0
  228. data/bundler/lib/bundler/templates/newgem/gitlab-ci.yml.tt +18 -0
  229. data/bundler/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +9 -0
  230. data/bundler/lib/bundler/templates/newgem/lib/newgem.rb.tt +15 -0
  231. data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +51 -0
  232. data/bundler/lib/bundler/templates/newgem/rspec.tt +3 -0
  233. data/bundler/lib/bundler/templates/newgem/rubocop.yml.tt +13 -0
  234. data/bundler/lib/bundler/templates/newgem/sig/newgem.rbs.tt +8 -0
  235. data/bundler/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +11 -0
  236. data/bundler/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +15 -0
  237. data/bundler/lib/bundler/templates/newgem/standard.yml.tt +3 -0
  238. data/bundler/lib/bundler/templates/newgem/test/minitest/test_helper.rb.tt +6 -0
  239. data/bundler/lib/bundler/templates/newgem/test/minitest/test_newgem.rb.tt +13 -0
  240. data/bundler/lib/bundler/templates/newgem/test/test-unit/newgem_test.rb.tt +15 -0
  241. data/bundler/lib/bundler/templates/newgem/test/test-unit/test_helper.rb.tt +6 -0
  242. data/bundler/lib/bundler/ui/rg_proxy.rb +19 -0
  243. data/bundler/lib/bundler/ui/shell.rb +165 -0
  244. data/bundler/lib/bundler/ui/silent.rb +85 -0
  245. data/bundler/lib/bundler/ui.rb +9 -0
  246. data/bundler/lib/bundler/uri_credentials_filter.rb +43 -0
  247. data/bundler/lib/bundler/uri_normalizer.rb +23 -0
  248. data/bundler/lib/bundler/vendor/.document +1 -0
  249. data/bundler/lib/bundler/vendor/connection_pool/.document +1 -0
  250. data/bundler/lib/bundler/vendor/connection_pool/LICENSE +20 -0
  251. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +174 -0
  252. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +3 -0
  253. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +56 -0
  254. data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +175 -0
  255. data/bundler/lib/bundler/vendor/fileutils/.document +1 -0
  256. data/bundler/lib/bundler/vendor/fileutils/LICENSE.txt +22 -0
  257. data/bundler/lib/bundler/vendor/fileutils/lib/fileutils.rb +2694 -0
  258. data/bundler/lib/bundler/vendor/net-http-persistent/.document +1 -0
  259. data/bundler/lib/bundler/vendor/net-http-persistent/README.rdoc +82 -0
  260. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +41 -0
  261. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +65 -0
  262. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +79 -0
  263. data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +1073 -0
  264. data/bundler/lib/bundler/vendor/pub_grub/.document +1 -0
  265. data/bundler/lib/bundler/vendor/pub_grub/LICENSE.txt +21 -0
  266. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/assignment.rb +20 -0
  267. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +189 -0
  268. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/failure_writer.rb +182 -0
  269. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb +150 -0
  270. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/package.rb +43 -0
  271. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/partial_solution.rb +121 -0
  272. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/rubygems.rb +45 -0
  273. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/solve_failure.rb +19 -0
  274. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb +60 -0
  275. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/term.rb +105 -0
  276. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version.rb +3 -0
  277. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_constraint.rb +129 -0
  278. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_range.rb +411 -0
  279. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +248 -0
  280. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub/version_union.rb +178 -0
  281. data/bundler/lib/bundler/vendor/pub_grub/lib/pub_grub.rb +31 -0
  282. data/bundler/lib/bundler/vendor/thor/.document +1 -0
  283. data/bundler/lib/bundler/vendor/thor/LICENSE.md +20 -0
  284. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +105 -0
  285. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +61 -0
  286. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +108 -0
  287. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +143 -0
  288. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +373 -0
  289. data/bundler/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +130 -0
  290. data/bundler/lib/bundler/vendor/thor/lib/thor/actions.rb +340 -0
  291. data/bundler/lib/bundler/vendor/thor/lib/thor/base.rb +825 -0
  292. data/bundler/lib/bundler/vendor/thor/lib/thor/command.rb +151 -0
  293. data/bundler/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +107 -0
  294. data/bundler/lib/bundler/vendor/thor/lib/thor/error.rb +106 -0
  295. data/bundler/lib/bundler/vendor/thor/lib/thor/group.rb +281 -0
  296. data/bundler/lib/bundler/vendor/thor/lib/thor/invocation.rb +178 -0
  297. data/bundler/lib/bundler/vendor/thor/lib/thor/line_editor/basic.rb +37 -0
  298. data/bundler/lib/bundler/vendor/thor/lib/thor/line_editor/readline.rb +88 -0
  299. data/bundler/lib/bundler/vendor/thor/lib/thor/line_editor.rb +17 -0
  300. data/bundler/lib/bundler/vendor/thor/lib/thor/nested_context.rb +29 -0
  301. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/argument.rb +89 -0
  302. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +195 -0
  303. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/option.rb +178 -0
  304. data/bundler/lib/bundler/vendor/thor/lib/thor/parser/options.rb +293 -0
  305. data/bundler/lib/bundler/vendor/thor/lib/thor/parser.rb +4 -0
  306. data/bundler/lib/bundler/vendor/thor/lib/thor/rake_compat.rb +72 -0
  307. data/bundler/lib/bundler/vendor/thor/lib/thor/runner.rb +335 -0
  308. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +388 -0
  309. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/color.rb +112 -0
  310. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/column_printer.rb +29 -0
  311. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/html.rb +81 -0
  312. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/table_printer.rb +134 -0
  313. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/terminal.rb +42 -0
  314. data/bundler/lib/bundler/vendor/thor/lib/thor/shell/wrapped_printer.rb +38 -0
  315. data/bundler/lib/bundler/vendor/thor/lib/thor/shell.rb +81 -0
  316. data/bundler/lib/bundler/vendor/thor/lib/thor/util.rb +285 -0
  317. data/bundler/lib/bundler/vendor/thor/lib/thor/version.rb +3 -0
  318. data/bundler/lib/bundler/vendor/thor/lib/thor.rb +663 -0
  319. data/bundler/lib/bundler/vendor/tsort/.document +1 -0
  320. data/bundler/lib/bundler/vendor/tsort/LICENSE.txt +22 -0
  321. data/bundler/lib/bundler/vendor/tsort/lib/tsort.rb +455 -0
  322. data/bundler/lib/bundler/vendor/uri/.document +1 -0
  323. data/bundler/lib/bundler/vendor/uri/LICENSE.txt +22 -0
  324. data/bundler/lib/bundler/vendor/uri/lib/uri/common.rb +853 -0
  325. data/bundler/lib/bundler/vendor/uri/lib/uri/file.rb +100 -0
  326. data/bundler/lib/bundler/vendor/uri/lib/uri/ftp.rb +267 -0
  327. data/bundler/lib/bundler/vendor/uri/lib/uri/generic.rb +1588 -0
  328. data/bundler/lib/bundler/vendor/uri/lib/uri/http.rb +125 -0
  329. data/bundler/lib/bundler/vendor/uri/lib/uri/https.rb +23 -0
  330. data/bundler/lib/bundler/vendor/uri/lib/uri/ldap.rb +261 -0
  331. data/bundler/lib/bundler/vendor/uri/lib/uri/ldaps.rb +22 -0
  332. data/bundler/lib/bundler/vendor/uri/lib/uri/mailto.rb +293 -0
  333. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +539 -0
  334. data/bundler/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +183 -0
  335. data/bundler/lib/bundler/vendor/uri/lib/uri/version.rb +6 -0
  336. data/bundler/lib/bundler/vendor/uri/lib/uri/ws.rb +83 -0
  337. data/bundler/lib/bundler/vendor/uri/lib/uri/wss.rb +23 -0
  338. data/bundler/lib/bundler/vendor/uri/lib/uri.rb +104 -0
  339. data/bundler/lib/bundler/vendored_fileutils.rb +4 -0
  340. data/bundler/lib/bundler/vendored_net_http.rb +8 -0
  341. data/bundler/lib/bundler/vendored_persistent.rb +11 -0
  342. data/bundler/lib/bundler/vendored_pub_grub.rb +4 -0
  343. data/bundler/lib/bundler/vendored_thor.rb +8 -0
  344. data/bundler/lib/bundler/vendored_timeout.rb +8 -0
  345. data/bundler/lib/bundler/vendored_tsort.rb +4 -0
  346. data/bundler/lib/bundler/vendored_uri.rb +4 -0
  347. data/bundler/lib/bundler/version.rb +13 -0
  348. data/bundler/lib/bundler/vlad.rb +17 -0
  349. data/bundler/lib/bundler/worker.rb +117 -0
  350. data/bundler/lib/bundler/yaml_serializer.rb +93 -0
  351. data/bundler/lib/bundler.rb +663 -0
  352. data/{test/rubygems/bogussources.rb → exe/gem} +5 -2
  353. data/exe/update_rubygems +38 -0
  354. data/hide_lib_for_update/note.txt +0 -4
  355. data/lib/rubygems/available_set.rb +12 -12
  356. data/lib/rubygems/basic_specification.rb +82 -59
  357. data/lib/rubygems/bundler_version_finder.rb +77 -0
  358. data/lib/rubygems/ci_detector.rb +75 -0
  359. data/lib/rubygems/command.rb +144 -71
  360. data/lib/rubygems/command_manager.rb +64 -27
  361. data/lib/rubygems/commands/build_command.rb +88 -17
  362. data/lib/rubygems/commands/cert_command.rb +131 -83
  363. data/lib/rubygems/commands/check_command.rb +30 -27
  364. data/lib/rubygems/commands/cleanup_command.rb +57 -40
  365. data/lib/rubygems/commands/contents_command.rb +37 -39
  366. data/lib/rubygems/commands/dependency_command.rb +53 -65
  367. data/lib/rubygems/commands/environment_command.rb +32 -16
  368. data/lib/rubygems/commands/exec_command.rb +249 -0
  369. data/lib/rubygems/commands/fetch_command.rb +36 -19
  370. data/lib/rubygems/commands/generate_index_command.rb +40 -74
  371. data/lib/rubygems/commands/help_command.rb +22 -22
  372. data/lib/rubygems/commands/info_command.rb +38 -0
  373. data/lib/rubygems/commands/install_command.rb +67 -143
  374. data/lib/rubygems/commands/list_command.rb +10 -9
  375. data/lib/rubygems/commands/lock_command.rb +12 -14
  376. data/lib/rubygems/commands/mirror_command.rb +4 -4
  377. data/lib/rubygems/commands/open_command.rb +28 -26
  378. data/lib/rubygems/commands/outdated_command.rb +6 -6
  379. data/lib/rubygems/commands/owner_command.rb +51 -27
  380. data/lib/rubygems/commands/pristine_command.rb +99 -71
  381. data/lib/rubygems/commands/push_command.rb +53 -46
  382. data/lib/rubygems/commands/query_command.rb +21 -328
  383. data/lib/rubygems/commands/rdoc_command.rb +33 -33
  384. data/lib/rubygems/commands/search_command.rb +9 -9
  385. data/lib/rubygems/commands/server_command.rb +15 -76
  386. data/lib/rubygems/commands/setup_command.rb +370 -186
  387. data/lib/rubygems/commands/signin_command.rb +34 -0
  388. data/lib/rubygems/commands/signout_command.rb +32 -0
  389. data/lib/rubygems/commands/sources_command.rb +57 -41
  390. data/lib/rubygems/commands/specification_command.rb +38 -28
  391. data/lib/rubygems/commands/stale_command.rb +6 -5
  392. data/lib/rubygems/commands/uninstall_command.rb +96 -62
  393. data/lib/rubygems/commands/unpack_command.rb +44 -53
  394. data/lib/rubygems/commands/update_command.rb +153 -99
  395. data/lib/rubygems/commands/which_command.rb +14 -17
  396. data/lib/rubygems/commands/yank_command.rb +28 -32
  397. data/lib/rubygems/compatibility.rb +13 -32
  398. data/lib/rubygems/config_file.rb +214 -119
  399. data/lib/rubygems/core_ext/kernel_gem.rb +10 -16
  400. data/lib/rubygems/core_ext/kernel_require.rb +92 -90
  401. data/lib/rubygems/core_ext/kernel_warn.rb +49 -0
  402. data/lib/rubygems/core_ext/tcpsocket_init.rb +54 -0
  403. data/lib/rubygems/defaults.rb +184 -54
  404. data/lib/rubygems/dependency.rb +75 -62
  405. data/lib/rubygems/dependency_installer.rb +74 -230
  406. data/lib/rubygems/dependency_list.rb +32 -33
  407. data/lib/rubygems/deprecate.rb +113 -17
  408. data/lib/rubygems/doctor.rb +31 -31
  409. data/lib/rubygems/errors.rb +51 -13
  410. data/lib/rubygems/exceptions.rb +65 -35
  411. data/lib/rubygems/ext/build_error.rb +3 -1
  412. data/lib/rubygems/ext/builder.rb +103 -77
  413. data/lib/rubygems/ext/cargo_builder/link_flag_converter.rb +27 -0
  414. data/lib/rubygems/ext/cargo_builder.rb +360 -0
  415. data/lib/rubygems/ext/cmake_builder.rb +6 -7
  416. data/lib/rubygems/ext/configure_builder.rb +6 -9
  417. data/lib/rubygems/ext/ext_conf_builder.rb +40 -61
  418. data/lib/rubygems/ext/rake_builder.rb +18 -21
  419. data/lib/rubygems/ext.rb +8 -7
  420. data/lib/rubygems/gem_runner.rb +19 -21
  421. data/lib/rubygems/gemcutter_utilities/webauthn_listener/response.rb +163 -0
  422. data/lib/rubygems/gemcutter_utilities/webauthn_listener.rb +105 -0
  423. data/lib/rubygems/gemcutter_utilities/webauthn_poller.rb +78 -0
  424. data/lib/rubygems/gemcutter_utilities.rb +246 -43
  425. data/lib/rubygems/install_default_message.rb +3 -3
  426. data/lib/rubygems/install_message.rb +3 -3
  427. data/lib/rubygems/install_update_options.rb +104 -98
  428. data/lib/rubygems/installer.rb +407 -225
  429. data/lib/rubygems/installer_uninstaller_utils.rb +27 -0
  430. data/lib/rubygems/local_remote_options.rb +29 -32
  431. data/lib/rubygems/name_tuple.rb +18 -23
  432. data/lib/rubygems/net/http.rb +3 -0
  433. data/lib/rubygems/net-http/.document +1 -0
  434. data/lib/rubygems/net-http/LICENSE.txt +22 -0
  435. data/lib/rubygems/net-http/lib/net/http/backward.rb +40 -0
  436. data/lib/rubygems/net-http/lib/net/http/exceptions.rb +34 -0
  437. data/lib/rubygems/net-http/lib/net/http/generic_request.rb +414 -0
  438. data/lib/rubygems/net-http/lib/net/http/header.rb +981 -0
  439. data/lib/rubygems/net-http/lib/net/http/proxy_delta.rb +17 -0
  440. data/lib/rubygems/net-http/lib/net/http/request.rb +88 -0
  441. data/lib/rubygems/net-http/lib/net/http/requests.rb +425 -0
  442. data/lib/rubygems/net-http/lib/net/http/response.rb +738 -0
  443. data/lib/rubygems/net-http/lib/net/http/responses.rb +1174 -0
  444. data/lib/rubygems/net-http/lib/net/http/status.rb +84 -0
  445. data/lib/rubygems/net-http/lib/net/http.rb +2496 -0
  446. data/lib/rubygems/net-http/lib/net/https.rb +23 -0
  447. data/lib/rubygems/net-protocol/.document +1 -0
  448. data/lib/rubygems/net-protocol/LICENSE.txt +22 -0
  449. data/lib/rubygems/net-protocol/lib/net/protocol.rb +544 -0
  450. data/lib/rubygems/openssl.rb +7 -0
  451. data/lib/rubygems/optparse/.document +1 -0
  452. data/lib/rubygems/optparse/COPYING +56 -0
  453. data/lib/rubygems/optparse/lib/optionparser.rb +2 -0
  454. data/lib/rubygems/optparse/lib/optparse/ac.rb +54 -0
  455. data/lib/rubygems/optparse/lib/optparse/date.rb +18 -0
  456. data/lib/rubygems/optparse/lib/optparse/kwargs.rb +22 -0
  457. data/lib/rubygems/optparse/lib/optparse/shellwords.rb +7 -0
  458. data/lib/rubygems/optparse/lib/optparse/time.rb +11 -0
  459. data/lib/rubygems/optparse/lib/optparse/uri.rb +7 -0
  460. data/lib/rubygems/optparse/lib/optparse/version.rb +71 -0
  461. data/lib/rubygems/optparse/lib/optparse.rb +2330 -0
  462. data/lib/rubygems/optparse.rb +3 -0
  463. data/lib/rubygems/package/digest_io.rb +5 -7
  464. data/lib/rubygems/package/file_source.rb +6 -8
  465. data/lib/rubygems/package/io_source.rb +6 -4
  466. data/lib/rubygems/package/old.rb +19 -28
  467. data/lib/rubygems/package/source.rb +1 -1
  468. data/lib/rubygems/package/tar_header.rb +114 -93
  469. data/lib/rubygems/package/tar_reader/entry.rb +116 -22
  470. data/lib/rubygems/package/tar_reader.rb +18 -40
  471. data/lib/rubygems/package/tar_writer.rb +42 -56
  472. data/lib/rubygems/package.rb +254 -144
  473. data/lib/rubygems/package_task.rb +8 -14
  474. data/lib/rubygems/path_support.rb +21 -16
  475. data/lib/rubygems/platform.rb +135 -74
  476. data/lib/rubygems/psych_tree.rb +3 -2
  477. data/lib/rubygems/query_utils.rb +349 -0
  478. data/lib/rubygems/rdoc.rb +4 -326
  479. data/lib/rubygems/remote_fetcher.rb +99 -181
  480. data/lib/rubygems/request/connection_pools.rb +31 -24
  481. data/lib/rubygems/request/http_pool.rb +6 -7
  482. data/lib/rubygems/request/https_pool.rb +2 -3
  483. data/lib/rubygems/request.rb +107 -57
  484. data/lib/rubygems/request_set/gem_dependency_api.rb +182 -190
  485. data/lib/rubygems/request_set/lockfile/parser.rb +42 -52
  486. data/lib/rubygems/request_set/lockfile/tokenizer.rb +34 -24
  487. data/lib/rubygems/request_set/lockfile.rb +32 -35
  488. data/lib/rubygems/request_set.rb +115 -71
  489. data/lib/rubygems/requirement.rb +77 -68
  490. data/lib/rubygems/resolv/.document +1 -0
  491. data/lib/rubygems/resolv/LICENSE.txt +22 -0
  492. data/lib/rubygems/resolv/lib/resolv.rb +3387 -0
  493. data/lib/rubygems/resolver/activation_request.rb +34 -61
  494. data/lib/rubygems/resolver/api_set/gem_parser.rb +24 -0
  495. data/lib/rubygems/resolver/api_set.rb +40 -32
  496. data/lib/rubygems/resolver/api_specification.rb +37 -18
  497. data/lib/rubygems/resolver/best_set.rb +15 -17
  498. data/lib/rubygems/resolver/composed_set.rb +9 -11
  499. data/lib/rubygems/resolver/conflict.rb +19 -33
  500. data/lib/rubygems/resolver/current_set.rb +2 -4
  501. data/lib/rubygems/resolver/dependency_request.rb +8 -9
  502. data/lib/rubygems/resolver/git_set.rb +8 -10
  503. data/lib/rubygems/resolver/git_specification.rb +11 -13
  504. data/lib/rubygems/resolver/index_set.rb +13 -15
  505. data/lib/rubygems/resolver/index_specification.rb +42 -11
  506. data/lib/rubygems/resolver/installed_specification.rb +9 -11
  507. data/lib/rubygems/resolver/installer_set.rb +93 -47
  508. data/lib/rubygems/resolver/local_specification.rb +5 -7
  509. data/lib/rubygems/resolver/lock_set.rb +13 -15
  510. data/lib/rubygems/resolver/lock_specification.rb +13 -15
  511. data/lib/rubygems/resolver/molinillo/.document +1 -0
  512. data/lib/rubygems/resolver/molinillo/LICENSE +9 -0
  513. data/lib/rubygems/resolver/molinillo/lib/molinillo/delegates/resolution_state.rb +57 -0
  514. data/lib/rubygems/resolver/molinillo/lib/molinillo/delegates/specification_provider.rb +88 -0
  515. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/action.rb +36 -0
  516. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +66 -0
  517. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +62 -0
  518. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +63 -0
  519. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +61 -0
  520. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/log.rb +126 -0
  521. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/set_payload.rb +46 -0
  522. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/tag.rb +36 -0
  523. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/vertex.rb +164 -0
  524. data/lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph.rb +110 -146
  525. data/lib/rubygems/resolver/molinillo/lib/molinillo/errors.rb +83 -9
  526. data/lib/rubygems/resolver/molinillo/lib/molinillo/gem_metadata.rb +2 -1
  527. data/lib/rubygems/resolver/molinillo/lib/molinillo/modules/specification_provider.rb +13 -1
  528. data/lib/rubygems/resolver/molinillo/lib/molinillo/modules/ui.rb +3 -1
  529. data/lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb +552 -172
  530. data/lib/rubygems/resolver/molinillo/lib/molinillo/resolver.rb +3 -2
  531. data/lib/rubygems/resolver/molinillo/lib/molinillo/state.rb +12 -6
  532. data/lib/rubygems/resolver/molinillo/lib/molinillo.rb +6 -5
  533. data/lib/rubygems/resolver/molinillo.rb +2 -1
  534. data/lib/rubygems/resolver/requirement_list.rb +2 -2
  535. data/lib/rubygems/resolver/set.rb +3 -5
  536. data/lib/rubygems/resolver/source_set.rb +6 -7
  537. data/lib/rubygems/resolver/spec_specification.rb +16 -4
  538. data/lib/rubygems/resolver/specification.rb +25 -10
  539. data/lib/rubygems/resolver/stats.rb +1 -0
  540. data/lib/rubygems/resolver/vendor_set.rb +6 -8
  541. data/lib/rubygems/resolver/vendor_specification.rb +6 -8
  542. data/lib/rubygems/resolver.rb +121 -72
  543. data/lib/rubygems/s3_uri_signer.rb +177 -0
  544. data/lib/rubygems/safe_marshal/elements.rb +146 -0
  545. data/lib/rubygems/safe_marshal/reader.rb +308 -0
  546. data/lib/rubygems/safe_marshal/visitors/stream_printer.rb +31 -0
  547. data/lib/rubygems/safe_marshal/visitors/to_ruby.rb +415 -0
  548. data/lib/rubygems/safe_marshal/visitors/visitor.rb +74 -0
  549. data/lib/rubygems/safe_marshal.rb +74 -0
  550. data/lib/rubygems/safe_yaml.rb +36 -0
  551. data/lib/rubygems/security/policies.rb +49 -51
  552. data/lib/rubygems/security/policy.rb +46 -53
  553. data/lib/rubygems/security/signer.rb +86 -29
  554. data/lib/rubygems/security/trust_dir.rb +22 -24
  555. data/lib/rubygems/security.rb +101 -82
  556. data/lib/rubygems/security_option.rb +43 -0
  557. data/lib/rubygems/shellwords.rb +3 -0
  558. data/lib/rubygems/source/git.rb +40 -42
  559. data/lib/rubygems/source/installed.rb +5 -9
  560. data/lib/rubygems/source/local.rb +30 -33
  561. data/lib/rubygems/source/lock.rb +10 -10
  562. data/lib/rubygems/source/specific_file.rb +7 -9
  563. data/lib/rubygems/source/vendor.rb +3 -7
  564. data/lib/rubygems/source.rb +78 -68
  565. data/lib/rubygems/source_list.rb +11 -15
  566. data/lib/rubygems/spec_fetcher.rb +71 -83
  567. data/lib/rubygems/specification.rb +833 -1115
  568. data/lib/rubygems/specification_policy.rb +538 -0
  569. data/lib/rubygems/ssl_certs/rubygems.org/GlobalSignRootCA.pem +21 -0
  570. data/lib/rubygems/ssl_certs/rubygems.org/GlobalSignRootCA_R3.pem +21 -0
  571. data/lib/rubygems/stub_specification.rb +55 -57
  572. data/lib/rubygems/text.rb +39 -27
  573. data/lib/rubygems/timeout/.document +1 -0
  574. data/lib/rubygems/timeout/LICENSE.txt +22 -0
  575. data/lib/rubygems/timeout/lib/timeout.rb +199 -0
  576. data/lib/rubygems/timeout.rb +3 -0
  577. data/lib/rubygems/tsort/.document +1 -0
  578. data/lib/rubygems/tsort/LICENSE.txt +22 -0
  579. data/lib/rubygems/tsort/lib/tsort.rb +455 -0
  580. data/lib/rubygems/tsort.rb +3 -0
  581. data/lib/rubygems/uninstaller.rb +150 -87
  582. data/lib/rubygems/unknown_command_spell_checker.rb +21 -0
  583. data/lib/rubygems/update_suggestion.rb +56 -0
  584. data/lib/rubygems/uri.rb +126 -0
  585. data/lib/rubygems/uri_formatter.rb +4 -7
  586. data/lib/rubygems/user_interaction.rb +92 -146
  587. data/lib/rubygems/util/licenses.rb +712 -317
  588. data/lib/rubygems/util/list.rb +5 -2
  589. data/lib/rubygems/util.rb +58 -75
  590. data/lib/rubygems/validator.rb +26 -48
  591. data/lib/rubygems/version.rb +106 -56
  592. data/lib/rubygems/version_option.rb +22 -14
  593. data/lib/rubygems/yaml_serializer.rb +93 -0
  594. data/lib/rubygems.rb +453 -358
  595. data/rubygems-update.gemspec +38 -0
  596. data/setup.rb +13 -27
  597. metadata +511 -363
  598. data/.autotest +0 -71
  599. data/.document +0 -5
  600. data/.travis.yml +0 -46
  601. data/CONTRIBUTING.rdoc +0 -129
  602. data/CVE-2013-4287.txt +0 -35
  603. data/CVE-2013-4363.txt +0 -45
  604. data/CVE-2015-3900.txt +0 -40
  605. data/History.txt +0 -3094
  606. data/MAINTAINERS.md +0 -5
  607. data/POLICIES.rdoc +0 -61
  608. data/README.rdoc +0 -54
  609. data/Rakefile +0 -449
  610. data/UPGRADING.rdoc +0 -92
  611. data/appveyor.yml +0 -36
  612. data/bin/gem +0 -25
  613. data/bin/update_rubygems +0 -37
  614. data/lib/gauntlet_rubygems.rb +0 -51
  615. data/lib/rubygems/indexer.rb +0 -434
  616. data/lib/rubygems/installer_test_case.rb +0 -194
  617. data/lib/rubygems/mock_gem_ui.rb +0 -89
  618. data/lib/rubygems/package/tar_test_case.rb +0 -147
  619. data/lib/rubygems/psych_additions.rb +0 -10
  620. data/lib/rubygems/server.rb +0 -869
  621. data/lib/rubygems/source_local.rb +0 -6
  622. data/lib/rubygems/source_specific_file.rb +0 -5
  623. data/lib/rubygems/ssl_certs/AddTrustExternalCARoot-2048.pem +0 -25
  624. data/lib/rubygems/ssl_certs/AddTrustExternalCARoot.pem +0 -32
  625. data/lib/rubygems/ssl_certs/Class3PublicPrimaryCertificationAuthority.pem +0 -14
  626. data/lib/rubygems/ssl_certs/DigiCertHighAssuranceEVRootCA.pem +0 -23
  627. data/lib/rubygems/ssl_certs/EntrustnetSecureServerCertificationAuthority.pem +0 -28
  628. data/lib/rubygems/ssl_certs/GeoTrustGlobalCA.pem +0 -20
  629. data/lib/rubygems/syck_hack.rb +0 -77
  630. data/lib/rubygems/test_case.rb +0 -1496
  631. data/lib/rubygems/test_utilities.rb +0 -384
  632. data/lib/ubygems.rb +0 -11
  633. data/test/rubygems/alternate_cert.pem +0 -18
  634. data/test/rubygems/alternate_cert_32.pem +0 -18
  635. data/test/rubygems/alternate_key.pem +0 -27
  636. data/test/rubygems/bad_rake.rb +0 -2
  637. data/test/rubygems/ca_cert.pem +0 -68
  638. data/test/rubygems/child_cert.pem +0 -18
  639. data/test/rubygems/child_cert_32.pem +0 -18
  640. data/test/rubygems/child_key.pem +0 -27
  641. data/test/rubygems/client.pem +0 -49
  642. data/test/rubygems/data/gem-private_key.pem +0 -27
  643. data/test/rubygems/data/gem-public_cert.pem +0 -20
  644. data/test/rubygems/data/null-type.gemspec.rz +0 -0
  645. data/test/rubygems/encrypted_private_key.pem +0 -30
  646. data/test/rubygems/expired_cert.pem +0 -18
  647. data/test/rubygems/fake_certlib/openssl.rb +0 -8
  648. data/test/rubygems/fix_openssl_warnings.rb +0 -13
  649. data/test/rubygems/foo/discover.rb +0 -1
  650. data/test/rubygems/future_cert.pem +0 -18
  651. data/test/rubygems/future_cert_32.pem +0 -18
  652. data/test/rubygems/good_rake.rb +0 -2
  653. data/test/rubygems/grandchild_cert.pem +0 -18
  654. data/test/rubygems/grandchild_cert_32.pem +0 -18
  655. data/test/rubygems/grandchild_key.pem +0 -27
  656. data/test/rubygems/invalid_client.pem +0 -49
  657. data/test/rubygems/invalid_issuer_cert.pem +0 -18
  658. data/test/rubygems/invalid_issuer_cert_32.pem +0 -18
  659. data/test/rubygems/invalid_key.pem +0 -27
  660. data/test/rubygems/invalid_signer_cert.pem +0 -18
  661. data/test/rubygems/invalid_signer_cert_32.pem +0 -18
  662. data/test/rubygems/invalidchild_cert.pem +0 -18
  663. data/test/rubygems/invalidchild_cert_32.pem +0 -18
  664. data/test/rubygems/invalidchild_key.pem +0 -27
  665. data/test/rubygems/plugin/exception/rubygems_plugin.rb +0 -3
  666. data/test/rubygems/plugin/load/rubygems_plugin.rb +0 -4
  667. data/test/rubygems/plugin/standarderror/rubygems_plugin.rb +0 -3
  668. data/test/rubygems/private_key.pem +0 -27
  669. data/test/rubygems/public_cert.pem +0 -18
  670. data/test/rubygems/public_cert_32.pem +0 -18
  671. data/test/rubygems/public_key.pem +0 -9
  672. data/test/rubygems/rubygems/commands/crash_command.rb +0 -6
  673. data/test/rubygems/rubygems_plugin.rb +0 -22
  674. data/test/rubygems/sff/discover.rb +0 -1
  675. data/test/rubygems/simple_gem.rb +0 -67
  676. data/test/rubygems/specifications/bar-0.0.2.gemspec +0 -9
  677. data/test/rubygems/specifications/foo-0.0.1-x86-mswin32.gemspec +0 -0
  678. data/test/rubygems/ssl_cert.pem +0 -19
  679. data/test/rubygems/ssl_key.pem +0 -15
  680. data/test/rubygems/test_bundled_ca.rb +0 -59
  681. data/test/rubygems/test_config.rb +0 -24
  682. data/test/rubygems/test_deprecate.rb +0 -77
  683. data/test/rubygems/test_gem.rb +0 -1679
  684. data/test/rubygems/test_gem_available_set.rb +0 -130
  685. data/test/rubygems/test_gem_command.rb +0 -248
  686. data/test/rubygems/test_gem_command_manager.rb +0 -264
  687. data/test/rubygems/test_gem_commands_build_command.rb +0 -121
  688. data/test/rubygems/test_gem_commands_cert_command.rb +0 -671
  689. data/test/rubygems/test_gem_commands_check_command.rb +0 -69
  690. data/test/rubygems/test_gem_commands_cleanup_command.rb +0 -197
  691. data/test/rubygems/test_gem_commands_contents_command.rb +0 -240
  692. data/test/rubygems/test_gem_commands_dependency_command.rb +0 -230
  693. data/test/rubygems/test_gem_commands_environment_command.rb +0 -154
  694. data/test/rubygems/test_gem_commands_fetch_command.rb +0 -127
  695. data/test/rubygems/test_gem_commands_generate_index_command.rb +0 -51
  696. data/test/rubygems/test_gem_commands_help_command.rb +0 -75
  697. data/test/rubygems/test_gem_commands_install_command.rb +0 -987
  698. data/test/rubygems/test_gem_commands_list_command.rb +0 -34
  699. data/test/rubygems/test_gem_commands_lock_command.rb +0 -69
  700. data/test/rubygems/test_gem_commands_mirror.rb +0 -20
  701. data/test/rubygems/test_gem_commands_open_command.rb +0 -70
  702. data/test/rubygems/test_gem_commands_outdated_command.rb +0 -33
  703. data/test/rubygems/test_gem_commands_owner_command.rb +0 -205
  704. data/test/rubygems/test_gem_commands_pristine_command.rb +0 -491
  705. data/test/rubygems/test_gem_commands_push_command.rb +0 -330
  706. data/test/rubygems/test_gem_commands_query_command.rb +0 -657
  707. data/test/rubygems/test_gem_commands_search_command.rb +0 -18
  708. data/test/rubygems/test_gem_commands_server_command.rb +0 -60
  709. data/test/rubygems/test_gem_commands_setup_command.rb +0 -136
  710. data/test/rubygems/test_gem_commands_sources_command.rb +0 -249
  711. data/test/rubygems/test_gem_commands_specification_command.rb +0 -251
  712. data/test/rubygems/test_gem_commands_stale_command.rb +0 -43
  713. data/test/rubygems/test_gem_commands_uninstall_command.rb +0 -283
  714. data/test/rubygems/test_gem_commands_unpack_command.rb +0 -209
  715. data/test/rubygems/test_gem_commands_update_command.rb +0 -514
  716. data/test/rubygems/test_gem_commands_which_command.rb +0 -87
  717. data/test/rubygems/test_gem_commands_yank_command.rb +0 -100
  718. data/test/rubygems/test_gem_config_file.rb +0 -491
  719. data/test/rubygems/test_gem_dependency.rb +0 -362
  720. data/test/rubygems/test_gem_dependency_installer.rb +0 -1235
  721. data/test/rubygems/test_gem_dependency_list.rb +0 -260
  722. data/test/rubygems/test_gem_dependency_resolution_error.rb +0 -29
  723. data/test/rubygems/test_gem_doctor.rb +0 -169
  724. data/test/rubygems/test_gem_ext_builder.rb +0 -341
  725. data/test/rubygems/test_gem_ext_cmake_builder.rb +0 -87
  726. data/test/rubygems/test_gem_ext_configure_builder.rb +0 -87
  727. data/test/rubygems/test_gem_ext_ext_conf_builder.rb +0 -211
  728. data/test/rubygems/test_gem_ext_rake_builder.rb +0 -65
  729. data/test/rubygems/test_gem_gem_runner.rb +0 -69
  730. data/test/rubygems/test_gem_gemcutter_utilities.rb +0 -235
  731. data/test/rubygems/test_gem_impossible_dependencies_error.rb +0 -62
  732. data/test/rubygems/test_gem_indexer.rb +0 -367
  733. data/test/rubygems/test_gem_install_update_options.rb +0 -197
  734. data/test/rubygems/test_gem_installer.rb +0 -1552
  735. data/test/rubygems/test_gem_local_remote_options.rb +0 -134
  736. data/test/rubygems/test_gem_name_tuple.rb +0 -45
  737. data/test/rubygems/test_gem_package.rb +0 -876
  738. data/test/rubygems/test_gem_package_old.rb +0 -90
  739. data/test/rubygems/test_gem_package_tar_header.rb +0 -147
  740. data/test/rubygems/test_gem_package_tar_reader.rb +0 -90
  741. data/test/rubygems/test_gem_package_tar_reader_entry.rb +0 -142
  742. data/test/rubygems/test_gem_package_tar_writer.rb +0 -264
  743. data/test/rubygems/test_gem_package_task.rb +0 -84
  744. data/test/rubygems/test_gem_path_support.rb +0 -121
  745. data/test/rubygems/test_gem_platform.rb +0 -308
  746. data/test/rubygems/test_gem_rdoc.rb +0 -270
  747. data/test/rubygems/test_gem_remote_fetcher.rb +0 -1051
  748. data/test/rubygems/test_gem_request.rb +0 -363
  749. data/test/rubygems/test_gem_request_connection_pools.rb +0 -130
  750. data/test/rubygems/test_gem_request_set.rb +0 -595
  751. data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +0 -831
  752. data/test/rubygems/test_gem_request_set_lockfile.rb +0 -470
  753. data/test/rubygems/test_gem_request_set_lockfile_parser.rb +0 -549
  754. data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +0 -306
  755. data/test/rubygems/test_gem_requirement.rb +0 -387
  756. data/test/rubygems/test_gem_resolver.rb +0 -715
  757. data/test/rubygems/test_gem_resolver_activation_request.rb +0 -74
  758. data/test/rubygems/test_gem_resolver_api_set.rb +0 -209
  759. data/test/rubygems/test_gem_resolver_api_specification.rb +0 -145
  760. data/test/rubygems/test_gem_resolver_best_set.rb +0 -138
  761. data/test/rubygems/test_gem_resolver_composed_set.rb +0 -46
  762. data/test/rubygems/test_gem_resolver_conflict.rb +0 -88
  763. data/test/rubygems/test_gem_resolver_dependency_request.rb +0 -85
  764. data/test/rubygems/test_gem_resolver_git_set.rb +0 -190
  765. data/test/rubygems/test_gem_resolver_git_specification.rb +0 -114
  766. data/test/rubygems/test_gem_resolver_index_set.rb +0 -90
  767. data/test/rubygems/test_gem_resolver_index_specification.rb +0 -90
  768. data/test/rubygems/test_gem_resolver_installed_specification.rb +0 -50
  769. data/test/rubygems/test_gem_resolver_installer_set.rb +0 -258
  770. data/test/rubygems/test_gem_resolver_local_specification.rb +0 -46
  771. data/test/rubygems/test_gem_resolver_lock_set.rb +0 -64
  772. data/test/rubygems/test_gem_resolver_lock_specification.rb +0 -100
  773. data/test/rubygems/test_gem_resolver_requirement_list.rb +0 -21
  774. data/test/rubygems/test_gem_resolver_specification.rb +0 -65
  775. data/test/rubygems/test_gem_resolver_vendor_set.rb +0 -84
  776. data/test/rubygems/test_gem_resolver_vendor_specification.rb +0 -84
  777. data/test/rubygems/test_gem_security.rb +0 -307
  778. data/test/rubygems/test_gem_security_policy.rb +0 -541
  779. data/test/rubygems/test_gem_security_signer.rb +0 -209
  780. data/test/rubygems/test_gem_security_trust_dir.rb +0 -101
  781. data/test/rubygems/test_gem_server.rb +0 -409
  782. data/test/rubygems/test_gem_silent_ui.rb +0 -117
  783. data/test/rubygems/test_gem_source.rb +0 -242
  784. data/test/rubygems/test_gem_source_fetch_problem.rb +0 -20
  785. data/test/rubygems/test_gem_source_git.rb +0 -309
  786. data/test/rubygems/test_gem_source_installed.rb +0 -37
  787. data/test/rubygems/test_gem_source_list.rb +0 -118
  788. data/test/rubygems/test_gem_source_local.rb +0 -107
  789. data/test/rubygems/test_gem_source_lock.rb +0 -115
  790. data/test/rubygems/test_gem_source_specific_file.rb +0 -76
  791. data/test/rubygems/test_gem_source_vendor.rb +0 -32
  792. data/test/rubygems/test_gem_spec_fetcher.rb +0 -311
  793. data/test/rubygems/test_gem_specification.rb +0 -3519
  794. data/test/rubygems/test_gem_stream_ui.rb +0 -239
  795. data/test/rubygems/test_gem_stub_specification.rb +0 -217
  796. data/test/rubygems/test_gem_text.rb +0 -77
  797. data/test/rubygems/test_gem_uninstaller.rb +0 -485
  798. data/test/rubygems/test_gem_unsatisfiable_dependency_error.rb +0 -33
  799. data/test/rubygems/test_gem_uri_formatter.rb +0 -29
  800. data/test/rubygems/test_gem_util.rb +0 -40
  801. data/test/rubygems/test_gem_validator.rb +0 -46
  802. data/test/rubygems/test_gem_version.rb +0 -222
  803. data/test/rubygems/test_gem_version_option.rb +0 -152
  804. data/test/rubygems/test_kernel.rb +0 -86
  805. data/test/rubygems/test_require.rb +0 -322
  806. data/test/rubygems/wrong_key_cert.pem +0 -18
  807. data/test/rubygems/wrong_key_cert_32.pem +0 -18
  808. data/util/CL2notes +0 -56
  809. data/util/create_certs.rb +0 -157
  810. data/util/create_encrypted_key.rb +0 -17
  811. data/util/generate_spdx_license_list.rb +0 -51
  812. data/util/update_bundled_ca_certificates.rb +0 -118
@@ -0,0 +1,981 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # The \HTTPHeader module provides access to \HTTP headers.
4
+ #
5
+ # The module is included in:
6
+ #
7
+ # - Gem::Net::HTTPGenericRequest (and therefore Gem::Net::HTTPRequest).
8
+ # - Gem::Net::HTTPResponse.
9
+ #
10
+ # The headers are a hash-like collection of key/value pairs called _fields_.
11
+ #
12
+ # == Request and Response Fields
13
+ #
14
+ # Headers may be included in:
15
+ #
16
+ # - A Gem::Net::HTTPRequest object:
17
+ # the object's headers will be sent with the request.
18
+ # Any fields may be defined in the request;
19
+ # see {Setters}[rdoc-ref:Gem::Net::HTTPHeader@Setters].
20
+ # - A Gem::Net::HTTPResponse object:
21
+ # the objects headers are usually those returned from the host.
22
+ # Fields may be retrieved from the object;
23
+ # see {Getters}[rdoc-ref:Gem::Net::HTTPHeader@Getters]
24
+ # and {Iterators}[rdoc-ref:Gem::Net::HTTPHeader@Iterators].
25
+ #
26
+ # Exactly which fields should be sent or expected depends on the host;
27
+ # see:
28
+ #
29
+ # - {Request fields}[https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Request_fields].
30
+ # - {Response fields}[https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Response_fields].
31
+ #
32
+ # == About the Examples
33
+ #
34
+ # :include: doc/net-http/examples.rdoc
35
+ #
36
+ # == Fields
37
+ #
38
+ # A header field is a key/value pair.
39
+ #
40
+ # === Field Keys
41
+ #
42
+ # A field key may be:
43
+ #
44
+ # - A string: Key <tt>'Accept'</tt> is treated as if it were
45
+ # <tt>'Accept'.downcase</tt>; i.e., <tt>'accept'</tt>.
46
+ # - A symbol: Key <tt>:Accept</tt> is treated as if it were
47
+ # <tt>:Accept.to_s.downcase</tt>; i.e., <tt>'accept'</tt>.
48
+ #
49
+ # Examples:
50
+ #
51
+ # req = Gem::Net::HTTP::Get.new(uri)
52
+ # req[:accept] # => "*/*"
53
+ # req['Accept'] # => "*/*"
54
+ # req['ACCEPT'] # => "*/*"
55
+ #
56
+ # req['accept'] = 'text/html'
57
+ # req[:accept] = 'text/html'
58
+ # req['ACCEPT'] = 'text/html'
59
+ #
60
+ # === Field Values
61
+ #
62
+ # A field value may be returned as an array of strings or as a string:
63
+ #
64
+ # - These methods return field values as arrays:
65
+ #
66
+ # - #get_fields: Returns the array value for the given key,
67
+ # or +nil+ if it does not exist.
68
+ # - #to_hash: Returns a hash of all header fields:
69
+ # each key is a field name; its value is the array value for the field.
70
+ #
71
+ # - These methods return field values as string;
72
+ # the string value for a field is equivalent to
73
+ # <tt>self[key.downcase.to_s].join(', '))</tt>:
74
+ #
75
+ # - #[]: Returns the string value for the given key,
76
+ # or +nil+ if it does not exist.
77
+ # - #fetch: Like #[], but accepts a default value
78
+ # to be returned if the key does not exist.
79
+ #
80
+ # The field value may be set:
81
+ #
82
+ # - #[]=: Sets the value for the given key;
83
+ # the given value may be a string, a symbol, an array, or a hash.
84
+ # - #add_field: Adds a given value to a value for the given key
85
+ # (not overwriting the existing value).
86
+ # - #delete: Deletes the field for the given key.
87
+ #
88
+ # Example field values:
89
+ #
90
+ # - \String:
91
+ #
92
+ # req['Accept'] = 'text/html' # => "text/html"
93
+ # req['Accept'] # => "text/html"
94
+ # req.get_fields('Accept') # => ["text/html"]
95
+ #
96
+ # - \Symbol:
97
+ #
98
+ # req['Accept'] = :text # => :text
99
+ # req['Accept'] # => "text"
100
+ # req.get_fields('Accept') # => ["text"]
101
+ #
102
+ # - Simple array:
103
+ #
104
+ # req[:foo] = %w[bar baz bat]
105
+ # req[:foo] # => "bar, baz, bat"
106
+ # req.get_fields(:foo) # => ["bar", "baz", "bat"]
107
+ #
108
+ # - Simple hash:
109
+ #
110
+ # req[:foo] = {bar: 0, baz: 1, bat: 2}
111
+ # req[:foo] # => "bar, 0, baz, 1, bat, 2"
112
+ # req.get_fields(:foo) # => ["bar", "0", "baz", "1", "bat", "2"]
113
+ #
114
+ # - Nested:
115
+ #
116
+ # req[:foo] = [%w[bar baz], {bat: 0, bam: 1}]
117
+ # req[:foo] # => "bar, baz, bat, 0, bam, 1"
118
+ # req.get_fields(:foo) # => ["bar", "baz", "bat", "0", "bam", "1"]
119
+ #
120
+ # req[:foo] = {bar: %w[baz bat], bam: {bah: 0, bad: 1}}
121
+ # req[:foo] # => "bar, baz, bat, bam, bah, 0, bad, 1"
122
+ # req.get_fields(:foo) # => ["bar", "baz", "bat", "bam", "bah", "0", "bad", "1"]
123
+ #
124
+ # == Convenience Methods
125
+ #
126
+ # Various convenience methods retrieve values, set values, query values,
127
+ # set form values, or iterate over fields.
128
+ #
129
+ # === Setters
130
+ #
131
+ # \Method #[]= can set any field, but does little to validate the new value;
132
+ # some of the other setter methods provide some validation:
133
+ #
134
+ # - #[]=: Sets the string or array value for the given key.
135
+ # - #add_field: Creates or adds to the array value for the given key.
136
+ # - #basic_auth: Sets the string authorization header for <tt>'Authorization'</tt>.
137
+ # - #content_length=: Sets the integer length for field <tt>'Content-Length</tt>.
138
+ # - #content_type=: Sets the string value for field <tt>'Content-Type'</tt>.
139
+ # - #proxy_basic_auth: Sets the string authorization header for <tt>'Proxy-Authorization'</tt>.
140
+ # - #set_range: Sets the value for field <tt>'Range'</tt>.
141
+ #
142
+ # === Form Setters
143
+ #
144
+ # - #set_form: Sets an HTML form data set.
145
+ # - #set_form_data: Sets header fields and a body from HTML form data.
146
+ #
147
+ # === Getters
148
+ #
149
+ # \Method #[] can retrieve the value of any field that exists,
150
+ # but always as a string;
151
+ # some of the other getter methods return something different
152
+ # from the simple string value:
153
+ #
154
+ # - #[]: Returns the string field value for the given key.
155
+ # - #content_length: Returns the integer value of field <tt>'Content-Length'</tt>.
156
+ # - #content_range: Returns the Range value of field <tt>'Content-Range'</tt>.
157
+ # - #content_type: Returns the string value of field <tt>'Content-Type'</tt>.
158
+ # - #fetch: Returns the string field value for the given key.
159
+ # - #get_fields: Returns the array field value for the given +key+.
160
+ # - #main_type: Returns first part of the string value of field <tt>'Content-Type'</tt>.
161
+ # - #sub_type: Returns second part of the string value of field <tt>'Content-Type'</tt>.
162
+ # - #range: Returns an array of Range objects of field <tt>'Range'</tt>, or +nil+.
163
+ # - #range_length: Returns the integer length of the range given in field <tt>'Content-Range'</tt>.
164
+ # - #type_params: Returns the string parameters for <tt>'Content-Type'</tt>.
165
+ #
166
+ # === Queries
167
+ #
168
+ # - #chunked?: Returns whether field <tt>'Transfer-Encoding'</tt> is set to <tt>'chunked'</tt>.
169
+ # - #connection_close?: Returns whether field <tt>'Connection'</tt> is set to <tt>'close'</tt>.
170
+ # - #connection_keep_alive?: Returns whether field <tt>'Connection'</tt> is set to <tt>'keep-alive'</tt>.
171
+ # - #key?: Returns whether a given key exists.
172
+ #
173
+ # === Iterators
174
+ #
175
+ # - #each_capitalized: Passes each field capitalized-name/value pair to the block.
176
+ # - #each_capitalized_name: Passes each capitalized field name to the block.
177
+ # - #each_header: Passes each field name/value pair to the block.
178
+ # - #each_name: Passes each field name to the block.
179
+ # - #each_value: Passes each string field value to the block.
180
+ #
181
+ module Gem::Net::HTTPHeader
182
+ MAX_KEY_LENGTH = 1024
183
+ MAX_FIELD_LENGTH = 65536
184
+
185
+ def initialize_http_header(initheader) #:nodoc:
186
+ @header = {}
187
+ return unless initheader
188
+ initheader.each do |key, value|
189
+ warn "net/http: duplicated HTTP header: #{key}", uplevel: 3 if key?(key) and $VERBOSE
190
+ if value.nil?
191
+ warn "net/http: nil HTTP header: #{key}", uplevel: 3 if $VERBOSE
192
+ else
193
+ value = value.strip # raise error for invalid byte sequences
194
+ if key.to_s.bytesize > MAX_KEY_LENGTH
195
+ raise ArgumentError, "too long (#{key.bytesize} bytes) header: #{key[0, 30].inspect}..."
196
+ end
197
+ if value.to_s.bytesize > MAX_FIELD_LENGTH
198
+ raise ArgumentError, "header #{key} has too long field value: #{value.bytesize}"
199
+ end
200
+ if value.count("\r\n") > 0
201
+ raise ArgumentError, "header #{key} has field value #{value.inspect}, this cannot include CR/LF"
202
+ end
203
+ @header[key.downcase.to_s] = [value]
204
+ end
205
+ end
206
+ end
207
+
208
+ def size #:nodoc: obsolete
209
+ @header.size
210
+ end
211
+
212
+ alias length size #:nodoc: obsolete
213
+
214
+ # Returns the string field value for the case-insensitive field +key+,
215
+ # or +nil+ if there is no such key;
216
+ # see {Fields}[rdoc-ref:Gem::Net::HTTPHeader@Fields]:
217
+ #
218
+ # res = Gem::Net::HTTP.get_response(hostname, '/todos/1')
219
+ # res['Connection'] # => "keep-alive"
220
+ # res['Nosuch'] # => nil
221
+ #
222
+ # Note that some field values may be retrieved via convenience methods;
223
+ # see {Getters}[rdoc-ref:Gem::Net::HTTPHeader@Getters].
224
+ def [](key)
225
+ a = @header[key.downcase.to_s] or return nil
226
+ a.join(', ')
227
+ end
228
+
229
+ # Sets the value for the case-insensitive +key+ to +val+,
230
+ # overwriting the previous value if the field exists;
231
+ # see {Fields}[rdoc-ref:Gem::Net::HTTPHeader@Fields]:
232
+ #
233
+ # req = Gem::Net::HTTP::Get.new(uri)
234
+ # req['Accept'] # => "*/*"
235
+ # req['Accept'] = 'text/html'
236
+ # req['Accept'] # => "text/html"
237
+ #
238
+ # Note that some field values may be set via convenience methods;
239
+ # see {Setters}[rdoc-ref:Gem::Net::HTTPHeader@Setters].
240
+ def []=(key, val)
241
+ unless val
242
+ @header.delete key.downcase.to_s
243
+ return val
244
+ end
245
+ set_field(key, val)
246
+ end
247
+
248
+ # Adds value +val+ to the value array for field +key+ if the field exists;
249
+ # creates the field with the given +key+ and +val+ if it does not exist.
250
+ # see {Fields}[rdoc-ref:Gem::Net::HTTPHeader@Fields]:
251
+ #
252
+ # req = Gem::Net::HTTP::Get.new(uri)
253
+ # req.add_field('Foo', 'bar')
254
+ # req['Foo'] # => "bar"
255
+ # req.add_field('Foo', 'baz')
256
+ # req['Foo'] # => "bar, baz"
257
+ # req.add_field('Foo', %w[baz bam])
258
+ # req['Foo'] # => "bar, baz, baz, bam"
259
+ # req.get_fields('Foo') # => ["bar", "baz", "baz", "bam"]
260
+ #
261
+ def add_field(key, val)
262
+ stringified_downcased_key = key.downcase.to_s
263
+ if @header.key?(stringified_downcased_key)
264
+ append_field_value(@header[stringified_downcased_key], val)
265
+ else
266
+ set_field(key, val)
267
+ end
268
+ end
269
+
270
+ private def set_field(key, val)
271
+ case val
272
+ when Enumerable
273
+ ary = []
274
+ append_field_value(ary, val)
275
+ @header[key.downcase.to_s] = ary
276
+ else
277
+ val = val.to_s # for compatibility use to_s instead of to_str
278
+ if val.b.count("\r\n") > 0
279
+ raise ArgumentError, 'header field value cannot include CR/LF'
280
+ end
281
+ @header[key.downcase.to_s] = [val]
282
+ end
283
+ end
284
+
285
+ private def append_field_value(ary, val)
286
+ case val
287
+ when Enumerable
288
+ val.each{|x| append_field_value(ary, x)}
289
+ else
290
+ val = val.to_s
291
+ if /[\r\n]/n.match?(val.b)
292
+ raise ArgumentError, 'header field value cannot include CR/LF'
293
+ end
294
+ ary.push val
295
+ end
296
+ end
297
+
298
+ # Returns the array field value for the given +key+,
299
+ # or +nil+ if there is no such field;
300
+ # see {Fields}[rdoc-ref:Gem::Net::HTTPHeader@Fields]:
301
+ #
302
+ # res = Gem::Net::HTTP.get_response(hostname, '/todos/1')
303
+ # res.get_fields('Connection') # => ["keep-alive"]
304
+ # res.get_fields('Nosuch') # => nil
305
+ #
306
+ def get_fields(key)
307
+ stringified_downcased_key = key.downcase.to_s
308
+ return nil unless @header[stringified_downcased_key]
309
+ @header[stringified_downcased_key].dup
310
+ end
311
+
312
+ # call-seq:
313
+ # fetch(key, default_val = nil) {|key| ... } -> object
314
+ # fetch(key, default_val = nil) -> value or default_val
315
+ #
316
+ # With a block, returns the string value for +key+ if it exists;
317
+ # otherwise returns the value of the block;
318
+ # ignores the +default_val+;
319
+ # see {Fields}[rdoc-ref:Gem::Net::HTTPHeader@Fields]:
320
+ #
321
+ # res = Gem::Net::HTTP.get_response(hostname, '/todos/1')
322
+ #
323
+ # # Field exists; block not called.
324
+ # res.fetch('Connection') do |value|
325
+ # fail 'Cannot happen'
326
+ # end # => "keep-alive"
327
+ #
328
+ # # Field does not exist; block called.
329
+ # res.fetch('Nosuch') do |value|
330
+ # value.downcase
331
+ # end # => "nosuch"
332
+ #
333
+ # With no block, returns the string value for +key+ if it exists;
334
+ # otherwise, returns +default_val+ if it was given;
335
+ # otherwise raises an exception:
336
+ #
337
+ # res.fetch('Connection', 'Foo') # => "keep-alive"
338
+ # res.fetch('Nosuch', 'Foo') # => "Foo"
339
+ # res.fetch('Nosuch') # Raises KeyError.
340
+ #
341
+ def fetch(key, *args, &block) #:yield: +key+
342
+ a = @header.fetch(key.downcase.to_s, *args, &block)
343
+ a.kind_of?(Array) ? a.join(', ') : a
344
+ end
345
+
346
+ # Calls the block with each key/value pair:
347
+ #
348
+ # res = Gem::Net::HTTP.get_response(hostname, '/todos/1')
349
+ # res.each_header do |key, value|
350
+ # p [key, value] if key.start_with?('c')
351
+ # end
352
+ #
353
+ # Output:
354
+ #
355
+ # ["content-type", "application/json; charset=utf-8"]
356
+ # ["connection", "keep-alive"]
357
+ # ["cache-control", "max-age=43200"]
358
+ # ["cf-cache-status", "HIT"]
359
+ # ["cf-ray", "771d17e9bc542cf5-ORD"]
360
+ #
361
+ # Returns an enumerator if no block is given.
362
+ #
363
+ # Gem::Net::HTTPHeader#each is an alias for Gem::Net::HTTPHeader#each_header.
364
+ def each_header #:yield: +key+, +value+
365
+ block_given? or return enum_for(__method__) { @header.size }
366
+ @header.each do |k,va|
367
+ yield k, va.join(', ')
368
+ end
369
+ end
370
+
371
+ alias each each_header
372
+
373
+ # Calls the block with each field key:
374
+ #
375
+ # res = Gem::Net::HTTP.get_response(hostname, '/todos/1')
376
+ # res.each_key do |key|
377
+ # p key if key.start_with?('c')
378
+ # end
379
+ #
380
+ # Output:
381
+ #
382
+ # "content-type"
383
+ # "connection"
384
+ # "cache-control"
385
+ # "cf-cache-status"
386
+ # "cf-ray"
387
+ #
388
+ # Returns an enumerator if no block is given.
389
+ #
390
+ # Gem::Net::HTTPHeader#each_name is an alias for Gem::Net::HTTPHeader#each_key.
391
+ def each_name(&block) #:yield: +key+
392
+ block_given? or return enum_for(__method__) { @header.size }
393
+ @header.each_key(&block)
394
+ end
395
+
396
+ alias each_key each_name
397
+
398
+ # Calls the block with each capitalized field name:
399
+ #
400
+ # res = Gem::Net::HTTP.get_response(hostname, '/todos/1')
401
+ # res.each_capitalized_name do |key|
402
+ # p key if key.start_with?('C')
403
+ # end
404
+ #
405
+ # Output:
406
+ #
407
+ # "Content-Type"
408
+ # "Connection"
409
+ # "Cache-Control"
410
+ # "Cf-Cache-Status"
411
+ # "Cf-Ray"
412
+ #
413
+ # The capitalization is system-dependent;
414
+ # see {Case Mapping}[https://docs.ruby-lang.org/en/master/case_mapping_rdoc.html].
415
+ #
416
+ # Returns an enumerator if no block is given.
417
+ def each_capitalized_name #:yield: +key+
418
+ block_given? or return enum_for(__method__) { @header.size }
419
+ @header.each_key do |k|
420
+ yield capitalize(k)
421
+ end
422
+ end
423
+
424
+ # Calls the block with each string field value:
425
+ #
426
+ # res = Gem::Net::HTTP.get_response(hostname, '/todos/1')
427
+ # res.each_value do |value|
428
+ # p value if value.start_with?('c')
429
+ # end
430
+ #
431
+ # Output:
432
+ #
433
+ # "chunked"
434
+ # "cf-q-config;dur=6.0000002122251e-06"
435
+ # "cloudflare"
436
+ #
437
+ # Returns an enumerator if no block is given.
438
+ def each_value #:yield: +value+
439
+ block_given? or return enum_for(__method__) { @header.size }
440
+ @header.each_value do |va|
441
+ yield va.join(', ')
442
+ end
443
+ end
444
+
445
+ # Removes the header for the given case-insensitive +key+
446
+ # (see {Fields}[rdoc-ref:Gem::Net::HTTPHeader@Fields]);
447
+ # returns the deleted value, or +nil+ if no such field exists:
448
+ #
449
+ # req = Gem::Net::HTTP::Get.new(uri)
450
+ # req.delete('Accept') # => ["*/*"]
451
+ # req.delete('Nosuch') # => nil
452
+ #
453
+ def delete(key)
454
+ @header.delete(key.downcase.to_s)
455
+ end
456
+
457
+ # Returns +true+ if the field for the case-insensitive +key+ exists, +false+ otherwise:
458
+ #
459
+ # req = Gem::Net::HTTP::Get.new(uri)
460
+ # req.key?('Accept') # => true
461
+ # req.key?('Nosuch') # => false
462
+ #
463
+ def key?(key)
464
+ @header.key?(key.downcase.to_s)
465
+ end
466
+
467
+ # Returns a hash of the key/value pairs:
468
+ #
469
+ # req = Gem::Net::HTTP::Get.new(uri)
470
+ # req.to_hash
471
+ # # =>
472
+ # {"accept-encoding"=>["gzip;q=1.0,deflate;q=0.6,identity;q=0.3"],
473
+ # "accept"=>["*/*"],
474
+ # "user-agent"=>["Ruby"],
475
+ # "host"=>["jsonplaceholder.typicode.com"]}
476
+ #
477
+ def to_hash
478
+ @header.dup
479
+ end
480
+
481
+ # Like #each_header, but the keys are returned in capitalized form.
482
+ #
483
+ # Gem::Net::HTTPHeader#canonical_each is an alias for Gem::Net::HTTPHeader#each_capitalized.
484
+ def each_capitalized
485
+ block_given? or return enum_for(__method__) { @header.size }
486
+ @header.each do |k,v|
487
+ yield capitalize(k), v.join(', ')
488
+ end
489
+ end
490
+
491
+ alias canonical_each each_capitalized
492
+
493
+ def capitalize(name)
494
+ name.to_s.split(/-/).map {|s| s.capitalize }.join('-')
495
+ end
496
+ private :capitalize
497
+
498
+ # Returns an array of Range objects that represent
499
+ # the value of field <tt>'Range'</tt>,
500
+ # or +nil+ if there is no such field;
501
+ # see {Range request header}[https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#range-request-header]:
502
+ #
503
+ # req = Gem::Net::HTTP::Get.new(uri)
504
+ # req['Range'] = 'bytes=0-99,200-299,400-499'
505
+ # req.range # => [0..99, 200..299, 400..499]
506
+ # req.delete('Range')
507
+ # req.range # # => nil
508
+ #
509
+ def range
510
+ return nil unless @header['range']
511
+
512
+ value = self['Range']
513
+ # byte-range-set = *( "," OWS ) ( byte-range-spec / suffix-byte-range-spec )
514
+ # *( OWS "," [ OWS ( byte-range-spec / suffix-byte-range-spec ) ] )
515
+ # corrected collected ABNF
516
+ # http://tools.ietf.org/html/draft-ietf-httpbis-p5-range-19#section-5.4.1
517
+ # http://tools.ietf.org/html/draft-ietf-httpbis-p5-range-19#appendix-C
518
+ # http://tools.ietf.org/html/draft-ietf-httpbis-p1-messaging-19#section-3.2.5
519
+ unless /\Abytes=((?:,[ \t]*)*(?:\d+-\d*|-\d+)(?:[ \t]*,(?:[ \t]*\d+-\d*|-\d+)?)*)\z/ =~ value
520
+ raise Gem::Net::HTTPHeaderSyntaxError, "invalid syntax for byte-ranges-specifier: '#{value}'"
521
+ end
522
+
523
+ byte_range_set = $1
524
+ result = byte_range_set.split(/,/).map {|spec|
525
+ m = /(\d+)?\s*-\s*(\d+)?/i.match(spec) or
526
+ raise Gem::Net::HTTPHeaderSyntaxError, "invalid byte-range-spec: '#{spec}'"
527
+ d1 = m[1].to_i
528
+ d2 = m[2].to_i
529
+ if m[1] and m[2]
530
+ if d1 > d2
531
+ raise Gem::Net::HTTPHeaderSyntaxError, "last-byte-pos MUST greater than or equal to first-byte-pos but '#{spec}'"
532
+ end
533
+ d1..d2
534
+ elsif m[1]
535
+ d1..-1
536
+ elsif m[2]
537
+ -d2..-1
538
+ else
539
+ raise Gem::Net::HTTPHeaderSyntaxError, 'range is not specified'
540
+ end
541
+ }
542
+ # if result.empty?
543
+ # byte-range-set must include at least one byte-range-spec or suffix-byte-range-spec
544
+ # but above regexp already denies it.
545
+ if result.size == 1 && result[0].begin == 0 && result[0].end == -1
546
+ raise Gem::Net::HTTPHeaderSyntaxError, 'only one suffix-byte-range-spec with zero suffix-length'
547
+ end
548
+ result
549
+ end
550
+
551
+ # call-seq:
552
+ # set_range(length) -> length
553
+ # set_range(offset, length) -> range
554
+ # set_range(begin..length) -> range
555
+ #
556
+ # Sets the value for field <tt>'Range'</tt>;
557
+ # see {Range request header}[https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#range-request-header]:
558
+ #
559
+ # With argument +length+:
560
+ #
561
+ # req = Gem::Net::HTTP::Get.new(uri)
562
+ # req.set_range(100) # => 100
563
+ # req['Range'] # => "bytes=0-99"
564
+ #
565
+ # With arguments +offset+ and +length+:
566
+ #
567
+ # req.set_range(100, 100) # => 100...200
568
+ # req['Range'] # => "bytes=100-199"
569
+ #
570
+ # With argument +range+:
571
+ #
572
+ # req.set_range(100..199) # => 100..199
573
+ # req['Range'] # => "bytes=100-199"
574
+ #
575
+ # Gem::Net::HTTPHeader#range= is an alias for Gem::Net::HTTPHeader#set_range.
576
+ def set_range(r, e = nil)
577
+ unless r
578
+ @header.delete 'range'
579
+ return r
580
+ end
581
+ r = (r...r+e) if e
582
+ case r
583
+ when Numeric
584
+ n = r.to_i
585
+ rangestr = (n > 0 ? "0-#{n-1}" : "-#{-n}")
586
+ when Range
587
+ first = r.first
588
+ last = r.end
589
+ last -= 1 if r.exclude_end?
590
+ if last == -1
591
+ rangestr = (first > 0 ? "#{first}-" : "-#{-first}")
592
+ else
593
+ raise Gem::Net::HTTPHeaderSyntaxError, 'range.first is negative' if first < 0
594
+ raise Gem::Net::HTTPHeaderSyntaxError, 'range.last is negative' if last < 0
595
+ raise Gem::Net::HTTPHeaderSyntaxError, 'must be .first < .last' if first > last
596
+ rangestr = "#{first}-#{last}"
597
+ end
598
+ else
599
+ raise TypeError, 'Range/Integer is required'
600
+ end
601
+ @header['range'] = ["bytes=#{rangestr}"]
602
+ r
603
+ end
604
+
605
+ alias range= set_range
606
+
607
+ # Returns the value of field <tt>'Content-Length'</tt> as an integer,
608
+ # or +nil+ if there is no such field;
609
+ # see {Content-Length request header}[https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#content-length-request-header]:
610
+ #
611
+ # res = Gem::Net::HTTP.get_response(hostname, '/nosuch/1')
612
+ # res.content_length # => 2
613
+ # res = Gem::Net::HTTP.get_response(hostname, '/todos/1')
614
+ # res.content_length # => nil
615
+ #
616
+ def content_length
617
+ return nil unless key?('Content-Length')
618
+ len = self['Content-Length'].slice(/\d+/) or
619
+ raise Gem::Net::HTTPHeaderSyntaxError, 'wrong Content-Length format'
620
+ len.to_i
621
+ end
622
+
623
+ # Sets the value of field <tt>'Content-Length'</tt> to the given numeric;
624
+ # see {Content-Length response header}[https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#content-length-response-header]:
625
+ #
626
+ # _uri = uri.dup
627
+ # hostname = _uri.hostname # => "jsonplaceholder.typicode.com"
628
+ # _uri.path = '/posts' # => "/posts"
629
+ # req = Gem::Net::HTTP::Post.new(_uri) # => #<Gem::Net::HTTP::Post POST>
630
+ # req.body = '{"title": "foo","body": "bar","userId": 1}'
631
+ # req.content_length = req.body.size # => 42
632
+ # req.content_type = 'application/json'
633
+ # res = Gem::Net::HTTP.start(hostname) do |http|
634
+ # http.request(req)
635
+ # end # => #<Gem::Net::HTTPCreated 201 Created readbody=true>
636
+ #
637
+ def content_length=(len)
638
+ unless len
639
+ @header.delete 'content-length'
640
+ return nil
641
+ end
642
+ @header['content-length'] = [len.to_i.to_s]
643
+ end
644
+
645
+ # Returns +true+ if field <tt>'Transfer-Encoding'</tt>
646
+ # exists and has value <tt>'chunked'</tt>,
647
+ # +false+ otherwise;
648
+ # see {Transfer-Encoding response header}[https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#transfer-encoding-response-header]:
649
+ #
650
+ # res = Gem::Net::HTTP.get_response(hostname, '/todos/1')
651
+ # res['Transfer-Encoding'] # => "chunked"
652
+ # res.chunked? # => true
653
+ #
654
+ def chunked?
655
+ return false unless @header['transfer-encoding']
656
+ field = self['Transfer-Encoding']
657
+ (/(?:\A|[^\-\w])chunked(?![\-\w])/i =~ field) ? true : false
658
+ end
659
+
660
+ # Returns a Range object representing the value of field
661
+ # <tt>'Content-Range'</tt>, or +nil+ if no such field exists;
662
+ # see {Content-Range response header}[https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#content-range-response-header]:
663
+ #
664
+ # res = Gem::Net::HTTP.get_response(hostname, '/todos/1')
665
+ # res['Content-Range'] # => nil
666
+ # res['Content-Range'] = 'bytes 0-499/1000'
667
+ # res['Content-Range'] # => "bytes 0-499/1000"
668
+ # res.content_range # => 0..499
669
+ #
670
+ def content_range
671
+ return nil unless @header['content-range']
672
+ m = %r<\A\s*(\w+)\s+(\d+)-(\d+)/(\d+|\*)>.match(self['Content-Range']) or
673
+ raise Gem::Net::HTTPHeaderSyntaxError, 'wrong Content-Range format'
674
+ return unless m[1] == 'bytes'
675
+ m[2].to_i .. m[3].to_i
676
+ end
677
+
678
+ # Returns the integer representing length of the value of field
679
+ # <tt>'Content-Range'</tt>, or +nil+ if no such field exists;
680
+ # see {Content-Range response header}[https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#content-range-response-header]:
681
+ #
682
+ # res = Gem::Net::HTTP.get_response(hostname, '/todos/1')
683
+ # res['Content-Range'] # => nil
684
+ # res['Content-Range'] = 'bytes 0-499/1000'
685
+ # res.range_length # => 500
686
+ #
687
+ def range_length
688
+ r = content_range() or return nil
689
+ r.end - r.begin + 1
690
+ end
691
+
692
+ # Returns the {media type}[https://en.wikipedia.org/wiki/Media_type]
693
+ # from the value of field <tt>'Content-Type'</tt>,
694
+ # or +nil+ if no such field exists;
695
+ # see {Content-Type response header}[https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#content-type-response-header]:
696
+ #
697
+ # res = Gem::Net::HTTP.get_response(hostname, '/todos/1')
698
+ # res['content-type'] # => "application/json; charset=utf-8"
699
+ # res.content_type # => "application/json"
700
+ #
701
+ def content_type
702
+ main = main_type()
703
+ return nil unless main
704
+
705
+ sub = sub_type()
706
+ if sub
707
+ "#{main}/#{sub}"
708
+ else
709
+ main
710
+ end
711
+ end
712
+
713
+ # Returns the leading ('type') part of the
714
+ # {media type}[https://en.wikipedia.org/wiki/Media_type]
715
+ # from the value of field <tt>'Content-Type'</tt>,
716
+ # or +nil+ if no such field exists;
717
+ # see {Content-Type response header}[https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#content-type-response-header]:
718
+ #
719
+ # res = Gem::Net::HTTP.get_response(hostname, '/todos/1')
720
+ # res['content-type'] # => "application/json; charset=utf-8"
721
+ # res.main_type # => "application"
722
+ #
723
+ def main_type
724
+ return nil unless @header['content-type']
725
+ self['Content-Type'].split(';').first.to_s.split('/')[0].to_s.strip
726
+ end
727
+
728
+ # Returns the trailing ('subtype') part of the
729
+ # {media type}[https://en.wikipedia.org/wiki/Media_type]
730
+ # from the value of field <tt>'Content-Type'</tt>,
731
+ # or +nil+ if no such field exists;
732
+ # see {Content-Type response header}[https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#content-type-response-header]:
733
+ #
734
+ # res = Gem::Net::HTTP.get_response(hostname, '/todos/1')
735
+ # res['content-type'] # => "application/json; charset=utf-8"
736
+ # res.sub_type # => "json"
737
+ #
738
+ def sub_type
739
+ return nil unless @header['content-type']
740
+ _, sub = *self['Content-Type'].split(';').first.to_s.split('/')
741
+ return nil unless sub
742
+ sub.strip
743
+ end
744
+
745
+ # Returns the trailing ('parameters') part of the value of field <tt>'Content-Type'</tt>,
746
+ # or +nil+ if no such field exists;
747
+ # see {Content-Type response header}[https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#content-type-response-header]:
748
+ #
749
+ # res = Gem::Net::HTTP.get_response(hostname, '/todos/1')
750
+ # res['content-type'] # => "application/json; charset=utf-8"
751
+ # res.type_params # => {"charset"=>"utf-8"}
752
+ #
753
+ def type_params
754
+ result = {}
755
+ list = self['Content-Type'].to_s.split(';')
756
+ list.shift
757
+ list.each do |param|
758
+ k, v = *param.split('=', 2)
759
+ result[k.strip] = v.strip
760
+ end
761
+ result
762
+ end
763
+
764
+ # Sets the value of field <tt>'Content-Type'</tt>;
765
+ # returns the new value;
766
+ # see {Content-Type request header}[https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#content-type-request-header]:
767
+ #
768
+ # req = Gem::Net::HTTP::Get.new(uri)
769
+ # req.set_content_type('application/json') # => ["application/json"]
770
+ #
771
+ # Gem::Net::HTTPHeader#content_type= is an alias for Gem::Net::HTTPHeader#set_content_type.
772
+ def set_content_type(type, params = {})
773
+ @header['content-type'] = [type + params.map{|k,v|"; #{k}=#{v}"}.join('')]
774
+ end
775
+
776
+ alias content_type= set_content_type
777
+
778
+ # Sets the request body to a URL-encoded string derived from argument +params+,
779
+ # and sets request header field <tt>'Content-Type'</tt>
780
+ # to <tt>'application/x-www-form-urlencoded'</tt>.
781
+ #
782
+ # The resulting request is suitable for HTTP request +POST+ or +PUT+.
783
+ #
784
+ # Argument +params+ must be suitable for use as argument +enum+ to
785
+ # {URI.encode_www_form}[https://docs.ruby-lang.org/en/master/URI.html#method-c-encode_www_form].
786
+ #
787
+ # With only argument +params+ given,
788
+ # sets the body to a URL-encoded string with the default separator <tt>'&'</tt>:
789
+ #
790
+ # req = Gem::Net::HTTP::Post.new('example.com')
791
+ #
792
+ # req.set_form_data(q: 'ruby', lang: 'en')
793
+ # req.body # => "q=ruby&lang=en"
794
+ # req['Content-Type'] # => "application/x-www-form-urlencoded"
795
+ #
796
+ # req.set_form_data([['q', 'ruby'], ['lang', 'en']])
797
+ # req.body # => "q=ruby&lang=en"
798
+ #
799
+ # req.set_form_data(q: ['ruby', 'perl'], lang: 'en')
800
+ # req.body # => "q=ruby&q=perl&lang=en"
801
+ #
802
+ # req.set_form_data([['q', 'ruby'], ['q', 'perl'], ['lang', 'en']])
803
+ # req.body # => "q=ruby&q=perl&lang=en"
804
+ #
805
+ # With string argument +sep+ also given,
806
+ # uses that string as the separator:
807
+ #
808
+ # req.set_form_data({q: 'ruby', lang: 'en'}, '|')
809
+ # req.body # => "q=ruby|lang=en"
810
+ #
811
+ # Gem::Net::HTTPHeader#form_data= is an alias for Gem::Net::HTTPHeader#set_form_data.
812
+ def set_form_data(params, sep = '&')
813
+ query = URI.encode_www_form(params)
814
+ query.gsub!(/&/, sep) if sep != '&'
815
+ self.body = query
816
+ self.content_type = 'application/x-www-form-urlencoded'
817
+ end
818
+
819
+ alias form_data= set_form_data
820
+
821
+ # Stores form data to be used in a +POST+ or +PUT+ request.
822
+ #
823
+ # The form data given in +params+ consists of zero or more fields;
824
+ # each field is:
825
+ #
826
+ # - A scalar value.
827
+ # - A name/value pair.
828
+ # - An IO stream opened for reading.
829
+ #
830
+ # Argument +params+ should be an
831
+ # {Enumerable}[https://docs.ruby-lang.org/en/master/Enumerable.html#module-Enumerable-label-Enumerable+in+Ruby+Classes]
832
+ # (method <tt>params.map</tt> will be called),
833
+ # and is often an array or hash.
834
+ #
835
+ # First, we set up a request:
836
+ #
837
+ # _uri = uri.dup
838
+ # _uri.path ='/posts'
839
+ # req = Gem::Net::HTTP::Post.new(_uri)
840
+ #
841
+ # <b>Argument +params+ As an Array</b>
842
+ #
843
+ # When +params+ is an array,
844
+ # each of its elements is a subarray that defines a field;
845
+ # the subarray may contain:
846
+ #
847
+ # - One string:
848
+ #
849
+ # req.set_form([['foo'], ['bar'], ['baz']])
850
+ #
851
+ # - Two strings:
852
+ #
853
+ # req.set_form([%w[foo 0], %w[bar 1], %w[baz 2]])
854
+ #
855
+ # - When argument +enctype+ (see below) is given as
856
+ # <tt>'multipart/form-data'</tt>:
857
+ #
858
+ # - A string name and an IO stream opened for reading:
859
+ #
860
+ # require 'stringio'
861
+ # req.set_form([['file', StringIO.new('Ruby is cool.')]])
862
+ #
863
+ # - A string name, an IO stream opened for reading,
864
+ # and an options hash, which may contain these entries:
865
+ #
866
+ # - +:filename+: The name of the file to use.
867
+ # - +:content_type+: The content type of the uploaded file.
868
+ #
869
+ # Example:
870
+ #
871
+ # req.set_form([['file', file, {filename: "other-filename.foo"}]]
872
+ #
873
+ # The various forms may be mixed:
874
+ #
875
+ # req.set_form(['foo', %w[bar 1], ['file', file]])
876
+ #
877
+ # <b>Argument +params+ As a Hash</b>
878
+ #
879
+ # When +params+ is a hash,
880
+ # each of its entries is a name/value pair that defines a field:
881
+ #
882
+ # - The name is a string.
883
+ # - The value may be:
884
+ #
885
+ # - +nil+.
886
+ # - Another string.
887
+ # - An IO stream opened for reading
888
+ # (only when argument +enctype+ -- see below -- is given as
889
+ # <tt>'multipart/form-data'</tt>).
890
+ #
891
+ # Examples:
892
+ #
893
+ # # Nil-valued fields.
894
+ # req.set_form({'foo' => nil, 'bar' => nil, 'baz' => nil})
895
+ #
896
+ # # String-valued fields.
897
+ # req.set_form({'foo' => 0, 'bar' => 1, 'baz' => 2})
898
+ #
899
+ # # IO-valued field.
900
+ # require 'stringio'
901
+ # req.set_form({'file' => StringIO.new('Ruby is cool.')})
902
+ #
903
+ # # Mixture of fields.
904
+ # req.set_form({'foo' => nil, 'bar' => 1, 'file' => file})
905
+ #
906
+ # Optional argument +enctype+ specifies the value to be given
907
+ # to field <tt>'Content-Type'</tt>, and must be one of:
908
+ #
909
+ # - <tt>'application/x-www-form-urlencoded'</tt> (the default).
910
+ # - <tt>'multipart/form-data'</tt>;
911
+ # see {RFC 7578}[https://www.rfc-editor.org/rfc/rfc7578].
912
+ #
913
+ # Optional argument +formopt+ is a hash of options
914
+ # (applicable only when argument +enctype+
915
+ # is <tt>'multipart/form-data'</tt>)
916
+ # that may include the following entries:
917
+ #
918
+ # - +:boundary+: The value is the boundary string for the multipart message.
919
+ # If not given, the boundary is a random string.
920
+ # See {Boundary}[https://www.rfc-editor.org/rfc/rfc7578#section-4.1].
921
+ # - +:charset+: Value is the character set for the form submission.
922
+ # Field names and values of non-file fields should be encoded with this charset.
923
+ #
924
+ def set_form(params, enctype='application/x-www-form-urlencoded', formopt={})
925
+ @body_data = params
926
+ @body = nil
927
+ @body_stream = nil
928
+ @form_option = formopt
929
+ case enctype
930
+ when /\Aapplication\/x-www-form-urlencoded\z/i,
931
+ /\Amultipart\/form-data\z/i
932
+ self.content_type = enctype
933
+ else
934
+ raise ArgumentError, "invalid enctype: #{enctype}"
935
+ end
936
+ end
937
+
938
+ # Sets header <tt>'Authorization'</tt> using the given
939
+ # +account+ and +password+ strings:
940
+ #
941
+ # req.basic_auth('my_account', 'my_password')
942
+ # req['Authorization']
943
+ # # => "Basic bXlfYWNjb3VudDpteV9wYXNzd29yZA=="
944
+ #
945
+ def basic_auth(account, password)
946
+ @header['authorization'] = [basic_encode(account, password)]
947
+ end
948
+
949
+ # Sets header <tt>'Proxy-Authorization'</tt> using the given
950
+ # +account+ and +password+ strings:
951
+ #
952
+ # req.proxy_basic_auth('my_account', 'my_password')
953
+ # req['Proxy-Authorization']
954
+ # # => "Basic bXlfYWNjb3VudDpteV9wYXNzd29yZA=="
955
+ #
956
+ def proxy_basic_auth(account, password)
957
+ @header['proxy-authorization'] = [basic_encode(account, password)]
958
+ end
959
+
960
+ def basic_encode(account, password)
961
+ 'Basic ' + ["#{account}:#{password}"].pack('m0')
962
+ end
963
+ private :basic_encode
964
+
965
+ # Returns whether the HTTP session is to be closed.
966
+ def connection_close?
967
+ token = /(?:\A|,)\s*close\s*(?:\z|,)/i
968
+ @header['connection']&.grep(token) {return true}
969
+ @header['proxy-connection']&.grep(token) {return true}
970
+ false
971
+ end
972
+
973
+ # Returns whether the HTTP session is to be kept alive.
974
+ def connection_keep_alive?
975
+ token = /(?:\A|,)\s*keep-alive\s*(?:\z|,)/i
976
+ @header['connection']&.grep(token) {return true}
977
+ @header['proxy-connection']&.grep(token) {return true}
978
+ false
979
+ end
980
+
981
+ end