puppet 6.13.0-x64-mingw32 → 6.18.0-x64-mingw32
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.
Potentially problematic release.
This version of puppet might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CODEOWNERS +2 -7
- data/CONTRIBUTING.md +7 -13
- data/Gemfile +4 -2
- data/Gemfile.lock +36 -32
- data/README.md +17 -24
- data/ext/windows/service/daemon.rb +3 -3
- data/lib/puppet.rb +33 -9
- data/lib/puppet/agent.rb +20 -14
- data/lib/puppet/application/agent.rb +26 -17
- data/lib/puppet/application/apply.rb +18 -20
- data/lib/puppet/application/describe.rb +7 -5
- data/lib/puppet/application/device.rb +2 -2
- data/lib/puppet/application/filebucket.rb +19 -15
- data/lib/puppet/application/lookup.rb +16 -4
- data/lib/puppet/application/plugin.rb +1 -0
- data/lib/puppet/application/ssl.rb +4 -4
- data/lib/puppet/configurer.rb +58 -57
- data/lib/puppet/configurer/downloader.rb +31 -10
- data/lib/puppet/configurer/plugin_handler.rb +10 -1
- data/lib/puppet/confine.rb +2 -2
- data/lib/puppet/confine/any.rb +1 -1
- data/lib/puppet/context/trusted_information.rb +14 -8
- data/lib/puppet/daemon.rb +13 -27
- data/lib/puppet/defaults.rb +92 -12
- data/lib/puppet/environments.rb +4 -5
- data/lib/puppet/face/facts.rb +1 -1
- data/lib/puppet/face/help.rb +29 -3
- data/lib/puppet/face/module/search.rb +5 -0
- data/lib/puppet/face/plugin.rb +2 -2
- data/lib/puppet/feature/base.rb +1 -1
- data/lib/puppet/file_serving/http_metadata.rb +14 -2
- data/lib/puppet/file_serving/metadata.rb +4 -1
- data/lib/puppet/file_serving/mount/locales.rb +1 -2
- data/lib/puppet/file_serving/mount/pluginfacts.rb +1 -2
- data/lib/puppet/file_serving/mount/plugins.rb +1 -2
- data/lib/puppet/file_serving/terminus_selector.rb +7 -8
- data/lib/puppet/file_system/file_impl.rb +17 -13
- data/lib/puppet/file_system/uniquefile.rb +12 -16
- data/lib/puppet/forge.rb +1 -1
- data/lib/puppet/forge/cache.rb +1 -1
- data/lib/puppet/forge/repository.rb +4 -7
- data/lib/puppet/functions/call.rb +1 -1
- data/lib/puppet/functions/eyaml_lookup_key.rb +13 -8
- data/lib/puppet/functions/filter.rb +1 -0
- data/lib/puppet/functions/lstrip.rb +4 -4
- data/lib/puppet/functions/reduce.rb +2 -4
- data/lib/puppet/functions/reverse_each.rb +1 -1
- data/lib/puppet/functions/rstrip.rb +4 -4
- data/lib/puppet/functions/step.rb +1 -1
- data/lib/puppet/functions/strip.rb +4 -4
- data/lib/puppet/gettext/config.rb +5 -5
- data/lib/puppet/gettext/module_translations.rb +4 -4
- data/lib/puppet/http.rb +3 -0
- data/lib/puppet/http/client.rb +263 -73
- data/lib/puppet/http/external_client.rb +90 -0
- data/lib/puppet/http/redirector.rb +43 -7
- data/lib/puppet/http/resolver.rb +46 -3
- data/lib/puppet/http/resolver/server_list.rb +76 -16
- data/lib/puppet/http/resolver/settings.rb +23 -3
- data/lib/puppet/http/resolver/srv.rb +29 -3
- data/lib/puppet/http/response.rb +87 -1
- data/lib/puppet/http/retry_after_handler.rb +39 -0
- data/lib/puppet/http/service.rb +97 -12
- data/lib/puppet/http/service/ca.rb +76 -14
- data/lib/puppet/http/service/compiler.rb +249 -16
- data/lib/puppet/http/service/file_server.rb +141 -20
- data/lib/puppet/http/service/report.rb +47 -17
- data/lib/puppet/http/session.rb +96 -7
- data/lib/puppet/indirector.rb +1 -1
- data/lib/puppet/indirector/catalog/rest.rb +34 -0
- data/lib/puppet/indirector/exec.rb +1 -1
- data/lib/puppet/indirector/facts/facter.rb +3 -3
- data/lib/puppet/indirector/facts/rest.rb +42 -0
- data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
- data/lib/puppet/indirector/file_content/http.rb +5 -0
- data/lib/puppet/indirector/file_content/rest.rb +30 -0
- data/lib/puppet/indirector/file_metadata/http.rb +28 -8
- data/lib/puppet/indirector/file_metadata/rest.rb +52 -0
- data/lib/puppet/indirector/hiera.rb +4 -0
- data/lib/puppet/indirector/indirection.rb +1 -1
- data/lib/puppet/indirector/node/rest.rb +24 -0
- data/lib/puppet/indirector/report/processor.rb +2 -2
- data/lib/puppet/indirector/report/rest.rb +19 -0
- data/lib/puppet/indirector/report/yaml.rb +23 -0
- data/lib/puppet/indirector/request.rb +1 -1
- data/lib/puppet/indirector/rest.rb +12 -0
- data/lib/puppet/indirector/status/rest.rb +18 -0
- data/lib/puppet/loaders.rb +6 -0
- data/lib/puppet/metatype/manager.rb +80 -80
- data/lib/puppet/module.rb +1 -2
- data/lib/puppet/network/format_support.rb +2 -2
- data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
- data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
- data/lib/puppet/network/http/base_pool.rb +7 -2
- data/lib/puppet/network/http/compression.rb +7 -0
- data/lib/puppet/network/http/connection.rb +2 -0
- data/lib/puppet/network/http/connection_adapter.rb +184 -0
- data/lib/puppet/network/http/nocache_pool.rb +1 -0
- data/lib/puppet/network/http/pool.rb +8 -5
- data/lib/puppet/network/http/route.rb +2 -2
- data/lib/puppet/network/http_pool.rb +2 -1
- data/lib/puppet/node/environment.rb +22 -5
- data/lib/puppet/pal/catalog_compiler.rb +5 -0
- data/lib/puppet/pal/pal_impl.rb +30 -31
- data/lib/puppet/parameter.rb +1 -1
- data/lib/puppet/parser/ast/leaf.rb +5 -5
- data/lib/puppet/parser/ast/pops_bridge.rb +0 -4
- data/lib/puppet/parser/compiler.rb +43 -33
- data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +2 -0
- data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +2 -0
- data/lib/puppet/parser/environment_compiler.rb +4 -1
- data/lib/puppet/parser/functions.rb +18 -9
- data/lib/puppet/parser/functions/create_resources.rb +11 -7
- data/lib/puppet/parser/functions/filter.rb +1 -0
- data/lib/puppet/parser/resource.rb +3 -2
- data/lib/puppet/parser/resource/param.rb +6 -0
- data/lib/puppet/parser/type_loader.rb +2 -2
- data/lib/puppet/pops/adaptable.rb +7 -13
- data/lib/puppet/pops/adapters.rb +8 -4
- data/lib/puppet/pops/evaluator/evaluator_impl.rb +5 -5
- data/lib/puppet/pops/issues.rb +5 -0
- data/lib/puppet/pops/loader/runtime3_type_loader.rb +4 -2
- data/lib/puppet/pops/loaders.rb +24 -15
- data/lib/puppet/pops/lookup/context.rb +1 -1
- data/lib/puppet/pops/lookup/hiera_config.rb +14 -1
- data/lib/puppet/pops/resource/resource_type_impl.rb +2 -0
- data/lib/puppet/pops/types/iterable.rb +34 -8
- data/lib/puppet/pops/validation/checker4_0.rb +29 -15
- data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
- data/lib/puppet/provider/file/windows.rb +1 -1
- data/lib/puppet/provider/group/groupadd.rb +9 -4
- data/lib/puppet/provider/group/windows_adsi.rb +3 -3
- data/lib/puppet/provider/package/aix.rb +17 -2
- data/lib/puppet/provider/package/apt.rb +98 -1
- data/lib/puppet/provider/package/aptitude.rb +1 -1
- data/lib/puppet/provider/package/dnfmodule.rb +61 -14
- data/lib/puppet/provider/package/gem.rb +45 -9
- data/lib/puppet/provider/package/pacman.rb +2 -5
- data/lib/puppet/provider/package/pip.rb +143 -48
- data/lib/puppet/provider/package/pip3.rb +0 -2
- data/lib/puppet/provider/package/pkgdmg.rb +1 -1
- data/lib/puppet/provider/package/pkgng.rb +16 -4
- data/lib/puppet/provider/package/portage.rb +2 -2
- data/lib/puppet/provider/package/puppet_gem.rb +11 -2
- data/lib/puppet/provider/package/rpm.rb +6 -213
- data/lib/puppet/provider/package/yum.rb +100 -20
- data/lib/puppet/provider/package/zypper.rb +62 -1
- data/lib/puppet/provider/service/systemd.rb +22 -4
- data/lib/puppet/provider/service/windows.rb +23 -7
- data/lib/puppet/provider/user/aix.rb +1 -1
- data/lib/puppet/provider/user/user_role_add.rb +1 -1
- data/lib/puppet/provider/user/useradd.rb +16 -5
- data/lib/puppet/provider/user/windows_adsi.rb +18 -1
- data/lib/puppet/reports/http.rb +15 -9
- data/lib/puppet/resource.rb +2 -1
- data/lib/puppet/resource/type.rb +8 -0
- data/lib/puppet/resource/type_collection.rb +20 -16
- data/lib/puppet/runtime.rb +31 -1
- data/lib/puppet/settings.rb +3 -1
- data/lib/puppet/settings/http_extra_headers_setting.rb +25 -0
- data/lib/puppet/ssl.rb +1 -0
- data/lib/puppet/ssl/host.rb +4 -4
- data/lib/puppet/ssl/oids.rb +1 -0
- data/lib/puppet/ssl/ssl_context.rb +2 -2
- data/lib/puppet/ssl/ssl_provider.rb +20 -1
- data/lib/puppet/ssl/state_machine.rb +81 -35
- data/lib/puppet/ssl/validator/default_validator.rb +1 -1
- data/lib/puppet/ssl/verifier_adapter.rb +9 -1
- data/lib/puppet/test/test_helper.rb +21 -14
- data/lib/puppet/transaction.rb +2 -2
- data/lib/puppet/transaction/persistence.rb +1 -1
- data/lib/puppet/transaction/report.rb +3 -3
- data/lib/puppet/trusted_external.rb +29 -1
- data/lib/puppet/type.rb +21 -8
- data/lib/puppet/type/file.rb +51 -13
- data/lib/puppet/type/file/checksum.rb +4 -4
- data/lib/puppet/type/file/source.rb +75 -64
- data/lib/puppet/type/notify.rb +2 -2
- data/lib/puppet/type/package.rb +41 -3
- data/lib/puppet/type/service.rb +59 -8
- data/lib/puppet/type/user.rb +19 -29
- data/lib/puppet/util.rb +41 -3
- data/lib/puppet/util/at_fork.rb +1 -1
- data/lib/puppet/util/autoload.rb +13 -25
- data/lib/puppet/util/character_encoding.rb +9 -5
- data/lib/puppet/util/checksums.rb +19 -4
- data/lib/puppet/util/execution.rb +2 -2
- data/lib/puppet/util/fileparsing.rb +2 -2
- data/lib/puppet/util/instance_loader.rb +14 -10
- data/lib/puppet/util/log/destinations.rb +1 -10
- data/lib/puppet/util/package/version/debian.rb +175 -0
- data/lib/puppet/util/package/version/gem.rb +15 -0
- data/lib/puppet/util/package/version/pip.rb +167 -0
- data/lib/puppet/util/package/version/range.rb +53 -0
- data/lib/puppet/util/package/version/range/eq.rb +14 -0
- data/lib/puppet/util/package/version/range/gt.rb +14 -0
- data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
- data/lib/puppet/util/package/version/range/lt.rb +14 -0
- data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
- data/lib/puppet/util/package/version/range/min_max.rb +21 -0
- data/lib/puppet/util/package/version/range/simple.rb +11 -0
- data/lib/puppet/util/package/version/rpm.rb +73 -0
- data/lib/puppet/util/pidlock.rb +13 -7
- data/lib/puppet/util/platform.rb +5 -0
- data/lib/puppet/util/provider_features.rb +1 -1
- data/lib/puppet/util/reference.rb +1 -1
- data/lib/puppet/util/rpm_compare.rb +193 -0
- data/lib/puppet/util/windows.rb +1 -0
- data/lib/puppet/util/windows/adsi.rb +2 -2
- data/lib/puppet/util/windows/api_types.rb +60 -33
- data/lib/puppet/util/windows/eventlog.rb +1 -6
- data/lib/puppet/util/windows/monkey_patches/dir.rb +40 -0
- data/lib/puppet/util/windows/principal.rb +8 -6
- data/lib/puppet/util/windows/process.rb +15 -14
- data/lib/puppet/util/windows/registry.rb +11 -11
- data/lib/puppet/util/windows/security.rb +5 -4
- data/lib/puppet/util/windows/service.rb +43 -26
- data/lib/puppet/util/windows/sid.rb +3 -3
- data/lib/puppet/util/windows/user.rb +242 -8
- data/lib/puppet/version.rb +1 -1
- data/locales/puppet.pot +641 -511
- data/man/man5/puppet.conf.5 +75 -10
- data/man/man8/puppet-agent.8 +7 -7
- data/man/man8/puppet-apply.8 +1 -1
- data/man/man8/puppet-catalog.8 +1 -1
- data/man/man8/puppet-config.8 +1 -1
- data/man/man8/puppet-describe.8 +1 -1
- data/man/man8/puppet-device.8 +2 -2
- data/man/man8/puppet-doc.8 +1 -1
- data/man/man8/puppet-epp.8 +1 -1
- data/man/man8/puppet-facts.8 +1 -1
- data/man/man8/puppet-filebucket.8 +17 -2
- data/man/man8/puppet-generate.8 +1 -1
- data/man/man8/puppet-help.8 +6 -3
- data/man/man8/puppet-key.8 +1 -1
- data/man/man8/puppet-lookup.8 +2 -2
- data/man/man8/puppet-man.8 +1 -1
- data/man/man8/puppet-module.8 +4 -1
- data/man/man8/puppet-node.8 +1 -1
- data/man/man8/puppet-parser.8 +1 -1
- data/man/man8/puppet-plugin.8 +1 -1
- data/man/man8/puppet-report.8 +1 -1
- data/man/man8/puppet-resource.8 +1 -1
- data/man/man8/puppet-script.8 +1 -1
- data/man/man8/puppet-ssl.8 +2 -2
- data/man/man8/puppet-status.8 +1 -1
- data/man/man8/puppet.8 +2 -2
- data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/provider/applytest/applytest.rb +2 -0
- data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/type/applytest.rb +25 -0
- data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +67 -0
- data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
- data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
- data/spec/fixtures/ssl/unknown-ca.pem +59 -0
- data/spec/fixtures/unit/forge/bacula-releases.json +128 -0
- data/spec/fixtures/unit/forge/bacula.tar.gz +0 -0
- data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list.txt} +8 -0
- data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
- data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
- data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
- data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +1 -67
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_not_update_if_content_on_disk_is_up-to-date.yml +1 -69
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +1 -69
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +1 -67
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +1 -65
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +1 -67
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +1 -67
- data/spec/integration/application/agent_spec.rb +475 -0
- data/spec/integration/application/apply_spec.rb +279 -150
- data/spec/integration/application/config_spec.rb +74 -0
- data/spec/integration/application/doc_spec.rb +16 -6
- data/spec/integration/application/filebucket_spec.rb +239 -0
- data/spec/integration/application/help_spec.rb +42 -0
- data/spec/integration/application/lookup_spec.rb +13 -0
- data/spec/integration/application/module_spec.rb +68 -0
- data/spec/integration/application/plugin_spec.rb +123 -0
- data/spec/integration/data_binding_spec.rb +82 -0
- data/spec/integration/defaults_spec.rb +1 -2
- data/spec/integration/directory_environments_spec.rb +17 -17
- data/spec/integration/http/client_spec.rb +47 -37
- data/spec/integration/indirector/facts/facter_spec.rb +8 -6
- data/spec/integration/indirector/report/yaml.rb +83 -0
- data/spec/integration/network/http_pool_spec.rb +93 -20
- data/spec/integration/node/environment_spec.rb +15 -0
- data/spec/integration/parser/compiler_spec.rb +11 -0
- data/spec/integration/type/file_spec.rb +1 -1
- data/spec/integration/util/execution_spec.rb +22 -0
- data/spec/integration/util/windows/adsi_spec.rb +6 -1
- data/spec/integration/util/windows/monkey_patches/dir_spec.rb +11 -0
- data/spec/integration/util/windows/process_spec.rb +26 -32
- data/spec/integration/util/windows/registry_spec.rb +7 -7
- data/spec/integration/util/windows/user_spec.rb +47 -5
- data/spec/integration/util_spec.rb +7 -33
- data/spec/lib/puppet/test_ca.rb +2 -2
- data/spec/lib/puppet_spec/https.rb +16 -7
- data/spec/lib/puppet_spec/matchers.rb +0 -80
- data/spec/lib/puppet_spec/puppetserver.rb +127 -0
- data/spec/shared_contexts/https.rb +29 -0
- data/spec/unit/agent_spec.rb +80 -26
- data/spec/unit/application/agent_spec.rb +12 -9
- data/spec/unit/application/describe_spec.rb +88 -50
- data/spec/unit/application/device_spec.rb +2 -2
- data/spec/unit/application/face_base_spec.rb +6 -4
- data/spec/unit/application/facts_spec.rb +39 -10
- data/spec/unit/application/filebucket_spec.rb +22 -2
- data/spec/unit/application/man_spec.rb +52 -0
- data/spec/unit/application/resource_spec.rb +3 -1
- data/spec/unit/application/ssl_spec.rb +15 -2
- data/spec/unit/configurer/downloader_spec.rb +10 -0
- data/spec/unit/configurer/fact_handler_spec.rb +4 -4
- data/spec/unit/configurer/plugin_handler_spec.rb +36 -19
- data/spec/unit/configurer_spec.rb +64 -46
- data/spec/unit/confine_spec.rb +2 -1
- data/spec/unit/context/trusted_information_spec.rb +25 -2
- data/spec/unit/daemon_spec.rb +5 -64
- data/spec/unit/defaults_spec.rb +24 -1
- data/spec/unit/environments_spec.rb +8 -0
- data/spec/unit/face/config_spec.rb +3 -1
- data/spec/unit/face/module/search_spec.rb +17 -0
- data/spec/unit/face/plugin_spec.rb +12 -10
- data/spec/unit/file_serving/http_metadata_spec.rb +37 -14
- data/spec/unit/file_serving/mount/locales_spec.rb +2 -2
- data/spec/unit/file_serving/mount/pluginfacts_spec.rb +2 -2
- data/spec/unit/file_serving/mount/plugins_spec.rb +2 -2
- data/spec/unit/file_serving/terminus_selector_spec.rb +45 -26
- data/spec/unit/file_system/uniquefile_spec.rb +29 -0
- data/spec/unit/file_system_spec.rb +10 -0
- data/spec/unit/functions/lookup_spec.rb +13 -0
- data/spec/unit/http/client_spec.rb +321 -36
- data/spec/unit/http/external_client_spec.rb +201 -0
- data/spec/unit/http/resolver_spec.rb +34 -3
- data/spec/unit/http/response_spec.rb +75 -0
- data/spec/unit/http/service/ca_spec.rb +53 -12
- data/spec/unit/http/service/compiler_spec.rb +332 -28
- data/spec/unit/http/service/file_server_spec.rb +100 -12
- data/spec/unit/http/service/report_spec.rb +19 -9
- data/spec/unit/http/service_spec.rb +94 -6
- data/spec/unit/http/session_spec.rb +159 -8
- data/spec/unit/indirector/catalog/compiler_spec.rb +1 -0
- data/spec/unit/indirector/catalog/rest_spec.rb +59 -2
- data/spec/unit/indirector/facts/rest_spec.rb +79 -24
- data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
- data/spec/unit/indirector/file_content/rest_spec.rb +53 -2
- data/spec/unit/indirector/file_metadata/http_spec.rb +194 -0
- data/spec/unit/indirector/file_metadata/rest_spec.rb +110 -2
- data/spec/unit/indirector/node/rest_spec.rb +57 -2
- data/spec/unit/indirector/report/rest_spec.rb +58 -51
- data/spec/unit/indirector/request_spec.rb +1 -1
- data/spec/unit/indirector/resource/ral_spec.rb +7 -8
- data/spec/unit/indirector/rest_spec.rb +13 -0
- data/spec/unit/indirector/status/rest_spec.rb +43 -2
- data/spec/unit/interface_spec.rb +3 -3
- data/spec/unit/module_tool/tar/mini_spec.rb +20 -0
- data/spec/unit/network/format_support_spec.rb +3 -2
- data/spec/unit/network/http/api/indirected_routes_spec.rb +2 -1
- data/spec/unit/network/http/connection_spec.rb +552 -190
- data/spec/unit/network/http/nocache_pool_spec.rb +22 -0
- data/spec/unit/network/http/pool_spec.rb +59 -13
- data/spec/unit/network/http_pool_spec.rb +63 -57
- data/spec/unit/network/http_spec.rb +1 -1
- data/spec/unit/node/environment_spec.rb +33 -0
- data/spec/unit/parser/ast/block_expression_spec.rb +1 -1
- data/spec/unit/parser/environment_compiler_spec.rb +7 -0
- data/spec/unit/parser/scope_spec.rb +1 -1
- data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +15 -1
- data/spec/unit/pops/loaders/loaders_spec.rb +71 -1
- data/spec/unit/pops/lookup/lookup_spec.rb +25 -0
- data/spec/unit/pops/types/type_calculator_spec.rb +1 -11
- data/spec/unit/provider/group/groupadd_spec.rb +22 -8
- data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
- data/spec/unit/provider/package/aix_spec.rb +29 -0
- data/spec/unit/provider/package/apt_spec.rb +107 -0
- data/spec/unit/provider/package/aptitude_spec.rb +1 -0
- data/spec/unit/provider/package/dnfmodule_spec.rb +54 -15
- data/spec/unit/provider/package/gem_spec.rb +40 -0
- data/spec/unit/provider/package/pacman_spec.rb +6 -21
- data/spec/unit/provider/package/pip_spec.rb +68 -19
- data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
- data/spec/unit/provider/package/pkgng_spec.rb +38 -0
- data/spec/unit/provider/package/portage_spec.rb +5 -0
- data/spec/unit/provider/package/puppet_gem_spec.rb +12 -1
- data/spec/unit/provider/package/rpm_spec.rb +0 -212
- data/spec/unit/provider/package/yum_spec.rb +243 -1
- data/spec/unit/provider/package/zypper_spec.rb +98 -0
- data/spec/unit/provider/service/init_spec.rb +42 -0
- data/spec/unit/provider/service/openbsd_spec.rb +9 -0
- data/spec/unit/provider/service/openwrt_spec.rb +1 -0
- data/spec/unit/provider/service/redhat_spec.rb +9 -0
- data/spec/unit/provider/service/systemd_spec.rb +93 -18
- data/spec/unit/provider/service/windows_spec.rb +50 -14
- data/spec/unit/provider/user/openbsd_spec.rb +1 -0
- data/spec/unit/provider/user/useradd_spec.rb +30 -16
- data/spec/unit/provider/user/windows_adsi_spec.rb +85 -3
- data/spec/unit/puppet_pal_2pec.rb +11 -0
- data/spec/unit/puppet_pal_catalog_spec.rb +43 -0
- data/spec/unit/puppet_spec.rb +33 -0
- data/spec/unit/reports/http_spec.rb +70 -52
- data/spec/unit/reports/store_spec.rb +17 -13
- data/spec/unit/resource_spec.rb +3 -3
- data/spec/unit/settings/autosign_setting_spec.rb +1 -1
- data/spec/unit/settings/http_extra_headers_spec.rb +64 -0
- data/spec/unit/ssl/host_spec.rb +4 -2
- data/spec/unit/ssl/oids_spec.rb +1 -0
- data/spec/unit/ssl/ssl_provider_spec.rb +69 -43
- data/spec/unit/ssl/state_machine_spec.rb +99 -13
- data/spec/unit/test/test_helper_spec.rb +17 -0
- data/spec/unit/transaction/persistence_spec.rb +15 -0
- data/spec/unit/transaction/report_spec.rb +5 -1
- data/spec/unit/transaction_spec.rb +0 -2
- data/spec/unit/type/file/ensure_spec.rb +1 -2
- data/spec/unit/type/file/source_spec.rb +89 -38
- data/spec/unit/type/file_spec.rb +122 -96
- data/spec/unit/type/service_spec.rb +218 -8
- data/spec/unit/type/user_spec.rb +32 -3
- data/spec/unit/type_spec.rb +50 -0
- data/spec/unit/util/at_fork_spec.rb +3 -2
- data/spec/unit/util/autoload_spec.rb +2 -1
- data/spec/unit/util/character_encoding_spec.rb +4 -4
- data/spec/unit/util/checksums_spec.rb +16 -0
- data/spec/unit/util/command_line_spec.rb +11 -6
- data/spec/unit/util/log/destinations_spec.rb +1 -29
- data/spec/unit/util/package/version/debian_spec.rb +83 -0
- data/spec/unit/util/package/version/pip_spec.rb +464 -0
- data/spec/unit/util/package/version/range_spec.rb +175 -0
- data/spec/unit/util/package/version/rpm_spec.rb +121 -0
- data/spec/unit/util/pidlock_spec.rb +102 -54
- data/spec/unit/util/rpm_compare_spec.rb +196 -0
- data/spec/unit/util/windows/adsi_spec.rb +4 -4
- data/spec/unit/util/windows/api_types_spec.rb +104 -40
- data/spec/unit/util/windows/service_spec.rb +4 -4
- data/spec/unit/util/windows/sid_spec.rb +2 -2
- data/spec/unit/util_spec.rb +3 -3
- data/spec/unit/x509/cert_provider_spec.rb +1 -1
- data/tasks/generate_cert_fixtures.rake +15 -1
- data/tasks/manpages.rake +5 -35
- metadata +84 -52
- data/COMMITTERS.md +0 -244
- data/spec/integration/faces/config_spec.rb +0 -91
- data/spec/integration/faces/documentation_spec.rb +0 -57
- data/spec/integration/faces/plugin_spec.rb +0 -61
- data/spec/integration/file_bucket/file_spec.rb +0 -50
- data/spec/integration/file_serving/content_spec.rb +0 -7
- data/spec/integration/file_serving/fileset_spec.rb +0 -12
- data/spec/integration/file_serving/metadata_spec.rb +0 -8
- data/spec/integration/file_serving/terminus_helper_spec.rb +0 -20
- data/spec/integration/file_system/uniquefile_spec.rb +0 -26
- data/spec/integration/module_tool/forge_spec.rb +0 -64
- data/spec/integration/module_tool/tar/mini_spec.rb +0 -28
- data/spec/integration/provider/service/init_spec.rb +0 -48
- data/spec/integration/provider/service/systemd_spec.rb +0 -25
- data/spec/integration/provider/service/windows_spec.rb +0 -50
- data/spec/integration/reference/providers_spec.rb +0 -21
- data/spec/integration/reports_spec.rb +0 -13
- data/spec/integration/ssl/certificate_request_spec.rb +0 -44
- data/spec/integration/ssl/host_spec.rb +0 -72
- data/spec/integration/ssl/key_spec.rb +0 -99
- data/spec/integration/test/test_helper_spec.rb +0 -31
- data/spec/shared_behaviours/file_serving_model.rb +0 -51
- data/spec/unit/face/man_spec.rb +0 -25
- data/spec/unit/man_spec.rb +0 -31
| @@ -52,13 +52,13 @@ describe Puppet::FileServing::Mount::Plugins do | |
| 52 52 | 
             
                  expect(@mount.search("foo/bar", @request)).to eq(["/"])
         | 
| 53 53 | 
             
                end
         | 
| 54 54 |  | 
| 55 | 
            -
                it "should return  | 
| 55 | 
            +
                it "should return the default search module path if no modules can be found that have plugins and modulepath is invalid" do
         | 
| 56 56 | 
             
                  mod = double('module')
         | 
| 57 57 | 
             
                  allow(mod).to receive(:plugins?).and_return(false)
         | 
| 58 58 |  | 
| 59 59 | 
             
                  allow(@environment).to receive(:modules).and_return([])
         | 
| 60 60 | 
             
                  allow(@environment).to receive(:modulepath).and_return([])
         | 
| 61 | 
            -
                  expect(@mount.search("foo/bar", @request)).to  | 
| 61 | 
            +
                  expect(@mount.search("foo/bar", @request)).to eq([Puppet[:codedir]])
         | 
| 62 62 | 
             
                end
         | 
| 63 63 |  | 
| 64 64 | 
             
                it "should return the plugin paths for each module that has plugins" do
         | 
| @@ -3,62 +3,81 @@ require 'spec_helper' | |
| 3 3 | 
             
            require 'puppet/file_serving/terminus_selector'
         | 
| 4 4 |  | 
| 5 5 | 
             
            describe Puppet::FileServing::TerminusSelector do
         | 
| 6 | 
            -
               | 
| 7 | 
            -
                 | 
| 8 | 
            -
             | 
| 6 | 
            +
              class TestSelector
         | 
| 7 | 
            +
                include Puppet::FileServing::TerminusSelector
         | 
| 8 | 
            +
              end
         | 
| 9 9 |  | 
| 10 | 
            -
             | 
| 10 | 
            +
              def create_request(key)
         | 
| 11 | 
            +
                Puppet::Indirector::Request.new(:indirection_name, :find, key, nil, {node: 'whatever'})
         | 
| 11 12 | 
             
              end
         | 
| 12 13 |  | 
| 14 | 
            +
              subject { TestSelector.new }
         | 
| 15 | 
            +
             | 
| 13 16 | 
             
              describe "when being used to select termini" do
         | 
| 14 17 | 
             
                it "should return :file if the request key is fully qualified" do
         | 
| 15 | 
            -
                   | 
| 16 | 
            -
             | 
| 18 | 
            +
                  request = create_request(File.expand_path('/foo'))
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                  expect(subject.select(request)).to eq(:file)
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                it "should return :file_server if the request key is relative" do
         | 
| 24 | 
            +
                  request = create_request('modules/my_module/path/to_file')
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                  expect(subject.select(request)).to eq(:file_server)
         | 
| 17 27 | 
             
                end
         | 
| 18 28 |  | 
| 19 29 | 
             
                it "should return :file if the URI protocol is set to 'file'" do
         | 
| 20 | 
            -
                   | 
| 21 | 
            -
             | 
| 30 | 
            +
                  request = create_request(Puppet::Util.path_to_uri(File.expand_path("/foo")).to_s)
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                  expect(subject.select(request)).to eq(:file)
         | 
| 22 33 | 
             
                end
         | 
| 23 34 |  | 
| 24 35 | 
             
                it "should return :http if the URI protocol is set to 'http'" do
         | 
| 25 | 
            -
                   | 
| 26 | 
            -
             | 
| 36 | 
            +
                  request = create_request("http://www.example.com")
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                  expect(subject.select(request)).to eq(:http)
         | 
| 27 39 | 
             
                end
         | 
| 28 40 |  | 
| 29 41 | 
             
                it "should return :http if the URI protocol is set to 'https'" do
         | 
| 30 | 
            -
                   | 
| 31 | 
            -
             | 
| 42 | 
            +
                  request = create_request("https://www.example.com")
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                  expect(subject.select(request)).to eq(:http)
         | 
| 45 | 
            +
                end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                it "should return :http if the path starts with a double slash" do
         | 
| 48 | 
            +
                  request = create_request("https://www.example.com//index.html")
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                  expect(subject.select(request)).to eq(:http)
         | 
| 32 51 | 
             
                end
         | 
| 33 52 |  | 
| 34 53 | 
             
                it "should fail when a protocol other than :puppet, :http(s) or :file is used" do
         | 
| 35 | 
            -
                   | 
| 36 | 
            -
             | 
| 54 | 
            +
                  request = create_request("ftp://ftp.example.com")
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                  expect {
         | 
| 57 | 
            +
                    subject.select(request)
         | 
| 58 | 
            +
                  }.to raise_error(ArgumentError, /URI protocol 'ftp' is not currently supported for file serving/)
         | 
| 37 59 | 
             
                end
         | 
| 38 60 |  | 
| 39 61 | 
             
                describe "and the protocol is 'puppet'" do
         | 
| 40 | 
            -
                  before do
         | 
| 41 | 
            -
                    allow(@request).to receive(:protocol).and_return("puppet")
         | 
| 42 | 
            -
                  end
         | 
| 43 | 
            -
             | 
| 44 62 | 
             
                  it "should choose :rest when a server is specified" do
         | 
| 45 | 
            -
                     | 
| 46 | 
            -
             | 
| 47 | 
            -
                    expect( | 
| 63 | 
            +
                    request = create_request("puppet://puppetserver.example.com")
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                    expect(subject.select(request)).to eq(:rest)
         | 
| 48 66 | 
             
                  end
         | 
| 49 67 |  | 
| 50 68 | 
             
                  # This is so a given file location works when bootstrapping with no server.
         | 
| 51 69 | 
             
                  it "should choose :rest when default_file_terminus is rest" do
         | 
| 52 | 
            -
                    allow(@request).to receive(:protocol).and_return("puppet")
         | 
| 53 70 | 
             
                    Puppet[:server] = 'localhost'
         | 
| 54 | 
            -
                     | 
| 71 | 
            +
                    request = create_request("puppet:///plugins")
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                    expect(subject.select(request)).to eq(:rest)
         | 
| 55 74 | 
             
                  end
         | 
| 56 75 |  | 
| 57 76 | 
             
                  it "should choose :file_server when default_file_terminus is file_server and no server is specified on the request" do
         | 
| 58 | 
            -
                    expect(@request).to receive(:protocol).and_return("puppet")
         | 
| 59 | 
            -
                    expect(@request).to receive(:server).and_return(nil)
         | 
| 60 77 | 
             
                    Puppet[:default_file_terminus] = 'file_server'
         | 
| 61 | 
            -
                     | 
| 78 | 
            +
                    request = create_request("puppet:///plugins")
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                    expect(subject.select(request)).to eq(:file_server)
         | 
| 62 81 | 
             
                  end
         | 
| 63 82 | 
             
                end
         | 
| 64 83 | 
             
              end
         | 
| @@ -1,6 +1,8 @@ | |
| 1 1 | 
             
            require 'spec_helper'
         | 
| 2 2 |  | 
| 3 3 | 
             
            describe Puppet::FileSystem::Uniquefile do
         | 
| 4 | 
            +
              include PuppetSpec::Files
         | 
| 5 | 
            +
             | 
| 4 6 | 
             
              it "makes the name of the file available" do
         | 
| 5 7 | 
             
                Puppet::FileSystem::Uniquefile.open_tmp('foo') do |file|
         | 
| 6 8 | 
             
                  expect(file.path).to match(/foo/)
         | 
| @@ -73,6 +75,33 @@ describe Puppet::FileSystem::Uniquefile do | |
| 73 75 | 
             
                Puppet::FileSystem::Uniquefile.open_tmp('foo') { |tmp| }
         | 
| 74 76 | 
             
              end
         | 
| 75 77 |  | 
| 78 | 
            +
              it "reports when a parent directory does not exist" do
         | 
| 79 | 
            +
                dir = tmpdir('uniquefile')
         | 
| 80 | 
            +
                lock = File.join(dir, 'path', 'to', 'lock')
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                expect {
         | 
| 83 | 
            +
                  Puppet::FileSystem::Uniquefile.open_tmp(lock) { |tmp| }
         | 
| 84 | 
            +
                }.to raise_error(Errno::ENOENT, %r{No such file or directory - A directory component in .* does not exist or is a dangling symbolic link})
         | 
| 85 | 
            +
              end
         | 
| 86 | 
            +
             | 
| 87 | 
            +
              it "should use UTF8 characters in TMP,TEMP,TMPDIR environment variable", :if => Puppet::Util::Platform.windows? do
         | 
| 88 | 
            +
                rune_utf8 = "\u16A0\u16C7\u16BB\u16EB\u16D2\u16E6\u16A6\u16EB\u16A0\u16B1\u16A9\u16A0\u16A2\u16B1\u16EB\u16A0\u16C1\u16B1\u16AA\u16EB\u16B7\u16D6\u16BB\u16B9\u16E6\u16DA\u16B3\u16A2\u16D7"
         | 
| 89 | 
            +
                temp_rune_utf8 = File.join(Dir.tmpdir, rune_utf8)
         | 
| 90 | 
            +
                Puppet::FileSystem.mkpath(temp_rune_utf8)
         | 
| 91 | 
            +
             | 
| 92 | 
            +
                # Set the temporary environment variables to the UTF8 temp path
         | 
| 93 | 
            +
                Puppet::Util::Windows::Process.set_environment_variable('TMPDIR', temp_rune_utf8)
         | 
| 94 | 
            +
                Puppet::Util::Windows::Process.set_environment_variable('TMP', temp_rune_utf8)
         | 
| 95 | 
            +
                Puppet::Util::Windows::Process.set_environment_variable('TEMP', temp_rune_utf8)
         | 
| 96 | 
            +
             | 
| 97 | 
            +
                # Create a unique file
         | 
| 98 | 
            +
                filename = Puppet::FileSystem::Uniquefile.open_tmp('foo') do |file|
         | 
| 99 | 
            +
                  File.dirname(file.path)
         | 
| 100 | 
            +
                end
         | 
| 101 | 
            +
             | 
| 102 | 
            +
                expect(filename).to eq(temp_rune_utf8)
         | 
| 103 | 
            +
              end
         | 
| 104 | 
            +
             | 
| 76 105 | 
             
              context "Ruby 1.9.3 Tempfile tests" do
         | 
| 77 106 | 
             
                # the remaining tests in this file are ported directly from the ruby 1.9.3 source,
         | 
| 78 107 | 
             
                # since most of this file was ported from there
         | 
| @@ -970,6 +970,16 @@ describe "Puppet::FileSystem" do | |
| 970 970 | 
             
                      mode = Puppet::FileSystem.stat(dest).mode
         | 
| 971 971 | 
             
                      expect(mode & 07777).to eq(0400)
         | 
| 972 972 | 
             
                    end
         | 
| 973 | 
            +
             | 
| 974 | 
            +
                    it 'preserves file ownership' do
         | 
| 975 | 
            +
                      allow(Puppet::FileSystem).to receive(:lstat)
         | 
| 976 | 
            +
                        .with(Puppet::FileSystem.pathname(dest))
         | 
| 977 | 
            +
                        .and_return(double(uid: 1, gid: 2))
         | 
| 978 | 
            +
             | 
| 979 | 
            +
                      expect(FileUtils).to receive(:chown).with(1, 2, /#{dest}/)
         | 
| 980 | 
            +
             | 
| 981 | 
            +
                      Puppet::FileSystem.replace_file(dest, 0644) { |f| f.write(content) }
         | 
| 982 | 
            +
                    end
         | 
| 973 983 | 
             
                  end
         | 
| 974 984 |  | 
| 975 985 | 
             
                  context 'on windows', if: Puppet::Util::Platform.windows? do
         | 
| @@ -3082,6 +3082,19 @@ describe "The lookup function" do | |
| 3082 3082 |  | 
| 3083 3083 | 
             
                  let(:env_data) { data_files }
         | 
| 3084 3084 |  | 
| 3085 | 
            +
                  context 'with unencryptable eyaml' do
         | 
| 3086 | 
            +
                    let(:data_files) do
         | 
| 3087 | 
            +
                      {
         | 
| 3088 | 
            +
                        'common.eyaml' => <<-YAML.unindent
         | 
| 3089 | 
            +
                          key_with_invalid_eyaml: ENC[PKCS7,INVALID]
         | 
| 3090 | 
            +
                          YAML
         | 
| 3091 | 
            +
                      }
         | 
| 3092 | 
            +
                    end
         | 
| 3093 | 
            +
             | 
| 3094 | 
            +
                    it 'fails and reports error with ENC value, key being looked up and filename' do
         | 
| 3095 | 
            +
                      expect { lookup('key_with_invalid_eyaml') }.to raise_error(Puppet::DataBinding::LookupError, /hiera-eyaml backend error decrypting ENC\[PKCS7,INVALID\] when looking up key_with_invalid_eyaml in .*common\.eyaml\. Error was/)
         | 
| 3096 | 
            +
                    end
         | 
| 3097 | 
            +
                  end
         | 
| 3085 3098 | 
             
                  context 'and a module using eyaml with different options' do
         | 
| 3086 3099 |  | 
| 3087 3100 | 
             
                    let(:private_module_key) do
         | 
| @@ -1,10 +1,11 @@ | |
| 1 1 | 
             
            require 'spec_helper'
         | 
| 2 | 
            -
            require 'webmock/rspec'
         | 
| 3 2 | 
             
            require 'puppet/http'
         | 
| 4 3 |  | 
| 5 4 | 
             
            describe Puppet::HTTP::Client do
         | 
| 6 5 | 
             
              let(:uri) { URI.parse('https://www.example.com') }
         | 
| 7 | 
            -
              let(: | 
| 6 | 
            +
              let(:puppet_context) { Puppet::SSL::SSLContext.new }
         | 
| 7 | 
            +
              let(:system_context) { Puppet::SSL::SSLContext.new }
         | 
| 8 | 
            +
              let(:client) { described_class.new(ssl_context: puppet_context, system_ssl_context: system_context) }
         | 
| 8 9 | 
             
              let(:credentials) { ['user', 'pass'] }
         | 
| 9 10 |  | 
| 10 11 | 
             
              it 'creates unique sessions' do
         | 
| @@ -45,6 +46,46 @@ describe Puppet::HTTP::Client do | |
| 45 46 | 
             
                    client.connect(uri)
         | 
| 46 47 | 
             
                  }.to raise_error(Puppet::HTTP::ConnectionError, %r{^Request to https://www.example.com timed out connect operation after .* seconds})
         | 
| 47 48 | 
             
                end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                it 'connects using the default ssl context' do
         | 
| 51 | 
            +
                  expect(client.pool).to receive(:with_connection) do |_, verifier|
         | 
| 52 | 
            +
                    expect(verifier.ssl_context).to equal(puppet_context)
         | 
| 53 | 
            +
                  end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                  client.connect(uri)
         | 
| 56 | 
            +
                end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                it 'connects using a specified ssl context' do
         | 
| 59 | 
            +
                  other_context = Puppet::SSL::SSLContext.new
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                  expect(client.pool).to receive(:with_connection) do |_, verifier|
         | 
| 62 | 
            +
                    expect(verifier.ssl_context).to equal(other_context)
         | 
| 63 | 
            +
                  end
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                  client.connect(uri, options: {ssl_context: other_context})
         | 
| 66 | 
            +
                end
         | 
| 67 | 
            +
             | 
| 68 | 
            +
                it 'connects using the system store' do
         | 
| 69 | 
            +
                  expect(client.pool).to receive(:with_connection) do |_, verifier|
         | 
| 70 | 
            +
                    expect(verifier.ssl_context).to equal(system_context)
         | 
| 71 | 
            +
                  end
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                  client.connect(uri, options: {include_system_store: true})
         | 
| 74 | 
            +
                end
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                it 'does not create a verifier for HTTP connections' do
         | 
| 77 | 
            +
                  expect(client.pool).to receive(:with_connection) do |_, verifier|
         | 
| 78 | 
            +
                    expect(verifier).to be_nil
         | 
| 79 | 
            +
                  end
         | 
| 80 | 
            +
             | 
| 81 | 
            +
                  client.connect(URI.parse('http://www.example.com'))
         | 
| 82 | 
            +
                end
         | 
| 83 | 
            +
             | 
| 84 | 
            +
                it 'raises an HTTPError if both are specified' do
         | 
| 85 | 
            +
                  expect {
         | 
| 86 | 
            +
                    client.connect(uri, options: {ssl_context: puppet_context, include_system_store: true})
         | 
| 87 | 
            +
                  }.to raise_error(Puppet::HTTP::HTTPError, /The ssl_context and include_system_store parameters are mutually exclusive/)
         | 
| 88 | 
            +
                end
         | 
| 48 89 | 
             
              end
         | 
| 49 90 |  | 
| 50 91 | 
             
              context 'after connecting' do
         | 
| @@ -75,10 +116,8 @@ describe Puppet::HTTP::Client do | |
| 75 116 |  | 
| 76 117 | 
             
              context "when closing" do
         | 
| 77 118 | 
             
                it "closes all connections in the pool" do
         | 
| 78 | 
            -
                  pool  | 
| 79 | 
            -
                  expect(pool).to receive(:close)
         | 
| 119 | 
            +
                  expect(client.pool).to receive(:close)
         | 
| 80 120 |  | 
| 81 | 
            -
                  client = described_class.new(pool: pool)
         | 
| 82 121 | 
             
                  client.close
         | 
| 83 122 | 
             
                end
         | 
| 84 123 | 
             
              end
         | 
| @@ -138,6 +177,28 @@ describe Puppet::HTTP::Client do | |
| 138 177 |  | 
| 139 178 | 
             
                  expect(io.string).to eq("abc")
         | 
| 140 179 | 
             
                end
         | 
| 180 | 
            +
             | 
| 181 | 
            +
                context 'when connecting' do
         | 
| 182 | 
            +
                  it 'uses a specified ssl context' do
         | 
| 183 | 
            +
                    stub_request(:get, uri).to_return(body: "abc")
         | 
| 184 | 
            +
             | 
| 185 | 
            +
                    other_context = Puppet::SSL::SSLContext.new
         | 
| 186 | 
            +
             | 
| 187 | 
            +
                    client.get(uri, options: {ssl_context: other_context})
         | 
| 188 | 
            +
                  end
         | 
| 189 | 
            +
             | 
| 190 | 
            +
                  it 'uses the system store' do
         | 
| 191 | 
            +
                    stub_request(:get, uri).to_return(body: "abc")
         | 
| 192 | 
            +
             | 
| 193 | 
            +
                    client.get(uri, options: {include_system_store: true})
         | 
| 194 | 
            +
                  end
         | 
| 195 | 
            +
             | 
| 196 | 
            +
                  it 'raises an HTTPError if both are specified' do
         | 
| 197 | 
            +
                    expect {
         | 
| 198 | 
            +
                      client.get(uri, options: {ssl_context: puppet_context, include_system_store: true})
         | 
| 199 | 
            +
                    }.to raise_error(Puppet::HTTP::HTTPError, /The ssl_context and include_system_store parameters are mutually exclusive/)
         | 
| 200 | 
            +
                  end
         | 
| 201 | 
            +
                end
         | 
| 141 202 | 
             
              end
         | 
| 142 203 |  | 
| 143 204 | 
             
              context "for HEAD requests" do
         | 
| @@ -173,6 +234,28 @@ describe Puppet::HTTP::Client do | |
| 173 234 |  | 
| 174 235 | 
             
                  expect(client.head(uri).body).to eq("abc")
         | 
| 175 236 | 
             
                end
         | 
| 237 | 
            +
             | 
| 238 | 
            +
                context 'when connecting' do
         | 
| 239 | 
            +
                  it 'uses a specified ssl context' do
         | 
| 240 | 
            +
                    stub_request(:head, uri)
         | 
| 241 | 
            +
             | 
| 242 | 
            +
                    other_context = Puppet::SSL::SSLContext.new
         | 
| 243 | 
            +
             | 
| 244 | 
            +
                    client.head(uri, options: {ssl_context: other_context})
         | 
| 245 | 
            +
                  end
         | 
| 246 | 
            +
             | 
| 247 | 
            +
                  it 'uses the system store' do
         | 
| 248 | 
            +
                    stub_request(:head, uri)
         | 
| 249 | 
            +
             | 
| 250 | 
            +
                    client.head(uri, options: {include_system_store: true})
         | 
| 251 | 
            +
                  end
         | 
| 252 | 
            +
             | 
| 253 | 
            +
                  it 'raises an HTTPError if both are specified' do
         | 
| 254 | 
            +
                    expect {
         | 
| 255 | 
            +
                      client.head(uri, options: {ssl_context: puppet_context, include_system_store: true})
         | 
| 256 | 
            +
                    }.to raise_error(Puppet::HTTP::HTTPError, /The ssl_context and include_system_store parameters are mutually exclusive/)
         | 
| 257 | 
            +
                  end
         | 
| 258 | 
            +
                end
         | 
| 176 259 | 
             
              end
         | 
| 177 260 |  | 
| 178 261 | 
             
              context "for PUT requests" do
         | 
| @@ -182,25 +265,25 @@ describe Puppet::HTTP::Client do | |
| 182 265 | 
             
                    expect(request.headers).to_not include('X-Puppet-Profiling')
         | 
| 183 266 | 
             
                  end
         | 
| 184 267 |  | 
| 185 | 
            -
                  client.put(uri,  | 
| 268 | 
            +
                  client.put(uri, "", headers: {'Content-Type' => 'text/plain'})
         | 
| 186 269 | 
             
                end
         | 
| 187 270 |  | 
| 188 271 | 
             
                it "stringifies keys and encodes values in the query" do
         | 
| 189 272 | 
             
                  stub_request(:put, "https://www.example.com").with(query: "foo=bar%3Dbaz")
         | 
| 190 273 |  | 
| 191 | 
            -
                  client.put(uri, params: {:foo => "bar=baz"},  | 
| 274 | 
            +
                  client.put(uri, "", params: {:foo => "bar=baz"}, headers: {'Content-Type' => 'text/plain'})
         | 
| 192 275 | 
             
                end
         | 
| 193 276 |  | 
| 194 277 | 
             
                it "includes custom headers" do
         | 
| 195 278 | 
             
                  stub_request(:put, "https://www.example.com").with(headers: { 'X-Foo' => 'Bar' })
         | 
| 196 279 |  | 
| 197 | 
            -
                  client.put(uri, headers: {'X-Foo' => 'Bar' | 
| 280 | 
            +
                  client.put(uri, "", headers: {'X-Foo' => 'Bar', 'Content-Type' => 'text/plain'})
         | 
| 198 281 | 
             
                end
         | 
| 199 282 |  | 
| 200 283 | 
             
                it "returns the response" do
         | 
| 201 284 | 
             
                  stub_request(:put, uri)
         | 
| 202 285 |  | 
| 203 | 
            -
                  response = client.put(uri,  | 
| 286 | 
            +
                  response = client.put(uri, "", headers: {'Content-Type' => 'text/plain'})
         | 
| 204 287 | 
             
                  expect(response).to be_an_instance_of(Puppet::HTTP::Response)
         | 
| 205 288 | 
             
                  expect(response).to be_success
         | 
| 206 289 | 
             
                  expect(response.code).to eq(200)
         | 
| @@ -209,7 +292,41 @@ describe Puppet::HTTP::Client do | |
| 209 292 | 
             
                it "sets content-length and content-type for the body" do
         | 
| 210 293 | 
             
                  stub_request(:put, uri).with(headers: {"Content-Length" => "5", "Content-Type" => "text/plain"})
         | 
| 211 294 |  | 
| 212 | 
            -
                  client.put(uri,  | 
| 295 | 
            +
                  client.put(uri, "hello", headers: {'Content-Type' => 'text/plain'})
         | 
| 296 | 
            +
                end
         | 
| 297 | 
            +
             | 
| 298 | 
            +
                 it 'raises an ArgumentError if `body` is missing' do
         | 
| 299 | 
            +
                   expect {
         | 
| 300 | 
            +
                     client.put(uri, nil, headers: {'Content-Type' => 'text/plain'})
         | 
| 301 | 
            +
                   }.to raise_error(ArgumentError, /'put' requires a string 'body' argument/)
         | 
| 302 | 
            +
                 end
         | 
| 303 | 
            +
             | 
| 304 | 
            +
                 it 'raises an ArgumentError if `content_type` is missing from the headers hash' do
         | 
| 305 | 
            +
                   expect {
         | 
| 306 | 
            +
                     client.put(uri, '')
         | 
| 307 | 
            +
                   }.to raise_error(ArgumentError, /'put' requires a 'content-type' header/)
         | 
| 308 | 
            +
                 end
         | 
| 309 | 
            +
             | 
| 310 | 
            +
                context 'when connecting' do
         | 
| 311 | 
            +
                  it 'uses a specified ssl context' do
         | 
| 312 | 
            +
                    stub_request(:put, uri)
         | 
| 313 | 
            +
             | 
| 314 | 
            +
                    other_context = Puppet::SSL::SSLContext.new
         | 
| 315 | 
            +
             | 
| 316 | 
            +
                    client.put(uri, "", headers: {'Content-Type' => 'text/plain'}, options: {ssl_context: other_context})
         | 
| 317 | 
            +
                  end
         | 
| 318 | 
            +
             | 
| 319 | 
            +
                  it 'uses the system store' do
         | 
| 320 | 
            +
                    stub_request(:put, uri)
         | 
| 321 | 
            +
             | 
| 322 | 
            +
                    client.put(uri, "", headers: {'Content-Type' => 'text/plain'}, options: {include_system_store: true})
         | 
| 323 | 
            +
                  end
         | 
| 324 | 
            +
             | 
| 325 | 
            +
                  it 'raises an HTTPError if both are specified' do
         | 
| 326 | 
            +
                    expect {
         | 
| 327 | 
            +
                      client.put(uri, "", headers: {'Content-Type' => 'text/plain'}, options: {ssl_context: puppet_context, include_system_store: true})
         | 
| 328 | 
            +
                    }.to raise_error(Puppet::HTTP::HTTPError, /The ssl_context and include_system_store parameters are mutually exclusive/)
         | 
| 329 | 
            +
                  end
         | 
| 213 330 | 
             
                end
         | 
| 214 331 | 
             
              end
         | 
| 215 332 |  | 
| @@ -217,25 +334,25 @@ describe Puppet::HTTP::Client do | |
| 217 334 | 
             
                it "includes default HTTP headers" do
         | 
| 218 335 | 
             
                  stub_request(:post, uri).with(headers: {'X-Puppet-Version' => /./, 'User-Agent' => /./})
         | 
| 219 336 |  | 
| 220 | 
            -
                  client.post(uri,  | 
| 337 | 
            +
                  client.post(uri, "", headers: {'Content-Type' => 'text/plain'})
         | 
| 221 338 | 
             
                end
         | 
| 222 339 |  | 
| 223 340 | 
             
                it "stringifies keys and encodes values in the query" do
         | 
| 224 341 | 
             
                  stub_request(:post, "https://www.example.com").with(query: "foo=bar%3Dbaz")
         | 
| 225 342 |  | 
| 226 | 
            -
                  client.post(uri, params: {:foo => "bar=baz"},  | 
| 343 | 
            +
                  client.post(uri, "", params: {:foo => "bar=baz"}, headers: {'Content-Type' => 'text/plain'})
         | 
| 227 344 | 
             
                end
         | 
| 228 345 |  | 
| 229 346 | 
             
                it "includes custom headers" do
         | 
| 230 347 | 
             
                  stub_request(:post, "https://www.example.com").with(headers: { 'X-Foo' => 'Bar' })
         | 
| 231 348 |  | 
| 232 | 
            -
                  client.post(uri, headers: {'X-Foo' => 'Bar' | 
| 349 | 
            +
                  client.post(uri, "", headers: {'X-Foo' => 'Bar', 'Content-Type' => 'text/plain'})
         | 
| 233 350 | 
             
                end
         | 
| 234 351 |  | 
| 235 352 | 
             
                it "returns the response" do
         | 
| 236 353 | 
             
                  stub_request(:post, uri)
         | 
| 237 354 |  | 
| 238 | 
            -
                  response = client.post(uri,  | 
| 355 | 
            +
                  response = client.post(uri, "", headers: {'Content-Type' => 'text/plain'})
         | 
| 239 356 | 
             
                  expect(response).to be_an_instance_of(Puppet::HTTP::Response)
         | 
| 240 357 | 
             
                  expect(response).to be_success
         | 
| 241 358 | 
             
                  expect(response.code).to eq(200)
         | 
| @@ -244,14 +361,14 @@ describe Puppet::HTTP::Client do | |
| 244 361 | 
             
                it "sets content-length and content-type for the body" do
         | 
| 245 362 | 
             
                  stub_request(:post, uri).with(headers: {"Content-Length" => "5", "Content-Type" => "text/plain"})
         | 
| 246 363 |  | 
| 247 | 
            -
                  client.post(uri,  | 
| 364 | 
            +
                  client.post(uri, "hello", headers: {'Content-Type' => 'text/plain'})
         | 
| 248 365 | 
             
                end
         | 
| 249 366 |  | 
| 250 367 | 
             
                it "streams the response body when a block is given" do
         | 
| 251 368 | 
             
                  stub_request(:post, uri).to_return(body: "abc")
         | 
| 252 369 |  | 
| 253 370 | 
             
                  io = StringIO.new
         | 
| 254 | 
            -
                  client.post(uri,  | 
| 371 | 
            +
                  client.post(uri, "", headers: {'Content-Type' => 'text/plain'}) do |response|
         | 
| 255 372 | 
             
                    response.read_body do |data|
         | 
| 256 373 | 
             
                      io.write(data)
         | 
| 257 374 | 
             
                    end
         | 
| @@ -259,6 +376,40 @@ describe Puppet::HTTP::Client do | |
| 259 376 |  | 
| 260 377 | 
             
                  expect(io.string).to eq("abc")
         | 
| 261 378 | 
             
                end
         | 
| 379 | 
            +
             | 
| 380 | 
            +
                it 'raises an ArgumentError if `body` is missing' do
         | 
| 381 | 
            +
                  expect {
         | 
| 382 | 
            +
                    client.post(uri, nil, headers: {'Content-Type' => 'text/plain'})
         | 
| 383 | 
            +
                  }.to raise_error(ArgumentError, /'post' requires a string 'body' argument/)
         | 
| 384 | 
            +
                end
         | 
| 385 | 
            +
             | 
| 386 | 
            +
                it 'raises an ArgumentError if `content_type` is missing from the headers hash' do
         | 
| 387 | 
            +
                  expect {
         | 
| 388 | 
            +
                    client.post(uri, "")
         | 
| 389 | 
            +
                  }.to raise_error(ArgumentError, /'post' requires a 'content-type' header/)
         | 
| 390 | 
            +
                end
         | 
| 391 | 
            +
             | 
| 392 | 
            +
                context 'when connecting' do
         | 
| 393 | 
            +
                  it 'uses a specified ssl context' do
         | 
| 394 | 
            +
                    stub_request(:post, uri)
         | 
| 395 | 
            +
             | 
| 396 | 
            +
                    other_context = Puppet::SSL::SSLContext.new
         | 
| 397 | 
            +
             | 
| 398 | 
            +
                    client.post(uri, "", headers: {'Content-Type' => 'text/plain'}, options: {body: "", ssl_context: other_context})
         | 
| 399 | 
            +
                  end
         | 
| 400 | 
            +
             | 
| 401 | 
            +
                  it 'uses the system store' do
         | 
| 402 | 
            +
                    stub_request(:post, uri)
         | 
| 403 | 
            +
             | 
| 404 | 
            +
                    client.post(uri, "", headers: {'Content-Type' => 'text/plain'}, options: {include_system_store: true})
         | 
| 405 | 
            +
                  end
         | 
| 406 | 
            +
             | 
| 407 | 
            +
                  it 'raises an HTTPError if both are specified' do
         | 
| 408 | 
            +
                    expect {
         | 
| 409 | 
            +
                      client.post(uri, "", headers: {'Content-Type' => 'text/plain'}, options: {ssl_context: puppet_context, include_system_store: true})
         | 
| 410 | 
            +
                    }.to raise_error(Puppet::HTTP::HTTPError, /The ssl_context and include_system_store parameters are mutually exclusive/)
         | 
| 411 | 
            +
                  end
         | 
| 412 | 
            +
                end
         | 
| 262 413 | 
             
              end
         | 
| 263 414 |  | 
| 264 415 | 
             
              context "for DELETE requests" do
         | 
| @@ -294,44 +445,80 @@ describe Puppet::HTTP::Client do | |
| 294 445 |  | 
| 295 446 | 
             
                  expect(client.delete(uri).body).to eq("abc")
         | 
| 296 447 | 
             
                end
         | 
| 448 | 
            +
             | 
| 449 | 
            +
                context 'when connecting' do
         | 
| 450 | 
            +
                  it 'uses a specified ssl context' do
         | 
| 451 | 
            +
                    stub_request(:delete, uri)
         | 
| 452 | 
            +
             | 
| 453 | 
            +
                    other_context = Puppet::SSL::SSLContext.new
         | 
| 454 | 
            +
             | 
| 455 | 
            +
                    client.delete(uri, options: {ssl_context: other_context})
         | 
| 456 | 
            +
                  end
         | 
| 457 | 
            +
             | 
| 458 | 
            +
                  it 'uses the system store' do
         | 
| 459 | 
            +
                    stub_request(:delete, uri)
         | 
| 460 | 
            +
             | 
| 461 | 
            +
                    client.delete(uri, options: {include_system_store: true})
         | 
| 462 | 
            +
                  end
         | 
| 463 | 
            +
             | 
| 464 | 
            +
                  it 'raises an HTTPError if both are specified' do
         | 
| 465 | 
            +
                    expect {
         | 
| 466 | 
            +
                      client.delete(uri, options: {ssl_context: puppet_context, include_system_store: true})
         | 
| 467 | 
            +
                    }.to raise_error(Puppet::HTTP::HTTPError, /The ssl_context and include_system_store parameters are mutually exclusive/)
         | 
| 468 | 
            +
                  end
         | 
| 469 | 
            +
                end
         | 
| 297 470 | 
             
              end
         | 
| 298 471 |  | 
| 299 472 | 
             
              context "Basic Auth" do
         | 
| 300 473 | 
             
                it "submits credentials for GET requests" do
         | 
| 301 474 | 
             
                  stub_request(:get, uri).with(basic_auth: credentials)
         | 
| 302 475 |  | 
| 303 | 
            -
                  client.get(uri, user: 'user', password: 'pass')
         | 
| 476 | 
            +
                  client.get(uri, options: {basic_auth: {user: 'user', password: 'pass'}})
         | 
| 304 477 | 
             
                end
         | 
| 305 478 |  | 
| 306 479 | 
             
                it "submits credentials for PUT requests" do
         | 
| 307 480 | 
             
                  stub_request(:put, uri).with(basic_auth: credentials)
         | 
| 308 481 |  | 
| 309 | 
            -
                  client.put(uri,  | 
| 482 | 
            +
                  client.put(uri, "hello", headers: {'Content-Type' => 'text/plain'}, options: {basic_auth: {user: 'user', password: 'pass'}})
         | 
| 310 483 | 
             
                end
         | 
| 311 484 |  | 
| 312 485 | 
             
                it "returns response containing access denied" do
         | 
| 313 486 | 
             
                  stub_request(:get, uri).with(basic_auth: credentials).to_return(status: [403, "Ye Shall Not Pass"])
         | 
| 314 487 |  | 
| 315 | 
            -
                  response = client.get(uri, user: 'user', password: 'pass')
         | 
| 488 | 
            +
                  response = client.get(uri, options: {basic_auth: {user: 'user', password: 'pass'}})
         | 
| 316 489 | 
             
                  expect(response.code).to eq(403)
         | 
| 317 490 | 
             
                  expect(response.reason).to eq("Ye Shall Not Pass")
         | 
| 318 491 | 
             
                  expect(response).to_not be_success
         | 
| 319 492 | 
             
                end
         | 
| 320 493 |  | 
| 321 | 
            -
                it ' | 
| 494 | 
            +
                it 'includes basic auth if user is nil' do
         | 
| 322 495 | 
             
                  stub_request(:get, uri).with do |req|
         | 
| 323 | 
            -
                    expect(req.headers). | 
| 496 | 
            +
                    expect(req.headers).to include('Authorization')
         | 
| 324 497 | 
             
                  end
         | 
| 325 498 |  | 
| 326 | 
            -
                  client.get(uri, user: nil, password: 'pass')
         | 
| 499 | 
            +
                  client.get(uri, options: {basic_auth: {user: nil, password: 'pass'}})
         | 
| 327 500 | 
             
                end
         | 
| 328 501 |  | 
| 329 | 
            -
                it ' | 
| 502 | 
            +
                it 'includes basic auth if password is nil' do
         | 
| 330 503 | 
             
                  stub_request(:get, uri).with do |req|
         | 
| 331 | 
            -
                    expect(req.headers). | 
| 504 | 
            +
                    expect(req.headers).to include('Authorization')
         | 
| 332 505 | 
             
                  end
         | 
| 333 506 |  | 
| 334 | 
            -
                  client.get(uri, user: 'user', password: nil)
         | 
| 507 | 
            +
                  client.get(uri, options: {basic_auth: {user: 'user', password: nil}})
         | 
| 508 | 
            +
                end
         | 
| 509 | 
            +
             | 
| 510 | 
            +
                it 'observes userinfo in the URL' do
         | 
| 511 | 
            +
                  stub_request(:get, uri).with(basic_auth: credentials)
         | 
| 512 | 
            +
             | 
| 513 | 
            +
                  client.get(URI("https://user:pass@www.example.com"))
         | 
| 514 | 
            +
                end
         | 
| 515 | 
            +
             | 
| 516 | 
            +
                it 'prefers explicit basic_auth credentials' do
         | 
| 517 | 
            +
                  uri = URI("https://ignored_user:ignored_pass@www.example.com")
         | 
| 518 | 
            +
             | 
| 519 | 
            +
                  stub_request(:get, "https://www.example.com").with(basic_auth: credentials)
         | 
| 520 | 
            +
             | 
| 521 | 
            +
                  client.get(uri, options: {basic_auth: {user: 'user', password: 'pass'}})
         | 
| 335 522 | 
             
                end
         | 
| 336 523 | 
             
              end
         | 
| 337 524 |  | 
| @@ -357,14 +544,45 @@ describe Puppet::HTTP::Client do | |
| 357 544 | 
             
                  stub_request(:put, start_url).to_return(redirect_to(url: bar_url))
         | 
| 358 545 | 
             
                  stub_request(:put, bar_url).to_return(status: 200)
         | 
| 359 546 |  | 
| 360 | 
            -
                  response = client.put(start_url,  | 
| 547 | 
            +
                  response = client.put(start_url, "", headers: {'Content-Type' => 'text/plain'})
         | 
| 548 | 
            +
                  expect(response).to be_success
         | 
| 549 | 
            +
                end
         | 
| 550 | 
            +
             | 
| 551 | 
            +
                it "updates the Host header from the Location host and port" do
         | 
| 552 | 
            +
                  stub_request(:get, start_url).with(headers: { 'Host' => 'www.example.com:8140' })
         | 
| 553 | 
            +
                    .to_return(redirect_to(url: other_host))
         | 
| 554 | 
            +
                  stub_request(:get, other_host).with(headers: { 'Host' => 'other.example.com:8140' })
         | 
| 555 | 
            +
                    .to_return(status: 200)
         | 
| 556 | 
            +
             | 
| 557 | 
            +
                  response = client.get(start_url)
         | 
| 558 | 
            +
                  expect(response).to be_success
         | 
| 559 | 
            +
                end
         | 
| 560 | 
            +
             | 
| 561 | 
            +
                it "omits the default HTTPS port from the Host header" do
         | 
| 562 | 
            +
                  stub_request(:get, start_url).with(headers: { 'Host' => 'www.example.com:8140' })
         | 
| 563 | 
            +
                    .to_return(redirect_to(url: "https://other.example.com/qux"))
         | 
| 564 | 
            +
                  stub_request(:get, "https://other.example.com/qux").with(headers: { 'Host' => 'other.example.com' })
         | 
| 565 | 
            +
                    .to_return(status: 200)
         | 
| 566 | 
            +
             | 
| 567 | 
            +
                  response = client.get(start_url)
         | 
| 568 | 
            +
                  expect(response).to be_success
         | 
| 569 | 
            +
                end
         | 
| 570 | 
            +
             | 
| 571 | 
            +
                it "omits the default HTTP port from the Host header" do
         | 
| 572 | 
            +
                  stub_request(:get, start_url).with(headers: { 'Host' => 'www.example.com:8140' })
         | 
| 573 | 
            +
                    .to_return(redirect_to(url: "http://other.example.com/qux"))
         | 
| 574 | 
            +
                  stub_request(:get, "http://other.example.com/qux").with(headers: { 'Host' => 'other.example.com' })
         | 
| 575 | 
            +
                    .to_return(status: 200)
         | 
| 576 | 
            +
             | 
| 577 | 
            +
                  response = client.get(start_url)
         | 
| 361 578 | 
             
                  expect(response).to be_success
         | 
| 362 579 | 
             
                end
         | 
| 363 580 |  | 
| 364 | 
            -
                it " | 
| 365 | 
            -
                  query = { ' | 
| 366 | 
            -
             | 
| 367 | 
            -
                  stub_request(:get,  | 
| 581 | 
            +
                it "applies query parameters from the location header" do
         | 
| 582 | 
            +
                  query = { 'redirected' => false }
         | 
| 583 | 
            +
             | 
| 584 | 
            +
                  stub_request(:get, start_url).with(query: query).to_return(redirect_to(url: "#{bar_url}?redirected=true"))
         | 
| 585 | 
            +
                  stub_request(:get, bar_url).with(query: {'redirected' => 'true'}).to_return(status: 200)
         | 
| 368 586 |  | 
| 369 587 | 
             
                  response = client.get(start_url, params: query)
         | 
| 370 588 | 
             
                  expect(response).to be_success
         | 
| @@ -383,7 +601,7 @@ describe Puppet::HTTP::Client do | |
| 383 601 | 
             
                  stub_request(:get, start_url).with(basic_auth: credentials).to_return(redirect_to(url: bar_url))
         | 
| 384 602 | 
             
                  stub_request(:get, bar_url).with(basic_auth: credentials).to_return(status: 200)
         | 
| 385 603 |  | 
| 386 | 
            -
                  client.get(start_url, user: 'user', password: 'pass')
         | 
| 604 | 
            +
                  client.get(start_url, options: {basic_auth: {user: 'user', password: 'pass'}})
         | 
| 387 605 | 
             
                end
         | 
| 388 606 |  | 
| 389 607 | 
             
                it "redirects given a relative location" do
         | 
| @@ -395,22 +613,33 @@ describe Puppet::HTTP::Client do | |
| 395 613 | 
             
                  expect(response).to be_success
         | 
| 396 614 | 
             
                end
         | 
| 397 615 |  | 
| 398 | 
            -
                it " | 
| 616 | 
            +
                it "applies query parameters from the location header" do
         | 
| 399 617 | 
             
                  relative_url = "/people.html"
         | 
| 400 | 
            -
                  query = { ' | 
| 401 | 
            -
                  stub_request(:get, start_url).with(query: query).to_return(redirect_to(url: relative_url))
         | 
| 402 | 
            -
                  stub_request(:get, "https://www.example.com:8140/people.html").with(query:  | 
| 618 | 
            +
                  query = { 'redirected' => false }
         | 
| 619 | 
            +
                  stub_request(:get, start_url).with(query: query).to_return(redirect_to(url: "#{relative_url}?redirected=true"))
         | 
| 620 | 
            +
                  stub_request(:get, "https://www.example.com:8140/people.html").with(query: {'redirected' => 'true'}).to_return(status: 200)
         | 
| 403 621 |  | 
| 404 622 | 
             
                  response = client.get(start_url, params: query)
         | 
| 405 623 | 
             
                  expect(response).to be_success
         | 
| 406 624 | 
             
                end
         | 
| 407 625 |  | 
| 626 | 
            +
                it "removes dot segments from a relative location" do
         | 
| 627 | 
            +
                  # from https://tools.ietf.org/html/rfc3986#section-5.4.2
         | 
| 628 | 
            +
                  base_url = URI("http://a/b/c/d;p?q")
         | 
| 629 | 
            +
                  relative_url = "../../../../g"
         | 
| 630 | 
            +
                  stub_request(:get, base_url).to_return(redirect_to(url: relative_url))
         | 
| 631 | 
            +
                  stub_request(:get, "http://a/g").to_return(status: 200)
         | 
| 632 | 
            +
             | 
| 633 | 
            +
                  response = client.get(base_url)
         | 
| 634 | 
            +
                  expect(response).to be_success
         | 
| 635 | 
            +
                end
         | 
| 636 | 
            +
             | 
| 408 637 | 
             
                it "preserves request body for each request" do
         | 
| 409 638 | 
             
                  data = 'some data'
         | 
| 410 639 | 
             
                  stub_request(:put, start_url).with(body: data).to_return(redirect_to(url: bar_url))
         | 
| 411 640 | 
             
                  stub_request(:put, bar_url).with(body: data).to_return(status: 200)
         | 
| 412 641 |  | 
| 413 | 
            -
                  response = client.put(start_url,  | 
| 642 | 
            +
                  response = client.put(start_url, data, headers: {'Content-Type' => 'text/plain'})
         | 
| 414 643 | 
             
                  expect(response).to be_success
         | 
| 415 644 | 
             
                end
         | 
| 416 645 |  | 
| @@ -539,6 +768,32 @@ describe Puppet::HTTP::Client do | |
| 539 768 | 
             
                  }.to raise_error(Puppet::HTTP::ProtocolError, /Failed to parse Retry-After header 'foo' as an integer or RFC 2822 date/)
         | 
| 540 769 | 
             
                end
         | 
| 541 770 |  | 
| 771 | 
            +
                it "should close the connection before sleeping" do
         | 
| 772 | 
            +
                  retry_after('42')
         | 
| 773 | 
            +
             | 
| 774 | 
            +
                  site = Puppet::Network::HTTP::Site.from_uri(uri)
         | 
| 775 | 
            +
             | 
| 776 | 
            +
                  http1 = Net::HTTP.new(site.host, site.port)
         | 
| 777 | 
            +
                  http1.use_ssl = true
         | 
| 778 | 
            +
                  allow(http1).to receive(:started?).and_return(true)
         | 
| 779 | 
            +
             | 
| 780 | 
            +
                  http2 = Net::HTTP.new(site.host, site.port)
         | 
| 781 | 
            +
                  http2.use_ssl = true
         | 
| 782 | 
            +
                  allow(http2).to receive(:started?).and_return(true)
         | 
| 783 | 
            +
             | 
| 784 | 
            +
             | 
| 785 | 
            +
                  pool = Puppet::Network::HTTP::Pool.new(15)
         | 
| 786 | 
            +
                  client = Puppet::HTTP::Client.new(pool: pool)
         | 
| 787 | 
            +
             | 
| 788 | 
            +
                  # The "with_connection" method is required to yield started connections
         | 
| 789 | 
            +
                  allow(pool).to receive(:with_connection).and_yield(http1).and_yield(http2)
         | 
| 790 | 
            +
             | 
| 791 | 
            +
                  expect(http1).to receive(:finish).ordered
         | 
| 792 | 
            +
                  expect(::Kernel).to receive(:sleep).with(42).ordered
         | 
| 793 | 
            +
             | 
| 794 | 
            +
                  client.get(uri)
         | 
| 795 | 
            +
                end
         | 
| 796 | 
            +
             | 
| 542 797 | 
             
                it "should sleep and retry if Retry-After is an Integer" do
         | 
| 543 798 | 
             
                  retry_after('42')
         | 
| 544 799 |  | 
| @@ -575,4 +830,34 @@ describe Puppet::HTTP::Client do | |
| 575 830 | 
             
                  client.get(uri)
         | 
| 576 831 | 
             
                end
         | 
| 577 832 | 
             
              end
         | 
| 833 | 
            +
             | 
| 834 | 
            +
              context "persistent connections" do
         | 
| 835 | 
            +
                before :each do
         | 
| 836 | 
            +
                  stub_request(:get, uri)
         | 
| 837 | 
            +
                end
         | 
| 838 | 
            +
             | 
| 839 | 
            +
                it 'defaults keepalive to http_keepalive_timeout' do
         | 
| 840 | 
            +
                  expect(client.pool.keepalive_timeout).to eq(Puppet[:http_keepalive_timeout])
         | 
| 841 | 
            +
                end
         | 
| 842 | 
            +
             | 
| 843 | 
            +
                it 'reuses a cached connection' do
         | 
| 844 | 
            +
                  allow(Puppet).to receive(:debug)
         | 
| 845 | 
            +
                  expect(Puppet).to receive(:debug).with(/^Creating new connection/)
         | 
| 846 | 
            +
                  expect(Puppet).to receive(:debug).with(/^Using cached connection/)
         | 
| 847 | 
            +
             | 
| 848 | 
            +
                  client.get(uri)
         | 
| 849 | 
            +
                  client.get(uri)
         | 
| 850 | 
            +
                end
         | 
| 851 | 
            +
             | 
| 852 | 
            +
                it 'can be disabled' do
         | 
| 853 | 
            +
                  Puppet[:http_keepalive_timeout] = 0
         | 
| 854 | 
            +
             | 
| 855 | 
            +
                  allow(Puppet).to receive(:debug)
         | 
| 856 | 
            +
                  expect(Puppet).to receive(:debug).with(/^Creating new connection/).twice
         | 
| 857 | 
            +
                  expect(Puppet).to receive(:debug).with(/^Using cached connection/).never
         | 
| 858 | 
            +
             | 
| 859 | 
            +
                  client.get(uri)
         | 
| 860 | 
            +
                  client.get(uri)
         | 
| 861 | 
            +
                end
         | 
| 862 | 
            +
              end
         | 
| 578 863 | 
             
            end
         |