rubygems-update 3.4.22 → 3.5.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +99 -2
- data/Manifest.txt +34 -221
- data/README.md +1 -3
- data/bundler/CHANGELOG.md +53 -0
- data/bundler/bundler.gemspec +4 -2
- data/bundler/exe/bundle +1 -10
- data/bundler/lib/bundler/build_metadata.rb +3 -3
- data/bundler/lib/bundler/capistrano.rb +1 -1
- data/bundler/lib/bundler/checksum.rb +245 -0
- data/bundler/lib/bundler/ci_detector.rb +75 -0
- data/bundler/lib/bundler/cli/add.rb +3 -3
- data/bundler/lib/bundler/cli/binstubs.rb +4 -4
- data/bundler/lib/bundler/cli/cache.rb +1 -1
- data/bundler/lib/bundler/cli/check.rb +1 -1
- data/bundler/lib/bundler/cli/common.rb +9 -1
- data/bundler/lib/bundler/cli/config.rb +8 -7
- data/bundler/lib/bundler/cli/console.rb +3 -2
- data/bundler/lib/bundler/cli/doctor.rb +2 -2
- data/bundler/lib/bundler/cli/exec.rb +1 -1
- data/bundler/lib/bundler/cli/gem.rb +28 -23
- data/bundler/lib/bundler/cli/info.rb +2 -13
- data/bundler/lib/bundler/cli/install.rb +5 -4
- data/bundler/lib/bundler/cli/issue.rb +1 -1
- data/bundler/lib/bundler/cli/lock.rb +4 -4
- data/bundler/lib/bundler/cli/open.rb +1 -1
- data/bundler/lib/bundler/cli/outdated.rb +6 -6
- data/bundler/lib/bundler/cli/plugin.rb +7 -14
- data/bundler/lib/bundler/cli/pristine.rb +38 -30
- data/bundler/lib/bundler/cli/show.rb +2 -2
- data/bundler/lib/bundler/cli/update.rb +5 -5
- data/bundler/lib/bundler/cli.rb +215 -263
- data/bundler/lib/bundler/compact_index_client/cache.rb +29 -9
- data/bundler/lib/bundler/compact_index_client/cache_file.rb +153 -0
- data/bundler/lib/bundler/compact_index_client/gem_parser.rb +7 -3
- data/bundler/lib/bundler/compact_index_client/updater.rb +79 -81
- data/bundler/lib/bundler/compact_index_client.rb +14 -7
- data/bundler/lib/bundler/constants.rb +1 -1
- data/bundler/lib/bundler/current_ruby.rb +5 -21
- data/bundler/lib/bundler/definition.rb +42 -15
- data/bundler/lib/bundler/dependency.rb +16 -12
- data/bundler/lib/bundler/digest.rb +2 -2
- data/bundler/lib/bundler/dsl.rb +43 -25
- data/bundler/lib/bundler/endpoint_specification.rb +5 -1
- data/bundler/lib/bundler/env.rb +1 -3
- data/bundler/lib/bundler/errors.rb +43 -0
- data/bundler/lib/bundler/fetcher/base.rb +3 -1
- data/bundler/lib/bundler/fetcher/compact_index.rb +4 -4
- data/bundler/lib/bundler/fetcher/downloader.rb +13 -11
- data/bundler/lib/bundler/fetcher/gem_remote_fetcher.rb +16 -0
- data/bundler/lib/bundler/fetcher/index.rb +1 -1
- data/bundler/lib/bundler/fetcher.rb +28 -25
- data/bundler/lib/bundler/friendly_errors.rb +5 -5
- data/bundler/lib/bundler/gem_helper.rb +1 -1
- data/bundler/lib/bundler/gem_helpers.rb +5 -2
- data/bundler/lib/bundler/graph.rb +9 -9
- data/bundler/lib/bundler/index.rb +1 -2
- data/bundler/lib/bundler/injector.rb +1 -1
- data/bundler/lib/bundler/inline.rb +3 -3
- data/bundler/lib/bundler/installer/gem_installer.rb +5 -5
- data/bundler/lib/bundler/installer/parallel_installer.rb +16 -8
- data/bundler/lib/bundler/installer/standalone.rb +2 -3
- data/bundler/lib/bundler/installer.rb +9 -9
- data/bundler/lib/bundler/lazy_specification.rb +24 -17
- data/bundler/lib/bundler/lockfile_generator.rb +9 -0
- data/bundler/lib/bundler/lockfile_parser.rb +81 -10
- data/bundler/lib/bundler/man/bundle-add.1 +3 -26
- data/bundler/lib/bundler/man/bundle-binstubs.1 +4 -16
- data/bundler/lib/bundler/man/bundle-cache.1 +3 -24
- data/bundler/lib/bundler/man/bundle-check.1 +3 -12
- data/bundler/lib/bundler/man/bundle-clean.1 +3 -10
- data/bundler/lib/bundler/man/bundle-config.1 +20 -211
- data/bundler/lib/bundler/man/bundle-config.1.ronn +6 -0
- data/bundler/lib/bundler/man/bundle-console.1 +4 -22
- data/bundler/lib/bundler/man/bundle-doctor.1 +4 -18
- data/bundler/lib/bundler/man/bundle-exec.1 +12 -73
- data/bundler/lib/bundler/man/bundle-gem.1 +13 -49
- data/bundler/lib/bundler/man/bundle-help.1 +3 -7
- data/bundler/lib/bundler/man/bundle-info.1 +3 -9
- data/bundler/lib/bundler/man/bundle-init.1 +3 -12
- data/bundler/lib/bundler/man/bundle-inject.1 +6 -19
- data/bundler/lib/bundler/man/bundle-install.1 +27 -125
- data/bundler/lib/bundler/man/bundle-install.1.ronn +1 -0
- data/bundler/lib/bundler/man/bundle-list.1 +4 -19
- data/bundler/lib/bundler/man/bundle-lock.1 +5 -29
- data/bundler/lib/bundler/man/bundle-open.1 +7 -27
- data/bundler/lib/bundler/man/bundle-outdated.1 +3 -55
- data/bundler/lib/bundler/man/bundle-outdated.1.ronn +1 -0
- data/bundler/lib/bundler/man/bundle-platform.1 +5 -27
- data/bundler/lib/bundler/man/bundle-plugin.1 +3 -29
- data/bundler/lib/bundler/man/bundle-pristine.1 +5 -16
- data/bundler/lib/bundler/man/bundle-remove.1 +4 -14
- data/bundler/lib/bundler/man/bundle-show.1 +3 -10
- data/bundler/lib/bundler/man/bundle-update.1 +18 -137
- data/bundler/lib/bundler/man/bundle-version.1 +3 -16
- data/bundler/lib/bundler/man/bundle-viz.1 +4 -16
- data/bundler/lib/bundler/man/bundle.1 +5 -44
- data/bundler/lib/bundler/man/gemfile.5 +24 -301
- data/bundler/lib/bundler/man/gemfile.5.ronn +4 -0
- data/bundler/lib/bundler/match_metadata.rb +4 -0
- data/bundler/lib/bundler/match_platform.rb +1 -1
- data/bundler/lib/bundler/plugin/api/source.rb +3 -2
- data/bundler/lib/bundler/plugin/installer.rb +1 -1
- data/bundler/lib/bundler/plugin.rb +3 -3
- data/bundler/lib/bundler/resolver/base.rb +1 -1
- data/bundler/lib/bundler/resolver/incompatibility.rb +1 -1
- data/bundler/lib/bundler/resolver/spec_group.rb +1 -4
- data/bundler/lib/bundler/resolver.rb +16 -16
- data/bundler/lib/bundler/ruby_dsl.rb +20 -12
- data/bundler/lib/bundler/ruby_version.rb +1 -1
- data/bundler/lib/bundler/rubygems_ext.rb +24 -50
- data/bundler/lib/bundler/rubygems_gem_installer.rb +6 -56
- data/bundler/lib/bundler/rubygems_integration.rb +25 -94
- data/bundler/lib/bundler/runtime.rb +2 -2
- data/bundler/lib/bundler/self_manager.rb +23 -7
- data/bundler/lib/bundler/settings.rb +27 -7
- data/bundler/lib/bundler/setup.rb +4 -1
- data/bundler/lib/bundler/shared_helpers.rb +35 -13
- data/bundler/lib/bundler/source/git/git_proxy.rb +15 -15
- data/bundler/lib/bundler/source/git.rb +4 -3
- data/bundler/lib/bundler/source/metadata.rb +15 -15
- data/bundler/lib/bundler/source/path.rb +7 -6
- data/bundler/lib/bundler/source/rubygems.rb +21 -14
- data/bundler/lib/bundler/source.rb +2 -0
- data/bundler/lib/bundler/spec_set.rb +38 -10
- data/bundler/lib/bundler/stub_specification.rb +1 -0
- data/bundler/lib/bundler/templates/Executable.bundler +1 -1
- data/bundler/lib/bundler/templates/newgem/README.md.tt +3 -3
- data/bundler/lib/bundler/templates/newgem/Rakefile.tt +2 -6
- data/bundler/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +1 -1
- data/bundler/lib/bundler/templates/newgem/standard.yml.tt +1 -1
- data/bundler/lib/bundler/ui/shell.rb +1 -1
- data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +1 -1
- data/bundler/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +53 -6
- data/bundler/lib/bundler/vendor/fileutils/lib/fileutils.rb +8 -20
- data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +3 -3
- data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +2 -2
- data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +1 -1
- data/bundler/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +35 -35
- data/bundler/lib/bundler/vendor/tsort/lib/tsort.rb +3 -0
- data/bundler/lib/bundler/vendor/uri/lib/uri/common.rb +256 -132
- data/bundler/lib/bundler/vendor/uri/lib/uri/generic.rb +1 -0
- data/bundler/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +95 -31
- data/bundler/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
- data/bundler/lib/bundler/vendored_net_http.rb +8 -0
- data/bundler/lib/bundler/vendored_persistent.rb +0 -4
- data/bundler/lib/bundler/vendored_timeout.rb +8 -0
- data/bundler/lib/bundler/version.rb +1 -1
- data/bundler/lib/bundler/vlad.rb +1 -1
- data/bundler/lib/bundler/yaml_serializer.rb +3 -3
- data/bundler/lib/bundler.rb +38 -27
- data/lib/rubygems/available_set.rb +4 -4
- data/lib/rubygems/basic_specification.rb +35 -37
- data/lib/rubygems/bundler_version_finder.rb +4 -4
- data/lib/rubygems/ci_detector.rb +75 -0
- data/lib/rubygems/command.rb +13 -15
- data/lib/rubygems/command_manager.rb +5 -4
- data/lib/rubygems/commands/build_command.rb +2 -2
- data/lib/rubygems/commands/cert_command.rb +1 -2
- data/lib/rubygems/commands/check_command.rb +4 -4
- data/lib/rubygems/commands/cleanup_command.rb +12 -14
- data/lib/rubygems/commands/contents_command.rb +4 -4
- data/lib/rubygems/commands/dependency_command.rb +4 -5
- data/lib/rubygems/commands/environment_command.rb +1 -3
- data/lib/rubygems/commands/exec_command.rb +1 -1
- data/lib/rubygems/commands/fetch_command.rb +2 -2
- data/lib/rubygems/commands/generate_index_command.rb +39 -74
- data/lib/rubygems/commands/help_command.rb +3 -3
- data/lib/rubygems/commands/info_command.rb +2 -2
- data/lib/rubygems/commands/install_command.rb +8 -16
- data/lib/rubygems/commands/list_command.rb +2 -2
- data/lib/rubygems/commands/lock_command.rb +1 -1
- data/lib/rubygems/commands/open_command.rb +1 -1
- data/lib/rubygems/commands/owner_command.rb +1 -1
- data/lib/rubygems/commands/pristine_command.rb +13 -15
- data/lib/rubygems/commands/push_command.rb +2 -2
- data/lib/rubygems/commands/query_command.rb +4 -5
- data/lib/rubygems/commands/rdoc_command.rb +2 -2
- data/lib/rubygems/commands/search_command.rb +2 -2
- data/lib/rubygems/commands/setup_command.rb +31 -34
- data/lib/rubygems/commands/sources_command.rb +12 -12
- data/lib/rubygems/commands/specification_command.rb +10 -10
- data/lib/rubygems/commands/stale_command.rb +1 -1
- data/lib/rubygems/commands/uninstall_command.rb +9 -10
- data/lib/rubygems/commands/unpack_command.rb +4 -4
- data/lib/rubygems/commands/update_command.rb +10 -12
- data/lib/rubygems/commands/which_command.rb +1 -1
- data/lib/rubygems/commands/yank_command.rb +1 -1
- data/lib/rubygems/compatibility.rb +5 -6
- data/lib/rubygems/config_file.rb +4 -4
- data/lib/rubygems/core_ext/kernel_gem.rb +0 -2
- data/lib/rubygems/core_ext/kernel_require.rb +19 -48
- data/lib/rubygems/core_ext/kernel_warn.rb +1 -1
- data/lib/rubygems/core_ext/tcpsocket_init.rb +1 -1
- data/lib/rubygems/defaults.rb +15 -3
- data/lib/rubygems/dependency.rb +12 -14
- data/lib/rubygems/dependency_installer.rb +29 -30
- data/lib/rubygems/dependency_list.rb +1 -1
- data/lib/rubygems/deprecate.rb +16 -15
- data/lib/rubygems/doctor.rb +5 -5
- data/lib/rubygems/errors.rb +2 -6
- data/lib/rubygems/exceptions.rb +2 -1
- data/lib/rubygems/ext/builder.rb +15 -10
- data/lib/rubygems/ext/cargo_builder.rb +5 -5
- data/lib/rubygems/ext/ext_conf_builder.rb +1 -3
- data/lib/rubygems/gem_runner.rb +4 -4
- data/lib/rubygems/gemcutter_utilities/webauthn_listener/response.rb +3 -3
- data/lib/rubygems/gemcutter_utilities/webauthn_poller.rb +3 -3
- data/lib/rubygems/gemcutter_utilities.rb +18 -19
- data/lib/rubygems/install_update_options.rb +18 -19
- data/lib/rubygems/installer.rb +59 -33
- data/lib/rubygems/installer_uninstaller_utils.rb +0 -2
- data/lib/rubygems/local_remote_options.rb +7 -10
- data/lib/rubygems/name_tuple.rb +7 -9
- data/lib/rubygems/net/http.rb +3 -0
- data/lib/rubygems/net-http/LICENSE.txt +22 -0
- data/lib/rubygems/net-http/lib/net/http/backward.rb +40 -0
- data/lib/rubygems/net-http/lib/net/http/exceptions.rb +34 -0
- data/lib/rubygems/net-http/lib/net/http/generic_request.rb +414 -0
- data/lib/rubygems/net-http/lib/net/http/header.rb +981 -0
- data/lib/rubygems/net-http/lib/net/http/proxy_delta.rb +17 -0
- data/lib/rubygems/net-http/lib/net/http/request.rb +88 -0
- data/lib/rubygems/net-http/lib/net/http/requests.rb +425 -0
- data/lib/rubygems/net-http/lib/net/http/response.rb +738 -0
- data/lib/rubygems/net-http/lib/net/http/responses.rb +1174 -0
- data/lib/rubygems/net-http/lib/net/http/status.rb +84 -0
- data/lib/rubygems/net-http/lib/net/http.rb +2496 -0
- data/lib/rubygems/net-http/lib/net/https.rb +23 -0
- data/lib/rubygems/net-protocol/LICENSE.txt +22 -0
- data/lib/rubygems/net-protocol/lib/net/protocol.rb +544 -0
- data/lib/rubygems/optparse/lib/optparse.rb +39 -17
- data/lib/rubygems/package/old.rb +2 -2
- data/lib/rubygems/package/tar_header.rb +45 -39
- data/lib/rubygems/package/tar_reader/entry.rb +5 -4
- data/lib/rubygems/package/tar_reader.rb +5 -3
- data/lib/rubygems/package/tar_writer.rb +19 -17
- data/lib/rubygems/package.rb +27 -26
- data/lib/rubygems/package_task.rb +2 -2
- data/lib/rubygems/path_support.rb +9 -10
- data/lib/rubygems/platform.rb +60 -45
- data/lib/rubygems/query_utils.rb +7 -9
- data/lib/rubygems/remote_fetcher.rb +15 -15
- data/lib/rubygems/request/connection_pools.rb +3 -3
- data/lib/rubygems/request.rb +20 -17
- data/lib/rubygems/request_set/gem_dependency_api.rb +119 -122
- data/lib/rubygems/request_set/lockfile/parser.rb +9 -9
- data/lib/rubygems/request_set/lockfile/tokenizer.rb +20 -12
- data/lib/rubygems/request_set/lockfile.rb +6 -11
- data/lib/rubygems/request_set.rb +5 -5
- data/lib/rubygems/requirement.rb +7 -7
- data/lib/rubygems/resolv/LICENSE.txt +22 -0
- data/lib/rubygems/resolv/lib/resolv.rb +3387 -0
- data/lib/rubygems/resolver/activation_request.rb +1 -3
- data/lib/rubygems/resolver/api_set/gem_parser.rb +7 -3
- data/lib/rubygems/resolver/best_set.rb +1 -1
- data/lib/rubygems/resolver/composed_set.rb +1 -1
- data/lib/rubygems/resolver/conflict.rb +4 -12
- data/lib/rubygems/resolver/index_set.rb +4 -4
- data/lib/rubygems/resolver/index_specification.rb +2 -2
- data/lib/rubygems/resolver/installer_set.rb +5 -6
- data/lib/rubygems/resolver/lock_set.rb +1 -1
- data/lib/rubygems/resolver.rb +3 -10
- data/lib/rubygems/s3_uri_signer.rb +6 -6
- data/lib/rubygems/safe_marshal/elements.rb +138 -0
- data/lib/rubygems/safe_marshal/reader.rb +306 -0
- data/lib/rubygems/safe_marshal/visitors/stream_printer.rb +31 -0
- data/lib/rubygems/safe_marshal/visitors/to_ruby.rb +385 -0
- data/lib/rubygems/safe_marshal/visitors/visitor.rb +74 -0
- data/lib/rubygems/safe_marshal.rb +74 -0
- data/lib/rubygems/safe_yaml.rb +5 -28
- data/lib/rubygems/security/policies.rb +36 -38
- data/lib/rubygems/security/policy.rb +7 -11
- data/lib/rubygems/security/signer.rb +1 -1
- data/lib/rubygems/security/trust_dir.rb +3 -3
- data/lib/rubygems/security.rb +8 -22
- data/lib/rubygems/source/git.rb +1 -3
- data/lib/rubygems/source/installed.rb +0 -2
- data/lib/rubygems/source/local.rb +5 -8
- data/lib/rubygems/source/lock.rb +1 -3
- data/lib/rubygems/source/specific_file.rb +0 -1
- data/lib/rubygems/source/vendor.rb +0 -2
- data/lib/rubygems/source.rb +12 -12
- data/lib/rubygems/source_list.rb +4 -4
- data/lib/rubygems/spec_fetcher.rb +29 -29
- data/lib/rubygems/specification.rb +125 -138
- data/lib/rubygems/specification_policy.rb +55 -25
- data/lib/rubygems/stub_specification.rb +4 -5
- data/lib/rubygems/text.rb +1 -2
- data/lib/rubygems/timeout/LICENSE.txt +22 -0
- data/lib/rubygems/timeout/lib/timeout.rb +199 -0
- data/lib/rubygems/timeout.rb +3 -0
- data/lib/rubygems/tsort/lib/tsort.rb +3 -0
- data/lib/rubygems/uninstaller.rb +7 -9
- data/lib/rubygems/update_suggestion.rb +5 -18
- data/lib/rubygems/uri_formatter.rb +1 -1
- data/lib/rubygems/user_interaction.rb +15 -21
- data/lib/rubygems/util/licenses.rb +65 -35
- data/lib/rubygems/util/list.rb +3 -1
- data/lib/rubygems/util.rb +2 -4
- data/lib/rubygems/validator.rb +5 -3
- data/lib/rubygems/version.rb +34 -28
- data/lib/rubygems/version_option.rb +2 -5
- data/lib/rubygems/yaml_serializer.rb +3 -3
- data/lib/rubygems.rb +37 -37
- data/rubygems-update.gemspec +4 -4
- data/setup.rb +2 -2
- metadata +38 -225
- data/lib/rubygems/indexer.rb +0 -428
- data/lib/rubygems/mock_gem_ui.rb +0 -86
- data/test/rubygems/alternate_cert.pem +0 -19
- data/test/rubygems/alternate_cert_32.pem +0 -19
- data/test/rubygems/alternate_key.pem +0 -27
- data/test/rubygems/bad_rake.rb +0 -3
- data/test/rubygems/bundler_test_gem.rb +0 -424
- data/test/rubygems/ca_cert.pem +0 -77
- data/test/rubygems/child_cert.pem +0 -19
- data/test/rubygems/child_cert_32.pem +0 -19
- data/test/rubygems/child_key.pem +0 -27
- data/test/rubygems/client.pem +0 -107
- data/test/rubygems/data/excon-0.7.7.gemspec.rz +0 -0
- data/test/rubygems/data/gem-private_key.pem +0 -27
- data/test/rubygems/data/gem-public_cert.pem +0 -20
- data/test/rubygems/data/null-required-ruby-version.gemspec.rz +0 -0
- data/test/rubygems/data/null-required-rubygems-version.gemspec.rz +0 -0
- data/test/rubygems/data/pry-0.4.7.gemspec.rz +0 -0
- data/test/rubygems/encrypted_private_key.pem +0 -30
- data/test/rubygems/expired_cert.pem +0 -19
- data/test/rubygems/fake_certlib/openssl.rb +0 -9
- data/test/rubygems/foo/discover.rb +0 -1
- data/test/rubygems/future_cert.pem +0 -19
- data/test/rubygems/future_cert_32.pem +0 -19
- data/test/rubygems/good_rake.rb +0 -3
- data/test/rubygems/grandchild_cert.pem +0 -19
- data/test/rubygems/grandchild_cert_32.pem +0 -19
- data/test/rubygems/grandchild_key.pem +0 -27
- data/test/rubygems/helper.rb +0 -1649
- data/test/rubygems/installer_test_case.rb +0 -248
- data/test/rubygems/invalid_client.pem +0 -49
- data/test/rubygems/invalid_issuer_cert.pem +0 -20
- data/test/rubygems/invalid_issuer_cert_32.pem +0 -20
- data/test/rubygems/invalid_key.pem +0 -27
- data/test/rubygems/invalid_signer_cert.pem +0 -19
- data/test/rubygems/invalid_signer_cert_32.pem +0 -19
- data/test/rubygems/invalidchild_cert.pem +0 -19
- data/test/rubygems/invalidchild_cert_32.pem +0 -19
- data/test/rubygems/invalidchild_key.pem +0 -27
- data/test/rubygems/multifactor_auth_utilities.rb +0 -111
- data/test/rubygems/package/tar_test_case.rb +0 -175
- data/test/rubygems/packages/Bluebie-legs-0.6.2.gem +0 -0
- data/test/rubygems/packages/ascii_binder-0.1.10.1.gem +0 -0
- data/test/rubygems/packages/ill-formatted-platform-1.0.0.10.gem +0 -0
- data/test/rubygems/plugin/exception/rubygems_plugin.rb +0 -4
- data/test/rubygems/plugin/load/rubygems_plugin.rb +0 -5
- data/test/rubygems/plugin/standarderror/rubygems_plugin.rb +0 -4
- data/test/rubygems/private3072_key.pem +0 -40
- data/test/rubygems/private_ec_key.pem +0 -9
- data/test/rubygems/private_key.pem +0 -27
- data/test/rubygems/public3072_cert.pem +0 -25
- data/test/rubygems/public_cert.pem +0 -20
- data/test/rubygems/public_cert_32.pem +0 -19
- data/test/rubygems/public_key.pem +0 -9
- data/test/rubygems/rubygems/commands/crash_command.rb +0 -5
- data/test/rubygems/rubygems_plugin.rb +0 -24
- data/test/rubygems/sff/discover.rb +0 -1
- data/test/rubygems/simple_gem.rb +0 -68
- data/test/rubygems/specifications/bar-0.0.2.gemspec +0 -9
- data/test/rubygems/specifications/foo-0.0.1-x86-mswin32.gemspec +0 -0
- data/test/rubygems/specifications/rubyforge-0.0.1.gemspec +0 -14
- data/test/rubygems/ssl_cert.pem +0 -80
- data/test/rubygems/ssl_key.pem +0 -27
- data/test/rubygems/test_bundled_ca.rb +0 -61
- data/test/rubygems/test_config.rb +0 -28
- data/test/rubygems/test_deprecate.rb +0 -158
- data/test/rubygems/test_exit.rb +0 -17
- data/test/rubygems/test_gem.rb +0 -1799
- data/test/rubygems/test_gem_available_set.rb +0 -130
- data/test/rubygems/test_gem_bundler_version_finder.rb +0 -127
- data/test/rubygems/test_gem_command.rb +0 -403
- data/test/rubygems/test_gem_command_manager.rb +0 -400
- data/test/rubygems/test_gem_commands_build_command.rb +0 -739
- data/test/rubygems/test_gem_commands_cert_command.rb +0 -866
- data/test/rubygems/test_gem_commands_check_command.rb +0 -68
- data/test/rubygems/test_gem_commands_cleanup_command.rb +0 -292
- data/test/rubygems/test_gem_commands_contents_command.rb +0 -271
- data/test/rubygems/test_gem_commands_dependency_command.rb +0 -228
- data/test/rubygems/test_gem_commands_environment_command.rb +0 -169
- data/test/rubygems/test_gem_commands_exec_command.rb +0 -857
- data/test/rubygems/test_gem_commands_fetch_command.rb +0 -258
- data/test/rubygems/test_gem_commands_generate_index_command.rb +0 -81
- data/test/rubygems/test_gem_commands_help_command.rb +0 -94
- data/test/rubygems/test_gem_commands_info_command.rb +0 -70
- data/test/rubygems/test_gem_commands_install_command.rb +0 -1573
- data/test/rubygems/test_gem_commands_list_command.rb +0 -33
- data/test/rubygems/test_gem_commands_lock_command.rb +0 -67
- data/test/rubygems/test_gem_commands_mirror.rb +0 -20
- data/test/rubygems/test_gem_commands_open_command.rb +0 -101
- data/test/rubygems/test_gem_commands_outdated_command.rb +0 -50
- data/test/rubygems/test_gem_commands_owner_command.rb +0 -503
- data/test/rubygems/test_gem_commands_pristine_command.rb +0 -708
- data/test/rubygems/test_gem_commands_push_command.rb +0 -603
- data/test/rubygems/test_gem_commands_query_command.rb +0 -858
- data/test/rubygems/test_gem_commands_search_command.rb +0 -16
- data/test/rubygems/test_gem_commands_server_command.rb +0 -20
- data/test/rubygems/test_gem_commands_setup_command.rb +0 -474
- data/test/rubygems/test_gem_commands_signin_command.rb +0 -259
- data/test/rubygems/test_gem_commands_signout_command.rb +0 -30
- data/test/rubygems/test_gem_commands_sources_command.rb +0 -534
- data/test/rubygems/test_gem_commands_specification_command.rb +0 -277
- data/test/rubygems/test_gem_commands_stale_command.rb +0 -43
- data/test/rubygems/test_gem_commands_uninstall_command.rb +0 -542
- data/test/rubygems/test_gem_commands_unpack_command.rb +0 -224
- data/test/rubygems/test_gem_commands_update_command.rb +0 -836
- data/test/rubygems/test_gem_commands_which_command.rb +0 -85
- data/test/rubygems/test_gem_commands_yank_command.rb +0 -299
- data/test/rubygems/test_gem_config_file.rb +0 -551
- data/test/rubygems/test_gem_dependency.rb +0 -398
- data/test/rubygems/test_gem_dependency_installer.rb +0 -1190
- data/test/rubygems/test_gem_dependency_list.rb +0 -265
- data/test/rubygems/test_gem_dependency_resolution_error.rb +0 -27
- data/test/rubygems/test_gem_doctor.rb +0 -195
- data/test/rubygems/test_gem_ext_builder.rb +0 -337
- data/test/rubygems/test_gem_ext_cargo_builder/custom_name/.gitignore +0 -1
- data/test/rubygems/test_gem_ext_cargo_builder/custom_name/custom_name.gemspec +0 -10
- data/test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/Cargo.lock +0 -249
- data/test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/Cargo.toml +0 -10
- data/test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/src/lib.rs +0 -27
- data/test/rubygems/test_gem_ext_cargo_builder/custom_name/lib/custom_name.rb +0 -3
- data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/.gitignore +0 -1
- data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.lock +0 -249
- data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/Cargo.toml +0 -10
- data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/rust_ruby_example.gemspec +0 -10
- data/test/rubygems/test_gem_ext_cargo_builder/rust_ruby_example/src/lib.rs +0 -51
- data/test/rubygems/test_gem_ext_cargo_builder.rb +0 -167
- data/test/rubygems/test_gem_ext_cargo_builder_link_flag_converter.rb +0 -34
- data/test/rubygems/test_gem_ext_cargo_builder_unit.rb +0 -60
- data/test/rubygems/test_gem_ext_cmake_builder.rb +0 -84
- data/test/rubygems/test_gem_ext_configure_builder.rb +0 -80
- data/test/rubygems/test_gem_ext_ext_conf_builder.rb +0 -229
- data/test/rubygems/test_gem_ext_rake_builder.rb +0 -113
- data/test/rubygems/test_gem_gem_runner.rb +0 -119
- data/test/rubygems/test_gem_gemcutter_utilities.rb +0 -361
- data/test/rubygems/test_gem_impossible_dependencies_error.rb +0 -60
- data/test/rubygems/test_gem_indexer.rb +0 -381
- data/test/rubygems/test_gem_install_update_options.rb +0 -208
- data/test/rubygems/test_gem_installer.rb +0 -2512
- data/test/rubygems/test_gem_local_remote_options.rb +0 -133
- data/test/rubygems/test_gem_name_tuple.rb +0 -43
- data/test/rubygems/test_gem_package.rb +0 -1306
- data/test/rubygems/test_gem_package_old.rb +0 -91
- data/test/rubygems/test_gem_package_tar_header.rb +0 -226
- data/test/rubygems/test_gem_package_tar_reader.rb +0 -150
- data/test/rubygems/test_gem_package_tar_reader_entry.rb +0 -350
- data/test/rubygems/test_gem_package_tar_writer.rb +0 -331
- data/test/rubygems/test_gem_package_task.rb +0 -118
- data/test/rubygems/test_gem_path_support.rb +0 -139
- data/test/rubygems/test_gem_platform.rb +0 -497
- data/test/rubygems/test_gem_rdoc.rb +0 -137
- data/test/rubygems/test_gem_remote_fetcher.rb +0 -1227
- data/test/rubygems/test_gem_request.rb +0 -547
- data/test/rubygems/test_gem_request_connection_pools.rb +0 -152
- data/test/rubygems/test_gem_request_set.rb +0 -672
- data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +0 -853
- data/test/rubygems/test_gem_request_set_lockfile.rb +0 -469
- data/test/rubygems/test_gem_request_set_lockfile_parser.rb +0 -544
- data/test/rubygems/test_gem_request_set_lockfile_tokenizer.rb +0 -307
- data/test/rubygems/test_gem_requirement.rb +0 -505
- data/test/rubygems/test_gem_resolver.rb +0 -859
- data/test/rubygems/test_gem_resolver_activation_request.rb +0 -43
- data/test/rubygems/test_gem_resolver_api_set.rb +0 -210
- data/test/rubygems/test_gem_resolver_api_specification.rb +0 -167
- data/test/rubygems/test_gem_resolver_best_set.rb +0 -159
- data/test/rubygems/test_gem_resolver_composed_set.rb +0 -44
- data/test/rubygems/test_gem_resolver_conflict.rb +0 -82
- data/test/rubygems/test_gem_resolver_dependency_request.rb +0 -83
- data/test/rubygems/test_gem_resolver_git_set.rb +0 -188
- data/test/rubygems/test_gem_resolver_git_specification.rb +0 -114
- data/test/rubygems/test_gem_resolver_index_set.rb +0 -88
- data/test/rubygems/test_gem_resolver_index_specification.rb +0 -93
- data/test/rubygems/test_gem_resolver_installed_specification.rb +0 -47
- data/test/rubygems/test_gem_resolver_installer_set.rb +0 -320
- data/test/rubygems/test_gem_resolver_local_specification.rb +0 -44
- data/test/rubygems/test_gem_resolver_lock_set.rb +0 -62
- data/test/rubygems/test_gem_resolver_lock_specification.rb +0 -98
- data/test/rubygems/test_gem_resolver_requirement_list.rb +0 -19
- data/test/rubygems/test_gem_resolver_specification.rb +0 -63
- data/test/rubygems/test_gem_resolver_vendor_set.rb +0 -82
- data/test/rubygems/test_gem_resolver_vendor_specification.rb +0 -82
- data/test/rubygems/test_gem_security.rb +0 -341
- data/test/rubygems/test_gem_security_policy.rb +0 -535
- data/test/rubygems/test_gem_security_signer.rb +0 -218
- data/test/rubygems/test_gem_security_trust_dir.rb +0 -99
- data/test/rubygems/test_gem_silent_ui.rb +0 -123
- data/test/rubygems/test_gem_source.rb +0 -254
- data/test/rubygems/test_gem_source_fetch_problem.rb +0 -37
- data/test/rubygems/test_gem_source_git.rb +0 -310
- data/test/rubygems/test_gem_source_installed.rb +0 -35
- data/test/rubygems/test_gem_source_list.rb +0 -119
- data/test/rubygems/test_gem_source_local.rb +0 -107
- data/test/rubygems/test_gem_source_lock.rb +0 -113
- data/test/rubygems/test_gem_source_specific_file.rb +0 -76
- data/test/rubygems/test_gem_source_subpath_problem.rb +0 -50
- data/test/rubygems/test_gem_source_vendor.rb +0 -30
- data/test/rubygems/test_gem_spec_fetcher.rb +0 -338
- data/test/rubygems/test_gem_specification.rb +0 -3856
- data/test/rubygems/test_gem_stream_ui.rb +0 -255
- data/test/rubygems/test_gem_stub_specification.rb +0 -278
- data/test/rubygems/test_gem_text.rb +0 -103
- data/test/rubygems/test_gem_uninstaller.rb +0 -675
- data/test/rubygems/test_gem_unsatisfiable_dependency_error.rb +0 -31
- data/test/rubygems/test_gem_update_suggestion.rb +0 -209
- data/test/rubygems/test_gem_uri.rb +0 -41
- data/test/rubygems/test_gem_uri_formatter.rb +0 -27
- data/test/rubygems/test_gem_util.rb +0 -91
- data/test/rubygems/test_gem_validator.rb +0 -42
- data/test/rubygems/test_gem_version.rb +0 -305
- data/test/rubygems/test_gem_version_option.rb +0 -165
- data/test/rubygems/test_kernel.rb +0 -124
- data/test/rubygems/test_project_sanity.rb +0 -49
- data/test/rubygems/test_remote_fetch_error.rb +0 -20
- data/test/rubygems/test_require.rb +0 -732
- data/test/rubygems/test_rubygems.rb +0 -76
- data/test/rubygems/test_webauthn_listener.rb +0 -143
- data/test/rubygems/test_webauthn_listener_response.rb +0 -93
- data/test/rubygems/test_webauthn_poller.rb +0 -124
- data/test/rubygems/utilities.rb +0 -436
- data/test/rubygems/wrong_key_cert.pem +0 -19
- data/test/rubygems/wrong_key_cert_32.pem +0 -19
- data/test/test_changelog_generator.rb +0 -17
@@ -1,1227 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative "helper"
|
4
|
-
|
5
|
-
require "webrick"
|
6
|
-
require "webrick/https" if Gem::HAVE_OPENSSL
|
7
|
-
|
8
|
-
unless Gem::HAVE_OPENSSL
|
9
|
-
warn "Skipping Gem::RemoteFetcher tests. openssl not found."
|
10
|
-
end
|
11
|
-
|
12
|
-
require "rubygems/remote_fetcher"
|
13
|
-
require "rubygems/package"
|
14
|
-
|
15
|
-
# = Testing Proxy Settings
|
16
|
-
#
|
17
|
-
# These tests check the proper proxy server settings by running two
|
18
|
-
# web servers. The web server at http://localhost:#{SERVER_PORT}
|
19
|
-
# represents the normal gem server and returns a gemspec with a rake
|
20
|
-
# version of 0.4.11. The web server at http://localhost:#{PROXY_PORT}
|
21
|
-
# represents the proxy server and returns a different dataset where
|
22
|
-
# rake has version 0.4.2. This allows us to detect which server is
|
23
|
-
# returning the data.
|
24
|
-
#
|
25
|
-
# Note that the proxy server is not a *real* proxy server. But our
|
26
|
-
# software doesn't really care, as long as we hit the proxy URL when a
|
27
|
-
# proxy is configured.
|
28
|
-
|
29
|
-
class TestGemRemoteFetcher < Gem::TestCase
|
30
|
-
include Gem::DefaultUserInteraction
|
31
|
-
|
32
|
-
SERVER_DATA = <<-EOY
|
33
|
-
--- !ruby/object:Gem::Cache
|
34
|
-
gems:
|
35
|
-
rake-0.4.11: !ruby/object:Gem::Specification
|
36
|
-
rubygems_version: "0.7"
|
37
|
-
specification_version: 1
|
38
|
-
name: rake
|
39
|
-
version: !ruby/object:Gem::Version
|
40
|
-
version: 0.4.11
|
41
|
-
date: 2004-11-12
|
42
|
-
summary: Ruby based make-like utility.
|
43
|
-
require_paths:
|
44
|
-
- lib
|
45
|
-
author: Jim Weirich
|
46
|
-
email: jim@weirichhouse.org
|
47
|
-
homepage: http://rake.rubyforge.org
|
48
|
-
description: Rake is a Make-like program implemented in Ruby. Tasks and dependencies are specified in standard Ruby syntax.
|
49
|
-
autorequire:
|
50
|
-
bindir: bin
|
51
|
-
has_rdoc: true
|
52
|
-
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
53
|
-
requirements:
|
54
|
-
-
|
55
|
-
- ">"
|
56
|
-
- !ruby/object:Gem::Version
|
57
|
-
version: 0.0.0
|
58
|
-
version:
|
59
|
-
platform: ruby
|
60
|
-
files:
|
61
|
-
- README
|
62
|
-
test_files: []
|
63
|
-
library_stubs:
|
64
|
-
rdoc_options:
|
65
|
-
extra_rdoc_files:
|
66
|
-
executables:
|
67
|
-
- rake
|
68
|
-
extensions: []
|
69
|
-
requirements: []
|
70
|
-
dependencies: []
|
71
|
-
EOY
|
72
|
-
|
73
|
-
PROXY_DATA = SERVER_DATA.gsub(/0.4.11/, "0.4.2")
|
74
|
-
|
75
|
-
# Generated via:
|
76
|
-
# x = OpenSSL::PKey::DH.new(2048) # wait a while...
|
77
|
-
# x.to_s => pem
|
78
|
-
TEST_KEY_DH2048 = OpenSSL::PKey::DH.new <<-_END_OF_PEM_
|
79
|
-
-----BEGIN DH PARAMETERS-----
|
80
|
-
MIIBCAKCAQEA3Ze2EHSfYkZLUn557torAmjBgPsqzbodaRaGZtgK1gEU+9nNJaFV
|
81
|
-
G1JKhmGUiEDyIW7idsBpe4sX/Wqjnp48Lr8IeI/SlEzLdoGpf05iRYXC8Cm9o8aM
|
82
|
-
cfmVgoSEAo9YLBpzoji2jHkO7Q5IPt4zxbTdlmmGFLc/GO9q7LGHhC+rcMcNTGsM
|
83
|
-
49AnILNn49pq4Y72jSwdmvq4psHZwwFBbPwLdw6bLUDDCN90jfqvYt18muwUxDiN
|
84
|
-
NP0fuvVAIB158VnQ0liHSwcl6+9vE1mL0Jo/qEXQxl0+UdKDjaGfTsn6HIrwTnmJ
|
85
|
-
PeIQQkFng2VVot/WAQbv3ePqWq07g1BBcwIBAg==
|
86
|
-
-----END DH PARAMETERS-----
|
87
|
-
_END_OF_PEM_
|
88
|
-
|
89
|
-
def setup
|
90
|
-
@proxies = %w[https_proxy http_proxy HTTP_PROXY http_proxy_user HTTP_PROXY_USER http_proxy_pass HTTP_PROXY_PASS no_proxy NO_PROXY]
|
91
|
-
@old_proxies = @proxies.map {|k| ENV[k] }
|
92
|
-
@proxies.each {|k| ENV[k] = nil }
|
93
|
-
|
94
|
-
super
|
95
|
-
start_servers
|
96
|
-
self.enable_yaml = true
|
97
|
-
self.enable_zip = false
|
98
|
-
|
99
|
-
base_server_uri = "http://localhost:#{normal_server_port}"
|
100
|
-
@proxy_uri = "http://localhost:#{proxy_server_port}"
|
101
|
-
|
102
|
-
@server_uri = base_server_uri + "/yaml"
|
103
|
-
@server_z_uri = base_server_uri + "/yaml.Z"
|
104
|
-
|
105
|
-
@cache_dir = File.join @gemhome, "cache"
|
106
|
-
|
107
|
-
# TODO: why does the remote fetcher need it written to disk?
|
108
|
-
@a1, @a1_gem = util_gem "a", "1" do |s|
|
109
|
-
s.executables << "a_bin"
|
110
|
-
end
|
111
|
-
|
112
|
-
@a1.loaded_from = File.join(@gemhome, "specifications", @a1.full_name)
|
113
|
-
|
114
|
-
Gem::RemoteFetcher.fetcher = nil
|
115
|
-
@stub_ui = Gem::MockGemUi.new
|
116
|
-
@fetcher = Gem::RemoteFetcher.fetcher
|
117
|
-
end
|
118
|
-
|
119
|
-
def teardown
|
120
|
-
@fetcher.close_all
|
121
|
-
stop_servers
|
122
|
-
super
|
123
|
-
Gem.configuration[:http_proxy] = nil
|
124
|
-
@proxies.each_with_index {|k, i| ENV[k] = @old_proxies[i] }
|
125
|
-
end
|
126
|
-
|
127
|
-
def test_self_fetcher
|
128
|
-
fetcher = Gem::RemoteFetcher.fetcher
|
129
|
-
refute_nil fetcher
|
130
|
-
assert_kind_of Gem::RemoteFetcher, fetcher
|
131
|
-
end
|
132
|
-
|
133
|
-
def test_self_fetcher_with_proxy
|
134
|
-
proxy_uri = "http://proxy.example.com"
|
135
|
-
Gem.configuration[:http_proxy] = proxy_uri
|
136
|
-
Gem::RemoteFetcher.fetcher = nil
|
137
|
-
|
138
|
-
fetcher = Gem::RemoteFetcher.fetcher
|
139
|
-
|
140
|
-
refute_nil fetcher
|
141
|
-
assert_kind_of Gem::RemoteFetcher, fetcher
|
142
|
-
assert_equal proxy_uri, fetcher.instance_variable_get(:@proxy).to_s
|
143
|
-
end
|
144
|
-
|
145
|
-
def test_fetch_path_bad_uri
|
146
|
-
fetcher = Gem::RemoteFetcher.new nil
|
147
|
-
@fetcher = fetcher
|
148
|
-
|
149
|
-
e = assert_raise ArgumentError do
|
150
|
-
@fetcher.fetch_path("gems.example.com/yaml", nil, true)
|
151
|
-
end
|
152
|
-
|
153
|
-
assert_equal "uri scheme is invalid: nil", e.message
|
154
|
-
end
|
155
|
-
|
156
|
-
def test_no_proxy
|
157
|
-
use_ui @stub_ui do
|
158
|
-
assert_data_from_server @fetcher.fetch_path(@server_uri)
|
159
|
-
response = @fetcher.fetch_path(@server_uri, nil, true)
|
160
|
-
assert_equal SERVER_DATA.size, response["content-length"].to_i
|
161
|
-
end
|
162
|
-
end
|
163
|
-
|
164
|
-
def test_cache_update_path
|
165
|
-
uri = URI "http://example/file"
|
166
|
-
path = File.join @tempdir, "file"
|
167
|
-
|
168
|
-
fetcher = util_fuck_with_fetcher "hello"
|
169
|
-
|
170
|
-
data = fetcher.cache_update_path uri, path
|
171
|
-
|
172
|
-
assert_equal "hello", data
|
173
|
-
|
174
|
-
assert_equal "hello", File.read(path)
|
175
|
-
end
|
176
|
-
|
177
|
-
def test_cache_update_path_with_utf8_internal_encoding
|
178
|
-
with_internal_encoding("UTF-8") do
|
179
|
-
uri = URI "http://example/file"
|
180
|
-
path = File.join @tempdir, "file"
|
181
|
-
data = String.new("\xC8").force_encoding(Encoding::BINARY)
|
182
|
-
|
183
|
-
fetcher = util_fuck_with_fetcher data
|
184
|
-
|
185
|
-
written_data = fetcher.cache_update_path uri, path
|
186
|
-
|
187
|
-
assert_equal data, written_data
|
188
|
-
assert_equal data, File.binread(path)
|
189
|
-
end
|
190
|
-
end
|
191
|
-
|
192
|
-
def test_cache_update_path_no_update
|
193
|
-
uri = URI "http://example/file"
|
194
|
-
path = File.join @tempdir, "file"
|
195
|
-
|
196
|
-
fetcher = util_fuck_with_fetcher "hello"
|
197
|
-
|
198
|
-
data = fetcher.cache_update_path uri, path, false
|
199
|
-
|
200
|
-
assert_equal "hello", data
|
201
|
-
|
202
|
-
assert_path_not_exist path
|
203
|
-
end
|
204
|
-
|
205
|
-
def util_fuck_with_fetcher(data, blow = false)
|
206
|
-
fetcher = Gem::RemoteFetcher.fetcher
|
207
|
-
fetcher.instance_variable_set :@test_data, data
|
208
|
-
|
209
|
-
unless blow
|
210
|
-
def fetcher.fetch_path(arg, *rest)
|
211
|
-
@test_arg = arg
|
212
|
-
@test_data
|
213
|
-
end
|
214
|
-
else
|
215
|
-
def fetcher.fetch_path(arg, *rest)
|
216
|
-
# OMG I'm such an ass
|
217
|
-
class << self; remove_method :fetch_path; end
|
218
|
-
def self.fetch_path(arg, *rest)
|
219
|
-
@test_arg = arg
|
220
|
-
@test_data
|
221
|
-
end
|
222
|
-
|
223
|
-
raise Gem::RemoteFetcher::FetchError.new("haha!", "")
|
224
|
-
end
|
225
|
-
end
|
226
|
-
|
227
|
-
fetcher
|
228
|
-
end
|
229
|
-
|
230
|
-
def test_download
|
231
|
-
a1_data = nil
|
232
|
-
File.open @a1_gem, "rb" do |fp|
|
233
|
-
a1_data = fp.read
|
234
|
-
end
|
235
|
-
|
236
|
-
fetcher = util_fuck_with_fetcher a1_data
|
237
|
-
|
238
|
-
a1_cache_gem = @a1.cache_file
|
239
|
-
assert_equal a1_cache_gem, fetcher.download(@a1, "http://gems.example.com")
|
240
|
-
assert_equal("http://gems.example.com/gems/a-1.gem",
|
241
|
-
fetcher.instance_variable_get(:@test_arg).to_s)
|
242
|
-
assert File.exist?(a1_cache_gem)
|
243
|
-
end
|
244
|
-
|
245
|
-
def test_download_with_auth
|
246
|
-
a1_data = nil
|
247
|
-
File.open @a1_gem, "rb" do |fp|
|
248
|
-
a1_data = fp.read
|
249
|
-
end
|
250
|
-
|
251
|
-
fetcher = util_fuck_with_fetcher a1_data
|
252
|
-
|
253
|
-
a1_cache_gem = @a1.cache_file
|
254
|
-
assert_equal a1_cache_gem, fetcher.download(@a1, "http://user:password@gems.example.com")
|
255
|
-
assert_equal("http://user:password@gems.example.com/gems/a-1.gem",
|
256
|
-
fetcher.instance_variable_get(:@test_arg).to_s)
|
257
|
-
assert File.exist?(a1_cache_gem)
|
258
|
-
end
|
259
|
-
|
260
|
-
def test_download_with_token
|
261
|
-
a1_data = nil
|
262
|
-
File.open @a1_gem, "rb" do |fp|
|
263
|
-
a1_data = fp.read
|
264
|
-
end
|
265
|
-
|
266
|
-
fetcher = util_fuck_with_fetcher a1_data
|
267
|
-
|
268
|
-
a1_cache_gem = @a1.cache_file
|
269
|
-
assert_equal a1_cache_gem, fetcher.download(@a1, "http://token@gems.example.com")
|
270
|
-
assert_equal("http://token@gems.example.com/gems/a-1.gem",
|
271
|
-
fetcher.instance_variable_get(:@test_arg).to_s)
|
272
|
-
assert File.exist?(a1_cache_gem)
|
273
|
-
end
|
274
|
-
|
275
|
-
def test_download_with_x_oauth_basic
|
276
|
-
a1_data = nil
|
277
|
-
File.open @a1_gem, "rb" do |fp|
|
278
|
-
a1_data = fp.read
|
279
|
-
end
|
280
|
-
|
281
|
-
fetcher = util_fuck_with_fetcher a1_data
|
282
|
-
|
283
|
-
a1_cache_gem = @a1.cache_file
|
284
|
-
assert_equal a1_cache_gem, fetcher.download(@a1, "http://token:x-oauth-basic@gems.example.com")
|
285
|
-
assert_equal("http://token:x-oauth-basic@gems.example.com/gems/a-1.gem",
|
286
|
-
fetcher.instance_variable_get(:@test_arg).to_s)
|
287
|
-
assert File.exist?(a1_cache_gem)
|
288
|
-
end
|
289
|
-
|
290
|
-
def test_download_with_encoded_auth
|
291
|
-
a1_data = nil
|
292
|
-
File.open @a1_gem, "rb" do |fp|
|
293
|
-
a1_data = fp.read
|
294
|
-
end
|
295
|
-
|
296
|
-
fetcher = util_fuck_with_fetcher a1_data
|
297
|
-
|
298
|
-
a1_cache_gem = @a1.cache_file
|
299
|
-
assert_equal a1_cache_gem, fetcher.download(@a1, "http://user:%25pas%25sword@gems.example.com")
|
300
|
-
assert_equal("http://user:%25pas%25sword@gems.example.com/gems/a-1.gem",
|
301
|
-
fetcher.instance_variable_get(:@test_arg).to_s)
|
302
|
-
assert File.exist?(a1_cache_gem)
|
303
|
-
end
|
304
|
-
|
305
|
-
def test_download_cached
|
306
|
-
FileUtils.mv @a1_gem, @cache_dir
|
307
|
-
|
308
|
-
inst = Gem::RemoteFetcher.fetcher
|
309
|
-
|
310
|
-
assert_equal @a1.cache_file, inst.download(@a1, "http://gems.example.com")
|
311
|
-
end
|
312
|
-
|
313
|
-
def test_download_local
|
314
|
-
FileUtils.mv @a1_gem, @tempdir
|
315
|
-
local_path = File.join @tempdir, @a1.file_name
|
316
|
-
inst = nil
|
317
|
-
|
318
|
-
Dir.chdir @tempdir do
|
319
|
-
inst = Gem::RemoteFetcher.fetcher
|
320
|
-
end
|
321
|
-
|
322
|
-
assert_equal @a1.cache_file, inst.download(@a1, local_path)
|
323
|
-
end
|
324
|
-
|
325
|
-
def test_download_local_space
|
326
|
-
space_path = File.join @tempdir, "space path"
|
327
|
-
FileUtils.mkdir space_path
|
328
|
-
FileUtils.mv @a1_gem, space_path
|
329
|
-
local_path = File.join space_path, @a1.file_name
|
330
|
-
inst = nil
|
331
|
-
|
332
|
-
Dir.chdir @tempdir do
|
333
|
-
inst = Gem::RemoteFetcher.fetcher
|
334
|
-
end
|
335
|
-
|
336
|
-
assert_equal @a1.cache_file, inst.download(@a1, local_path)
|
337
|
-
end
|
338
|
-
|
339
|
-
def test_download_install_dir
|
340
|
-
a1_data = File.open @a1_gem, "rb" do |fp|
|
341
|
-
fp.read
|
342
|
-
end
|
343
|
-
|
344
|
-
fetcher = util_fuck_with_fetcher a1_data
|
345
|
-
|
346
|
-
install_dir = File.join @tempdir, "more_gems"
|
347
|
-
|
348
|
-
a1_cache_gem = File.join install_dir, "cache", @a1.file_name
|
349
|
-
FileUtils.mkdir_p(File.dirname(a1_cache_gem))
|
350
|
-
actual = fetcher.download(@a1, "http://gems.example.com", install_dir)
|
351
|
-
|
352
|
-
assert_equal a1_cache_gem, actual
|
353
|
-
assert_equal("http://gems.example.com/gems/a-1.gem",
|
354
|
-
fetcher.instance_variable_get(:@test_arg).to_s)
|
355
|
-
|
356
|
-
assert File.exist?(a1_cache_gem)
|
357
|
-
end
|
358
|
-
|
359
|
-
unless win_platform? || Process.uid.zero? # File.chmod doesn't work
|
360
|
-
def test_download_local_read_only
|
361
|
-
FileUtils.mv @a1_gem, @tempdir
|
362
|
-
local_path = File.join @tempdir, @a1.file_name
|
363
|
-
inst = nil
|
364
|
-
FileUtils.chmod 0o555, @a1.cache_dir
|
365
|
-
begin
|
366
|
-
FileUtils.mkdir_p File.join(Gem.user_dir, "cache")
|
367
|
-
rescue StandardError
|
368
|
-
nil
|
369
|
-
end
|
370
|
-
FileUtils.chmod 0o555, File.join(Gem.user_dir, "cache")
|
371
|
-
|
372
|
-
Dir.chdir @tempdir do
|
373
|
-
inst = Gem::RemoteFetcher.fetcher
|
374
|
-
end
|
375
|
-
|
376
|
-
assert_equal(File.join(@tempdir, @a1.file_name),
|
377
|
-
inst.download(@a1, local_path))
|
378
|
-
ensure
|
379
|
-
FileUtils.chmod 0o755, File.join(Gem.user_dir, "cache")
|
380
|
-
FileUtils.chmod 0o755, @a1.cache_dir
|
381
|
-
end
|
382
|
-
|
383
|
-
def test_download_read_only
|
384
|
-
FileUtils.chmod 0o555, @a1.cache_dir
|
385
|
-
FileUtils.chmod 0o555, @gemhome
|
386
|
-
|
387
|
-
fetcher = util_fuck_with_fetcher File.read(@a1_gem)
|
388
|
-
fetcher.download(@a1, "http://gems.example.com")
|
389
|
-
a1_cache_gem = File.join Gem.user_dir, "cache", @a1.file_name
|
390
|
-
assert File.exist? a1_cache_gem
|
391
|
-
ensure
|
392
|
-
FileUtils.chmod 0o755, @gemhome
|
393
|
-
FileUtils.chmod 0o755, @a1.cache_dir
|
394
|
-
end
|
395
|
-
end
|
396
|
-
|
397
|
-
def test_download_platform_legacy
|
398
|
-
original_platform = "old-platform"
|
399
|
-
|
400
|
-
e1, e1_gem = util_gem "e", "1" do |s|
|
401
|
-
s.platform = Gem::Platform::CURRENT
|
402
|
-
s.instance_variable_set :@original_platform, original_platform
|
403
|
-
end
|
404
|
-
e1.loaded_from = File.join(@gemhome, "specifications", e1.full_name)
|
405
|
-
|
406
|
-
e1_data = nil
|
407
|
-
File.open e1_gem, "rb" do |fp|
|
408
|
-
e1_data = fp.read
|
409
|
-
end
|
410
|
-
|
411
|
-
fetcher = util_fuck_with_fetcher e1_data, :blow_chunks
|
412
|
-
|
413
|
-
e1_cache_gem = e1.cache_file
|
414
|
-
|
415
|
-
assert_equal e1_cache_gem, fetcher.download(e1, "http://gems.example.com")
|
416
|
-
|
417
|
-
assert_equal("http://gems.example.com/gems/#{e1.original_name}.gem",
|
418
|
-
fetcher.instance_variable_get(:@test_arg).to_s)
|
419
|
-
assert File.exist?(e1_cache_gem)
|
420
|
-
end
|
421
|
-
|
422
|
-
def test_download_same_file
|
423
|
-
FileUtils.mv @a1_gem, @tempdir
|
424
|
-
local_path = File.join @tempdir, @a1.file_name
|
425
|
-
inst = nil
|
426
|
-
|
427
|
-
Dir.chdir @tempdir do
|
428
|
-
inst = Gem::RemoteFetcher.fetcher
|
429
|
-
end
|
430
|
-
|
431
|
-
cache_path = @a1.cache_file
|
432
|
-
FileUtils.mv local_path, cache_path
|
433
|
-
|
434
|
-
gem = Gem::Package.new cache_path
|
435
|
-
|
436
|
-
assert_equal cache_path, inst.download(gem.spec, cache_path)
|
437
|
-
end
|
438
|
-
|
439
|
-
def test_download_unsupported
|
440
|
-
inst = Gem::RemoteFetcher.fetcher
|
441
|
-
|
442
|
-
e = assert_raise ArgumentError do
|
443
|
-
inst.download @a1, "ftp://gems.rubyforge.org"
|
444
|
-
end
|
445
|
-
|
446
|
-
assert_equal "unsupported URI scheme ftp", e.message
|
447
|
-
end
|
448
|
-
|
449
|
-
def test_download_to_cache
|
450
|
-
@a2, @a2_gem = util_gem "a", "2"
|
451
|
-
|
452
|
-
util_setup_spec_fetcher @a1, @a2
|
453
|
-
@fetcher.instance_variable_set :@a1, @a1
|
454
|
-
@fetcher.instance_variable_set :@a2, @a2
|
455
|
-
def @fetcher.fetch_path(uri, mtime = nil, head = false)
|
456
|
-
case uri.request_uri
|
457
|
-
when /#{@a1.spec_name}/ then
|
458
|
-
Gem.deflate Marshal.dump @a1
|
459
|
-
when /#{@a2.spec_name}/ then
|
460
|
-
Gem.deflate Marshal.dump @a2
|
461
|
-
else
|
462
|
-
uri.to_s
|
463
|
-
end
|
464
|
-
end
|
465
|
-
|
466
|
-
gem = Gem::RemoteFetcher.fetcher.download_to_cache dep "a"
|
467
|
-
|
468
|
-
assert_equal @a2.file_name, File.basename(gem)
|
469
|
-
end
|
470
|
-
|
471
|
-
def test_fetch_path_gzip
|
472
|
-
fetcher = Gem::RemoteFetcher.new nil
|
473
|
-
@fetcher = fetcher
|
474
|
-
|
475
|
-
def fetcher.fetch_http(uri, mtime, head = nil)
|
476
|
-
Gem::Util.gzip "foo"
|
477
|
-
end
|
478
|
-
|
479
|
-
assert_equal "foo", fetcher.fetch_path(@uri + "foo.gz")
|
480
|
-
end
|
481
|
-
|
482
|
-
def test_fetch_path_gzip_unmodified
|
483
|
-
fetcher = Gem::RemoteFetcher.new nil
|
484
|
-
@fetcher = fetcher
|
485
|
-
|
486
|
-
def fetcher.fetch_http(uri, mtime, head = nil)
|
487
|
-
nil
|
488
|
-
end
|
489
|
-
|
490
|
-
assert_nil fetcher.fetch_path(@uri + "foo.gz", Time.at(0))
|
491
|
-
end
|
492
|
-
|
493
|
-
def test_fetch_path_io_error
|
494
|
-
fetcher = Gem::RemoteFetcher.new nil
|
495
|
-
@fetcher = fetcher
|
496
|
-
|
497
|
-
def fetcher.fetch_http(*)
|
498
|
-
raise EOFError
|
499
|
-
end
|
500
|
-
|
501
|
-
url = "http://example.com/uri"
|
502
|
-
|
503
|
-
e = assert_raise Gem::RemoteFetcher::FetchError do
|
504
|
-
fetcher.fetch_path url
|
505
|
-
end
|
506
|
-
|
507
|
-
assert_equal "EOFError: EOFError (#{url})", e.message
|
508
|
-
assert_equal url, e.uri
|
509
|
-
end
|
510
|
-
|
511
|
-
def test_fetch_path_socket_error
|
512
|
-
fetcher = Gem::RemoteFetcher.new nil
|
513
|
-
@fetcher = fetcher
|
514
|
-
|
515
|
-
def fetcher.fetch_http(uri, mtime, head = nil)
|
516
|
-
raise SocketError
|
517
|
-
end
|
518
|
-
|
519
|
-
url = "http://example.com/uri"
|
520
|
-
|
521
|
-
e = assert_raise Gem::RemoteFetcher::FetchError do
|
522
|
-
fetcher.fetch_path url
|
523
|
-
end
|
524
|
-
|
525
|
-
assert_equal "SocketError: SocketError (#{url})", e.message
|
526
|
-
assert_equal url, e.uri
|
527
|
-
end
|
528
|
-
|
529
|
-
def test_fetch_path_system_call_error
|
530
|
-
fetcher = Gem::RemoteFetcher.new nil
|
531
|
-
@fetcher = fetcher
|
532
|
-
|
533
|
-
def fetcher.fetch_http(uri, mtime = nil, head = nil)
|
534
|
-
raise Errno::ECONNREFUSED, "connect(2)"
|
535
|
-
end
|
536
|
-
|
537
|
-
url = "http://example.com/uri"
|
538
|
-
|
539
|
-
e = assert_raise Gem::RemoteFetcher::FetchError do
|
540
|
-
fetcher.fetch_path url
|
541
|
-
end
|
542
|
-
|
543
|
-
assert_match %r{ECONNREFUSED:.*connect\(2\) \(#{Regexp.escape url}\)\z},
|
544
|
-
e.message
|
545
|
-
assert_equal url, e.uri
|
546
|
-
end
|
547
|
-
|
548
|
-
def test_fetch_path_timeout_error
|
549
|
-
fetcher = Gem::RemoteFetcher.new nil
|
550
|
-
@fetcher = fetcher
|
551
|
-
|
552
|
-
def fetcher.fetch_http(uri, mtime = nil, head = nil)
|
553
|
-
raise Timeout::Error, "timed out"
|
554
|
-
end
|
555
|
-
|
556
|
-
url = "http://example.com/uri"
|
557
|
-
|
558
|
-
e = assert_raise Gem::RemoteFetcher::FetchError do
|
559
|
-
fetcher.fetch_path url
|
560
|
-
end
|
561
|
-
|
562
|
-
assert_match %r{Timeout::Error: timed out \(#{Regexp.escape url}\)\z},
|
563
|
-
e.message
|
564
|
-
assert_equal url, e.uri
|
565
|
-
end
|
566
|
-
|
567
|
-
def test_fetch_path_getaddrinfo_error
|
568
|
-
fetcher = Gem::RemoteFetcher.new nil
|
569
|
-
@fetcher = fetcher
|
570
|
-
|
571
|
-
def fetcher.fetch_http(uri, mtime = nil, head = nil)
|
572
|
-
raise SocketError, "getaddrinfo: nodename nor servname provided"
|
573
|
-
end
|
574
|
-
|
575
|
-
url = "http://example.com/uri"
|
576
|
-
|
577
|
-
e = assert_raise Gem::RemoteFetcher::FetchError do
|
578
|
-
fetcher.fetch_path url
|
579
|
-
end
|
580
|
-
|
581
|
-
assert_match %r{SocketError: getaddrinfo: nodename nor servname provided \(#{Regexp.escape url}\)\z},
|
582
|
-
e.message
|
583
|
-
assert_equal url, e.uri
|
584
|
-
end
|
585
|
-
|
586
|
-
def test_fetch_path_openssl_ssl_sslerror
|
587
|
-
fetcher = Gem::RemoteFetcher.new nil
|
588
|
-
@fetcher = fetcher
|
589
|
-
|
590
|
-
def fetcher.fetch_http(uri, mtime = nil, head = nil)
|
591
|
-
raise OpenSSL::SSL::SSLError
|
592
|
-
end
|
593
|
-
|
594
|
-
url = "http://example.com/uri"
|
595
|
-
|
596
|
-
e = assert_raise Gem::RemoteFetcher::FetchError do
|
597
|
-
fetcher.fetch_path url
|
598
|
-
end
|
599
|
-
|
600
|
-
assert_equal "OpenSSL::SSL::SSLError: OpenSSL::SSL::SSLError (#{url})", e.message
|
601
|
-
assert_equal url, e.uri
|
602
|
-
end
|
603
|
-
|
604
|
-
def test_fetch_path_unmodified
|
605
|
-
fetcher = Gem::RemoteFetcher.new nil
|
606
|
-
@fetcher = fetcher
|
607
|
-
|
608
|
-
def fetcher.fetch_http(uri, mtime, head = nil)
|
609
|
-
nil
|
610
|
-
end
|
611
|
-
|
612
|
-
assert_nil fetcher.fetch_path(URI.parse(@gem_repo), Time.at(0))
|
613
|
-
end
|
614
|
-
|
615
|
-
def test_implicit_no_proxy
|
616
|
-
use_ui @stub_ui do
|
617
|
-
ENV["http_proxy"] = "http://fakeurl:12345"
|
618
|
-
fetcher = Gem::RemoteFetcher.new :no_proxy
|
619
|
-
@fetcher = fetcher
|
620
|
-
assert_data_from_server fetcher.fetch_path(@server_uri)
|
621
|
-
end
|
622
|
-
end
|
623
|
-
|
624
|
-
def test_implicit_proxy
|
625
|
-
use_ui @stub_ui do
|
626
|
-
ENV["http_proxy"] = @proxy_uri
|
627
|
-
fetcher = Gem::RemoteFetcher.new nil
|
628
|
-
@fetcher = fetcher
|
629
|
-
assert_data_from_proxy fetcher.fetch_path(@server_uri)
|
630
|
-
end
|
631
|
-
end
|
632
|
-
|
633
|
-
def test_implicit_upper_case_proxy
|
634
|
-
use_ui @stub_ui do
|
635
|
-
ENV["HTTP_PROXY"] = @proxy_uri
|
636
|
-
fetcher = Gem::RemoteFetcher.new nil
|
637
|
-
@fetcher = fetcher
|
638
|
-
assert_data_from_proxy fetcher.fetch_path(@server_uri)
|
639
|
-
end
|
640
|
-
end
|
641
|
-
|
642
|
-
def test_implicit_proxy_no_env
|
643
|
-
use_ui @stub_ui do
|
644
|
-
fetcher = Gem::RemoteFetcher.new nil
|
645
|
-
@fetcher = fetcher
|
646
|
-
assert_data_from_server fetcher.fetch_path(@server_uri)
|
647
|
-
end
|
648
|
-
end
|
649
|
-
|
650
|
-
def test_fetch_http
|
651
|
-
fetcher = Gem::RemoteFetcher.new nil
|
652
|
-
@fetcher = fetcher
|
653
|
-
url = "http://gems.example.com/redirect"
|
654
|
-
|
655
|
-
def fetcher.request(uri, request_class, last_modified = nil)
|
656
|
-
url = "http://gems.example.com/redirect"
|
657
|
-
unless defined? @requested
|
658
|
-
@requested = true
|
659
|
-
res = Net::HTTPMovedPermanently.new nil, 301, nil
|
660
|
-
res.add_field "Location", url
|
661
|
-
res
|
662
|
-
else
|
663
|
-
res = Net::HTTPOK.new nil, 200, nil
|
664
|
-
def res.body() "real_path" end
|
665
|
-
res
|
666
|
-
end
|
667
|
-
end
|
668
|
-
|
669
|
-
data = fetcher.fetch_http URI.parse(url)
|
670
|
-
|
671
|
-
assert_equal "real_path", data
|
672
|
-
end
|
673
|
-
|
674
|
-
def test_fetch_http_redirects
|
675
|
-
fetcher = Gem::RemoteFetcher.new nil
|
676
|
-
@fetcher = fetcher
|
677
|
-
url = "http://gems.example.com/redirect"
|
678
|
-
|
679
|
-
def fetcher.request(uri, request_class, last_modified = nil)
|
680
|
-
url = "http://gems.example.com/redirect"
|
681
|
-
res = Net::HTTPMovedPermanently.new nil, 301, nil
|
682
|
-
res.add_field "Location", url
|
683
|
-
res
|
684
|
-
end
|
685
|
-
|
686
|
-
e = assert_raise Gem::RemoteFetcher::FetchError do
|
687
|
-
fetcher.fetch_http URI.parse(url)
|
688
|
-
end
|
689
|
-
|
690
|
-
assert_equal "too many redirects (#{url})", e.message
|
691
|
-
end
|
692
|
-
|
693
|
-
def test_fetch_http_redirects_without_location
|
694
|
-
fetcher = Gem::RemoteFetcher.new nil
|
695
|
-
@fetcher = fetcher
|
696
|
-
url = "http://gems.example.com/redirect"
|
697
|
-
|
698
|
-
def fetcher.request(uri, request_class, last_modified = nil)
|
699
|
-
res = Net::HTTPMovedPermanently.new nil, 301, nil
|
700
|
-
res
|
701
|
-
end
|
702
|
-
|
703
|
-
e = assert_raise Gem::RemoteFetcher::FetchError do
|
704
|
-
fetcher.fetch_http URI.parse(url)
|
705
|
-
end
|
706
|
-
|
707
|
-
assert_equal "redirecting but no redirect location was given (#{url})", e.message
|
708
|
-
end
|
709
|
-
|
710
|
-
def test_fetch_http_with_additional_headers
|
711
|
-
ENV["http_proxy"] = @proxy_uri
|
712
|
-
ENV["no_proxy"] = URI::parse(@server_uri).host
|
713
|
-
fetcher = Gem::RemoteFetcher.new nil, nil, { "X-Captain" => "murphy" }
|
714
|
-
@fetcher = fetcher
|
715
|
-
assert_equal "murphy", fetcher.fetch_path(@server_uri)
|
716
|
-
end
|
717
|
-
|
718
|
-
def assert_fetch_s3(url, signature, token=nil, region="us-east-1", instance_profile_json=nil)
|
719
|
-
fetcher = Gem::RemoteFetcher.new nil
|
720
|
-
@fetcher = fetcher
|
721
|
-
$fetched_uri = nil
|
722
|
-
$instance_profile = instance_profile_json
|
723
|
-
|
724
|
-
def fetcher.request(uri, request_class, last_modified = nil)
|
725
|
-
$fetched_uri = uri
|
726
|
-
res = Net::HTTPOK.new nil, 200, nil
|
727
|
-
def res.body() "success" end
|
728
|
-
res
|
729
|
-
end
|
730
|
-
|
731
|
-
def fetcher.s3_uri_signer(uri)
|
732
|
-
require "json"
|
733
|
-
s3_uri_signer = Gem::S3URISigner.new(uri)
|
734
|
-
def s3_uri_signer.ec2_metadata_credentials_json
|
735
|
-
JSON.parse($instance_profile)
|
736
|
-
end
|
737
|
-
# Running sign operation to make sure uri.query is not mutated
|
738
|
-
s3_uri_signer.sign
|
739
|
-
raise "URI query is not empty: #{uri.query}" unless uri.query.nil?
|
740
|
-
s3_uri_signer
|
741
|
-
end
|
742
|
-
|
743
|
-
data = fetcher.fetch_s3 URI.parse(url)
|
744
|
-
|
745
|
-
assert_equal "https://my-bucket.s3.#{region}.amazonaws.com/gems/specs.4.8.gz?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=testuser%2F20190624%2F#{region}%2Fs3%2Faws4_request&X-Amz-Date=20190624T050641Z&X-Amz-Expires=86400#{token ? "&X-Amz-Security-Token=" + token : ""}&X-Amz-SignedHeaders=host&X-Amz-Signature=#{signature}", $fetched_uri.to_s
|
746
|
-
assert_equal "success", data
|
747
|
-
ensure
|
748
|
-
$fetched_uri = nil
|
749
|
-
end
|
750
|
-
|
751
|
-
def test_fetch_s3_config_creds
|
752
|
-
Gem.configuration[:s3_source] = {
|
753
|
-
"my-bucket" => { :id => "testuser", :secret => "testpass" },
|
754
|
-
}
|
755
|
-
url = "s3://my-bucket/gems/specs.4.8.gz"
|
756
|
-
Time.stub :now, Time.at(1_561_353_581) do
|
757
|
-
assert_fetch_s3 url, "20f974027db2f3cd6193565327a7c73457a138efb1a63ea248d185ce6827d41b"
|
758
|
-
end
|
759
|
-
ensure
|
760
|
-
Gem.configuration[:s3_source] = nil
|
761
|
-
end
|
762
|
-
|
763
|
-
def test_fetch_s3_config_creds_with_region
|
764
|
-
Gem.configuration[:s3_source] = {
|
765
|
-
"my-bucket" => { :id => "testuser", :secret => "testpass", :region => "us-west-2" },
|
766
|
-
}
|
767
|
-
url = "s3://my-bucket/gems/specs.4.8.gz"
|
768
|
-
Time.stub :now, Time.at(1_561_353_581) do
|
769
|
-
assert_fetch_s3 url, "4afc3010757f1fd143e769f1d1dabd406476a4fc7c120e9884fd02acbb8f26c9", nil, "us-west-2"
|
770
|
-
end
|
771
|
-
ensure
|
772
|
-
Gem.configuration[:s3_source] = nil
|
773
|
-
end
|
774
|
-
|
775
|
-
def test_fetch_s3_config_creds_with_token
|
776
|
-
Gem.configuration[:s3_source] = {
|
777
|
-
"my-bucket" => { :id => "testuser", :secret => "testpass", :security_token => "testtoken" },
|
778
|
-
}
|
779
|
-
url = "s3://my-bucket/gems/specs.4.8.gz"
|
780
|
-
Time.stub :now, Time.at(1_561_353_581) do
|
781
|
-
assert_fetch_s3 url, "935160a427ef97e7630f799232b8f208c4a4e49aad07d0540572a2ad5fe9f93c", "testtoken"
|
782
|
-
end
|
783
|
-
ensure
|
784
|
-
Gem.configuration[:s3_source] = nil
|
785
|
-
end
|
786
|
-
|
787
|
-
def test_fetch_s3_env_creds
|
788
|
-
ENV["AWS_ACCESS_KEY_ID"] = "testuser"
|
789
|
-
ENV["AWS_SECRET_ACCESS_KEY"] = "testpass"
|
790
|
-
ENV["AWS_SESSION_TOKEN"] = nil
|
791
|
-
Gem.configuration[:s3_source] = {
|
792
|
-
"my-bucket" => { :provider => "env" },
|
793
|
-
}
|
794
|
-
url = "s3://my-bucket/gems/specs.4.8.gz"
|
795
|
-
Time.stub :now, Time.at(1_561_353_581) do
|
796
|
-
assert_fetch_s3 url, "20f974027db2f3cd6193565327a7c73457a138efb1a63ea248d185ce6827d41b"
|
797
|
-
end
|
798
|
-
ensure
|
799
|
-
ENV.each_key {|key| ENV.delete(key) if key.start_with?("AWS") }
|
800
|
-
Gem.configuration[:s3_source] = nil
|
801
|
-
end
|
802
|
-
|
803
|
-
def test_fetch_s3_env_creds_with_region
|
804
|
-
ENV["AWS_ACCESS_KEY_ID"] = "testuser"
|
805
|
-
ENV["AWS_SECRET_ACCESS_KEY"] = "testpass"
|
806
|
-
ENV["AWS_SESSION_TOKEN"] = nil
|
807
|
-
Gem.configuration[:s3_source] = {
|
808
|
-
"my-bucket" => { :provider => "env", :region => "us-west-2" },
|
809
|
-
}
|
810
|
-
url = "s3://my-bucket/gems/specs.4.8.gz"
|
811
|
-
Time.stub :now, Time.at(1_561_353_581) do
|
812
|
-
assert_fetch_s3 url, "4afc3010757f1fd143e769f1d1dabd406476a4fc7c120e9884fd02acbb8f26c9", nil, "us-west-2"
|
813
|
-
end
|
814
|
-
ensure
|
815
|
-
ENV.each_key {|key| ENV.delete(key) if key.start_with?("AWS") }
|
816
|
-
Gem.configuration[:s3_source] = nil
|
817
|
-
end
|
818
|
-
|
819
|
-
def test_fetch_s3_env_creds_with_token
|
820
|
-
ENV["AWS_ACCESS_KEY_ID"] = "testuser"
|
821
|
-
ENV["AWS_SECRET_ACCESS_KEY"] = "testpass"
|
822
|
-
ENV["AWS_SESSION_TOKEN"] = "testtoken"
|
823
|
-
Gem.configuration[:s3_source] = {
|
824
|
-
"my-bucket" => { :provider => "env" },
|
825
|
-
}
|
826
|
-
url = "s3://my-bucket/gems/specs.4.8.gz"
|
827
|
-
Time.stub :now, Time.at(1_561_353_581) do
|
828
|
-
assert_fetch_s3 url, "935160a427ef97e7630f799232b8f208c4a4e49aad07d0540572a2ad5fe9f93c", "testtoken"
|
829
|
-
end
|
830
|
-
ensure
|
831
|
-
ENV.each_key {|key| ENV.delete(key) if key.start_with?("AWS") }
|
832
|
-
Gem.configuration[:s3_source] = nil
|
833
|
-
end
|
834
|
-
|
835
|
-
def test_fetch_s3_url_creds
|
836
|
-
url = "s3://testuser:testpass@my-bucket/gems/specs.4.8.gz"
|
837
|
-
Time.stub :now, Time.at(1_561_353_581) do
|
838
|
-
assert_fetch_s3 url, "20f974027db2f3cd6193565327a7c73457a138efb1a63ea248d185ce6827d41b"
|
839
|
-
end
|
840
|
-
end
|
841
|
-
|
842
|
-
def test_fetch_s3_instance_profile_creds
|
843
|
-
Gem.configuration[:s3_source] = {
|
844
|
-
"my-bucket" => { :provider => "instance_profile" },
|
845
|
-
}
|
846
|
-
|
847
|
-
url = "s3://my-bucket/gems/specs.4.8.gz"
|
848
|
-
Time.stub :now, Time.at(1_561_353_581) do
|
849
|
-
assert_fetch_s3 url, "20f974027db2f3cd6193565327a7c73457a138efb1a63ea248d185ce6827d41b", nil, "us-east-1",
|
850
|
-
'{"AccessKeyId": "testuser", "SecretAccessKey": "testpass"}'
|
851
|
-
end
|
852
|
-
ensure
|
853
|
-
Gem.configuration[:s3_source] = nil
|
854
|
-
end
|
855
|
-
|
856
|
-
def test_fetch_s3_instance_profile_creds_with_region
|
857
|
-
Gem.configuration[:s3_source] = {
|
858
|
-
"my-bucket" => { :provider => "instance_profile", :region => "us-west-2" },
|
859
|
-
}
|
860
|
-
|
861
|
-
url = "s3://my-bucket/gems/specs.4.8.gz"
|
862
|
-
Time.stub :now, Time.at(1_561_353_581) do
|
863
|
-
assert_fetch_s3 url, "4afc3010757f1fd143e769f1d1dabd406476a4fc7c120e9884fd02acbb8f26c9", nil, "us-west-2",
|
864
|
-
'{"AccessKeyId": "testuser", "SecretAccessKey": "testpass"}'
|
865
|
-
end
|
866
|
-
ensure
|
867
|
-
Gem.configuration[:s3_source] = nil
|
868
|
-
end
|
869
|
-
|
870
|
-
def test_fetch_s3_instance_profile_creds_with_token
|
871
|
-
Gem.configuration[:s3_source] = {
|
872
|
-
"my-bucket" => { :provider => "instance_profile" },
|
873
|
-
}
|
874
|
-
|
875
|
-
url = "s3://my-bucket/gems/specs.4.8.gz"
|
876
|
-
Time.stub :now, Time.at(1_561_353_581) do
|
877
|
-
assert_fetch_s3 url, "935160a427ef97e7630f799232b8f208c4a4e49aad07d0540572a2ad5fe9f93c", "testtoken", "us-east-1",
|
878
|
-
'{"AccessKeyId": "testuser", "SecretAccessKey": "testpass", "Token": "testtoken"}'
|
879
|
-
end
|
880
|
-
ensure
|
881
|
-
Gem.configuration[:s3_source] = nil
|
882
|
-
end
|
883
|
-
|
884
|
-
def refute_fetch_s3(url, expected_message)
|
885
|
-
fetcher = Gem::RemoteFetcher.new nil
|
886
|
-
@fetcher = fetcher
|
887
|
-
|
888
|
-
e = assert_raise Gem::RemoteFetcher::FetchError do
|
889
|
-
fetcher.fetch_s3 URI.parse(url)
|
890
|
-
end
|
891
|
-
|
892
|
-
assert_match expected_message, e.message
|
893
|
-
end
|
894
|
-
|
895
|
-
def test_fetch_s3_no_source_key
|
896
|
-
url = "s3://my-bucket/gems/specs.4.8.gz"
|
897
|
-
refute_fetch_s3 url, "no s3_source key exists in .gemrc"
|
898
|
-
end
|
899
|
-
|
900
|
-
def test_fetch_s3_no_host
|
901
|
-
Gem.configuration[:s3_source] = {
|
902
|
-
"my-bucket" => { :id => "testuser", :secret => "testpass" },
|
903
|
-
}
|
904
|
-
|
905
|
-
url = "s3://other-bucket/gems/specs.4.8.gz"
|
906
|
-
refute_fetch_s3 url, "no key for host other-bucket in s3_source in .gemrc"
|
907
|
-
ensure
|
908
|
-
Gem.configuration[:s3_source] = nil
|
909
|
-
end
|
910
|
-
|
911
|
-
def test_fetch_s3_no_id
|
912
|
-
Gem.configuration[:s3_source] = { "my-bucket" => { :secret => "testpass" } }
|
913
|
-
|
914
|
-
url = "s3://my-bucket/gems/specs.4.8.gz"
|
915
|
-
refute_fetch_s3 url, "s3_source for my-bucket missing id or secret"
|
916
|
-
ensure
|
917
|
-
Gem.configuration[:s3_source] = nil
|
918
|
-
end
|
919
|
-
|
920
|
-
def test_fetch_s3_no_secret
|
921
|
-
Gem.configuration[:s3_source] = { "my-bucket" => { :id => "testuser" } }
|
922
|
-
|
923
|
-
url = "s3://my-bucket/gems/specs.4.8.gz"
|
924
|
-
refute_fetch_s3 url, "s3_source for my-bucket missing id or secret"
|
925
|
-
ensure
|
926
|
-
Gem.configuration[:s3_source] = nil
|
927
|
-
end
|
928
|
-
|
929
|
-
def test_observe_no_proxy_env_single_host
|
930
|
-
use_ui @stub_ui do
|
931
|
-
ENV["http_proxy"] = @proxy_uri
|
932
|
-
ENV["no_proxy"] = URI::parse(@server_uri).host
|
933
|
-
fetcher = Gem::RemoteFetcher.new nil
|
934
|
-
@fetcher = fetcher
|
935
|
-
assert_data_from_server fetcher.fetch_path(@server_uri)
|
936
|
-
end
|
937
|
-
end
|
938
|
-
|
939
|
-
def test_observe_no_proxy_env_list
|
940
|
-
use_ui @stub_ui do
|
941
|
-
ENV["http_proxy"] = @proxy_uri
|
942
|
-
ENV["no_proxy"] = "fakeurl.com, #{URI::parse(@server_uri).host}"
|
943
|
-
fetcher = Gem::RemoteFetcher.new nil
|
944
|
-
@fetcher = fetcher
|
945
|
-
assert_data_from_server fetcher.fetch_path(@server_uri)
|
946
|
-
end
|
947
|
-
end
|
948
|
-
|
949
|
-
def test_request_block
|
950
|
-
fetcher = Gem::RemoteFetcher.new nil
|
951
|
-
@fetcher = fetcher
|
952
|
-
|
953
|
-
assert_throws :block_called do
|
954
|
-
fetcher.request URI("http://example"), Net::HTTP::Get do |req|
|
955
|
-
assert_kind_of Net::HTTPGenericRequest, req
|
956
|
-
throw :block_called
|
957
|
-
end
|
958
|
-
end
|
959
|
-
end
|
960
|
-
|
961
|
-
def test_yaml_error_on_size
|
962
|
-
use_ui @stub_ui do
|
963
|
-
self.enable_yaml = false
|
964
|
-
fetcher = Gem::RemoteFetcher.new nil
|
965
|
-
@fetcher = fetcher
|
966
|
-
assert_error { fetcher.size }
|
967
|
-
end
|
968
|
-
end
|
969
|
-
|
970
|
-
def test_ssl_connection
|
971
|
-
ssl_server = start_ssl_server
|
972
|
-
temp_ca_cert = File.join(__dir__, "ca_cert.pem")
|
973
|
-
with_configured_fetcher(":ssl_ca_cert: #{temp_ca_cert}") do |fetcher|
|
974
|
-
fetcher.fetch_path("https://localhost:#{ssl_server.config[:Port]}/yaml")
|
975
|
-
end
|
976
|
-
end
|
977
|
-
|
978
|
-
def test_ssl_client_cert_auth_connection
|
979
|
-
ssl_server = start_ssl_server({
|
980
|
-
:SSLVerifyClient =>
|
981
|
-
OpenSSL::SSL::VERIFY_PEER | OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT })
|
982
|
-
|
983
|
-
temp_ca_cert = File.join(__dir__, "ca_cert.pem")
|
984
|
-
temp_client_cert = File.join(__dir__, "client.pem")
|
985
|
-
|
986
|
-
with_configured_fetcher(
|
987
|
-
":ssl_ca_cert: #{temp_ca_cert}\n" +
|
988
|
-
":ssl_client_cert: #{temp_client_cert}\n") do |fetcher|
|
989
|
-
fetcher.fetch_path("https://localhost:#{ssl_server.config[:Port]}/yaml")
|
990
|
-
end
|
991
|
-
end
|
992
|
-
|
993
|
-
def test_do_not_allow_invalid_client_cert_auth_connection
|
994
|
-
ssl_server = start_ssl_server({
|
995
|
-
:SSLVerifyClient =>
|
996
|
-
OpenSSL::SSL::VERIFY_PEER | OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT })
|
997
|
-
|
998
|
-
temp_ca_cert = File.join(__dir__, "ca_cert.pem")
|
999
|
-
temp_client_cert = File.join(__dir__, "invalid_client.pem")
|
1000
|
-
|
1001
|
-
with_configured_fetcher(
|
1002
|
-
":ssl_ca_cert: #{temp_ca_cert}\n" +
|
1003
|
-
":ssl_client_cert: #{temp_client_cert}\n") do |fetcher|
|
1004
|
-
assert_raise Gem::RemoteFetcher::FetchError do
|
1005
|
-
fetcher.fetch_path("https://localhost:#{ssl_server.config[:Port]}/yaml")
|
1006
|
-
end
|
1007
|
-
end
|
1008
|
-
end
|
1009
|
-
|
1010
|
-
def test_do_not_allow_insecure_ssl_connection_by_default
|
1011
|
-
ssl_server = start_ssl_server
|
1012
|
-
with_configured_fetcher do |fetcher|
|
1013
|
-
assert_raise Gem::RemoteFetcher::FetchError do
|
1014
|
-
fetcher.fetch_path("https://localhost:#{ssl_server.config[:Port]}/yaml")
|
1015
|
-
end
|
1016
|
-
end
|
1017
|
-
end
|
1018
|
-
|
1019
|
-
def test_ssl_connection_allow_verify_none
|
1020
|
-
ssl_server = start_ssl_server
|
1021
|
-
with_configured_fetcher(":ssl_verify_mode: 0") do |fetcher|
|
1022
|
-
fetcher.fetch_path("https://localhost:#{ssl_server.config[:Port]}/yaml")
|
1023
|
-
end
|
1024
|
-
end
|
1025
|
-
|
1026
|
-
def test_do_not_follow_insecure_redirect
|
1027
|
-
ssl_server = start_ssl_server
|
1028
|
-
temp_ca_cert = File.join(__dir__, "ca_cert.pem")
|
1029
|
-
expected_error_message =
|
1030
|
-
"redirecting to non-https resource: #{@server_uri} (https://localhost:#{ssl_server.config[:Port]}/insecure_redirect?to=#{@server_uri})"
|
1031
|
-
|
1032
|
-
with_configured_fetcher(":ssl_ca_cert: #{temp_ca_cert}") do |fetcher|
|
1033
|
-
err = assert_raise Gem::RemoteFetcher::FetchError do
|
1034
|
-
fetcher.fetch_path("https://localhost:#{ssl_server.config[:Port]}/insecure_redirect?to=#{@server_uri}")
|
1035
|
-
end
|
1036
|
-
|
1037
|
-
assert_equal(err.message, expected_error_message)
|
1038
|
-
end
|
1039
|
-
end
|
1040
|
-
|
1041
|
-
def test_nil_ca_cert
|
1042
|
-
ssl_server = start_ssl_server
|
1043
|
-
temp_ca_cert = nil
|
1044
|
-
|
1045
|
-
with_configured_fetcher(":ssl_ca_cert: #{temp_ca_cert}") do |fetcher|
|
1046
|
-
assert_raise Gem::RemoteFetcher::FetchError do
|
1047
|
-
fetcher.fetch_path("https://localhost:#{ssl_server.config[:Port]}")
|
1048
|
-
end
|
1049
|
-
end
|
1050
|
-
end
|
1051
|
-
|
1052
|
-
def with_configured_fetcher(config_str = nil, &block)
|
1053
|
-
if config_str
|
1054
|
-
temp_conf = File.join @tempdir, ".gemrc"
|
1055
|
-
File.open temp_conf, "w" do |fp|
|
1056
|
-
fp.puts config_str
|
1057
|
-
end
|
1058
|
-
Gem.configuration = Gem::ConfigFile.new %W[--config-file #{temp_conf}]
|
1059
|
-
end
|
1060
|
-
fetcher = Gem::RemoteFetcher.new
|
1061
|
-
yield fetcher
|
1062
|
-
ensure
|
1063
|
-
fetcher.close_all
|
1064
|
-
Gem.configuration = nil
|
1065
|
-
end
|
1066
|
-
|
1067
|
-
def assert_error(exception_class=Exception)
|
1068
|
-
got_exception = false
|
1069
|
-
|
1070
|
-
begin
|
1071
|
-
yield
|
1072
|
-
rescue exception_class
|
1073
|
-
got_exception = true
|
1074
|
-
end
|
1075
|
-
|
1076
|
-
assert got_exception, "Expected exception conforming to #{exception_class}"
|
1077
|
-
end
|
1078
|
-
|
1079
|
-
def assert_data_from_server(data)
|
1080
|
-
assert_match(/0\.4\.11/, data, "Data is not from server")
|
1081
|
-
end
|
1082
|
-
|
1083
|
-
def assert_data_from_proxy(data)
|
1084
|
-
assert_match(/0\.4\.2/, data, "Data is not from proxy")
|
1085
|
-
end
|
1086
|
-
|
1087
|
-
class NilLog < WEBrick::Log
|
1088
|
-
def log(level, data) #Do nothing
|
1089
|
-
end
|
1090
|
-
end
|
1091
|
-
|
1092
|
-
private
|
1093
|
-
|
1094
|
-
attr_reader :normal_server, :proxy_server
|
1095
|
-
attr_accessor :enable_zip, :enable_yaml
|
1096
|
-
|
1097
|
-
def start_servers
|
1098
|
-
@normal_server ||= start_server(SERVER_DATA)
|
1099
|
-
@proxy_server ||= start_server(PROXY_DATA)
|
1100
|
-
@enable_yaml = true
|
1101
|
-
@enable_zip = false
|
1102
|
-
@ssl_server = nil
|
1103
|
-
@ssl_server_thread = nil
|
1104
|
-
end
|
1105
|
-
|
1106
|
-
def stop_servers
|
1107
|
-
if @normal_server
|
1108
|
-
@normal_server.kill.join
|
1109
|
-
@normal_server = nil
|
1110
|
-
end
|
1111
|
-
if @proxy_server
|
1112
|
-
@proxy_server.kill.join
|
1113
|
-
@proxy_server = nil
|
1114
|
-
end
|
1115
|
-
if @ssl_server
|
1116
|
-
@ssl_server.stop
|
1117
|
-
@ssl_server = nil
|
1118
|
-
end
|
1119
|
-
if @ssl_server_thread
|
1120
|
-
@ssl_server_thread.kill.join
|
1121
|
-
@ssl_server_thread = nil
|
1122
|
-
end
|
1123
|
-
utils = WEBrick::Utils # TimeoutHandler is since 1.9
|
1124
|
-
utils::TimeoutHandler.terminate if defined?(utils::TimeoutHandler.terminate)
|
1125
|
-
end
|
1126
|
-
|
1127
|
-
def normal_server_port
|
1128
|
-
@normal_server[:server].config[:Port]
|
1129
|
-
end
|
1130
|
-
|
1131
|
-
def proxy_server_port
|
1132
|
-
@proxy_server[:server].config[:Port]
|
1133
|
-
end
|
1134
|
-
|
1135
|
-
def start_ssl_server(config = {})
|
1136
|
-
pend "starting this test server fails randomly on jruby" if Gem.java_platform?
|
1137
|
-
|
1138
|
-
null_logger = NilLog.new
|
1139
|
-
server = WEBrick::HTTPServer.new({
|
1140
|
-
:Port => 0,
|
1141
|
-
:Logger => null_logger,
|
1142
|
-
:AccessLog => [],
|
1143
|
-
:SSLEnable => true,
|
1144
|
-
:SSLCACertificateFile => File.join(__dir__, "ca_cert.pem"),
|
1145
|
-
:SSLCertificate => cert("ssl_cert.pem"),
|
1146
|
-
:SSLPrivateKey => key("ssl_key.pem"),
|
1147
|
-
:SSLVerifyClient => nil,
|
1148
|
-
:SSLCertName => nil,
|
1149
|
-
}.merge(config))
|
1150
|
-
server.mount_proc("/yaml") do |req, res|
|
1151
|
-
res.body = "--- true\n"
|
1152
|
-
end
|
1153
|
-
server.mount_proc("/insecure_redirect") do |req, res|
|
1154
|
-
res.set_redirect(WEBrick::HTTPStatus::MovedPermanently, req.query["to"])
|
1155
|
-
end
|
1156
|
-
server.ssl_context.tmp_dh_callback = proc { TEST_KEY_DH2048 }
|
1157
|
-
t = Thread.new do
|
1158
|
-
server.start
|
1159
|
-
rescue Exception => ex
|
1160
|
-
puts "ERROR during server thread: #{ex.message}"
|
1161
|
-
raise
|
1162
|
-
ensure
|
1163
|
-
server.shutdown
|
1164
|
-
end
|
1165
|
-
while server.status != :Running
|
1166
|
-
sleep 0.1
|
1167
|
-
unless t.alive?
|
1168
|
-
t.join
|
1169
|
-
raise
|
1170
|
-
end
|
1171
|
-
end
|
1172
|
-
@ssl_server = server
|
1173
|
-
@ssl_server_thread = t
|
1174
|
-
server
|
1175
|
-
end
|
1176
|
-
|
1177
|
-
def start_server(data)
|
1178
|
-
null_logger = NilLog.new
|
1179
|
-
s = WEBrick::HTTPServer.new(
|
1180
|
-
:Port => 0,
|
1181
|
-
:DocumentRoot => nil,
|
1182
|
-
:Logger => null_logger,
|
1183
|
-
:AccessLog => null_logger
|
1184
|
-
)
|
1185
|
-
s.mount_proc("/kill") {|req, res| s.shutdown }
|
1186
|
-
s.mount_proc("/yaml") do |req, res|
|
1187
|
-
if req["X-Captain"]
|
1188
|
-
res.body = req["X-Captain"]
|
1189
|
-
elsif @enable_yaml
|
1190
|
-
res.body = data
|
1191
|
-
res["Content-Type"] = "text/plain"
|
1192
|
-
res["content-length"] = data.size
|
1193
|
-
else
|
1194
|
-
res.status = "404"
|
1195
|
-
res.body = "<h1>NOT FOUND</h1>"
|
1196
|
-
res["Content-Type"] = "text/html"
|
1197
|
-
end
|
1198
|
-
end
|
1199
|
-
s.mount_proc("/yaml.Z") do |req, res|
|
1200
|
-
if @enable_zip
|
1201
|
-
res.body = Zlib::Deflate.deflate(data)
|
1202
|
-
res["Content-Type"] = "text/plain"
|
1203
|
-
else
|
1204
|
-
res.status = "404"
|
1205
|
-
res.body = "<h1>NOT FOUND</h1>"
|
1206
|
-
res["Content-Type"] = "text/html"
|
1207
|
-
end
|
1208
|
-
end
|
1209
|
-
th = Thread.new do
|
1210
|
-
s.start
|
1211
|
-
rescue Exception => ex
|
1212
|
-
abort "ERROR during server thread: #{ex.message}"
|
1213
|
-
ensure
|
1214
|
-
s.shutdown
|
1215
|
-
end
|
1216
|
-
th[:server] = s
|
1217
|
-
th
|
1218
|
-
end
|
1219
|
-
|
1220
|
-
def cert(filename)
|
1221
|
-
OpenSSL::X509::Certificate.new(File.read(File.join(__dir__, filename)))
|
1222
|
-
end
|
1223
|
-
|
1224
|
-
def key(filename)
|
1225
|
-
OpenSSL::PKey::RSA.new(File.read(File.join(__dir__, filename)))
|
1226
|
-
end
|
1227
|
-
end if Gem::HAVE_OPENSSL
|