From 4ab1cc646f113bd1f2eada48fa4506d7882fa6e0 Mon Sep 17 00:00:00 2001 From: Kenneth Daily Date: Fri, 31 Jan 2025 12:13:31 -0800 Subject: [PATCH] Add configuration to disable host prefix injection This change deviates from the upstream `botocore` to add the ability to disable jost prefix injection. It changes the default for `inject_host_prefix` in the Config object to be `None` (from `True`) so that the value can be determined using the configuration precedence. The fallback if the value remains `True` if it is set to `None` to preserve the CLI default behavior. --- .../feature-configuration-42674.json | 5 ++++ awscli/botocore/args.py | 21 ++++++++++++++- awscli/botocore/config.py | 2 +- awscli/botocore/configprovider.py | 7 +++++ tests/unit/botocore/test_args.py | 26 +++++++++++++++++++ 5 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 .changes/next-release/feature-configuration-42674.json diff --git a/.changes/next-release/feature-configuration-42674.json b/.changes/next-release/feature-configuration-42674.json new file mode 100644 index 000000000000..5388a5e98cef --- /dev/null +++ b/.changes/next-release/feature-configuration-42674.json @@ -0,0 +1,5 @@ +{ + "type": "feature", + "category": "configuration", + "description": "Configure if the host prefix is prepended to the request URL in the shared configuration file or via an environment variable" +} diff --git a/awscli/botocore/args.py b/awscli/botocore/args.py index 3d025d7bb78e..c468170f0217 100644 --- a/awscli/botocore/args.py +++ b/awscli/botocore/args.py @@ -212,7 +212,6 @@ def compute_client_args(self, service_model, client_config, proxies_config=client_config.proxies_config, retries=client_config.retries, client_cert=client_config.client_cert, - inject_host_prefix=client_config.inject_host_prefix, request_min_compression_size_bytes=( client_config.request_min_compression_size_bytes ), @@ -236,6 +235,8 @@ def compute_client_args(self, service_model, client_config, self._compute_user_agent_appid_config(config_kwargs) self._compute_sigv4a_signing_region_set_config(config_kwargs) self._compute_checksum_config(config_kwargs) + self._compute_inject_host_prefix(client_config, config_kwargs) + s3_config = self.compute_s3_config(client_config) is_s3_service = self._is_s3_service(service_name) @@ -256,6 +257,24 @@ def compute_client_args(self, service_model, client_config, 'socket_options': self._compute_socket_options(scoped_config) } + def _compute_inject_host_prefix(self, client_config, config_kwargs): + if client_config is not None and client_config.inject_host_prefix is not None: + config_kwargs['inject_host_prefix'] = ( + client_config.inject_host_prefix + ) + else: + configured_disable_host_prefix_injection = ( + self._config_store.get_config_variable( + 'disable_host_prefix_injection' + ) + ) + if configured_disable_host_prefix_injection is not None: + config_kwargs[ + 'inject_host_prefix' + ] = not configured_disable_host_prefix_injection + else: + config_kwargs['inject_host_prefix'] = True + def _compute_configured_endpoint_url(self, client_config, endpoint_url): if endpoint_url is not None: return endpoint_url diff --git a/awscli/botocore/config.py b/awscli/botocore/config.py index 8f361f69b88d..864e21be6cff 100644 --- a/awscli/botocore/config.py +++ b/awscli/botocore/config.py @@ -241,7 +241,7 @@ class Config(object): ('s3', None), ('retries', None), ('client_cert', None), - ('inject_host_prefix', True), + ('inject_host_prefix', None), ('endpoint_discovery_enabled', None), ('use_dualstack_endpoint', None), ('use_fips_endpoint', None), diff --git a/awscli/botocore/configprovider.py b/awscli/botocore/configprovider.py index 86fea6bd1cdc..f08fbdb6faef 100644 --- a/awscli/botocore/configprovider.py +++ b/awscli/botocore/configprovider.py @@ -149,7 +149,14 @@ "when_supported", None, ), + 'disable_host_prefix_injection': ( + 'disable_host_prefix_injection', + 'AWS_DISABLE_HOST_PREFIX_INJECTION', + None, + utils.ensure_boolean, + ), } + # A mapping for the s3 specific configuration vars. These are the configuration # vars that typically go in the s3 section of the config file. This mapping # follows the same schema as the previous session variable mapping. diff --git a/tests/unit/botocore/test_args.py b/tests/unit/botocore/test_args.py index f6bcdcca9354..00fe3fa92549 100644 --- a/tests/unit/botocore/test_args.py +++ b/tests/unit/botocore/test_args.py @@ -521,6 +521,32 @@ def test_response_checksum_validation_invalid_client_config(self): with self.assertRaises(exceptions.InvalidChecksumConfigError): self.call_get_client_args() + def test_disable_host_prefix_injection_default_client_config(self): + input_config = Config() + client_args = self.call_get_client_args(client_config=input_config) + config = client_args["client_config"] + self.assertEqual(config.inject_host_prefix, True) + + def test_disable_host_prefix_injection_config_store(self): + self.config_store.set_config_variable( + "disable_host_prefix_injection", + True, + ) + config = self.call_get_client_args()['client_config'] + self.assertEqual(config.inject_host_prefix, False) + + def test_disable_host_prefix_injection_client_config_overrides_config_store( + self, + ): + self.config_store.set_config_variable( + "disable_host_prefix_injection", + True, + ) + input_config = Config(inject_host_prefix=False) + client_args = self.call_get_client_args(client_config=input_config) + config = client_args['client_config'] + self.assertEqual(config.inject_host_prefix, False) + class TestEndpointResolverBuiltins(unittest.TestCase): def setUp(self):