From 218a50fc05924daffdf179faa170829c1bc6ec11 Mon Sep 17 00:00:00 2001 From: enlorik Date: Mon, 29 Jun 2026 02:27:13 +0200 Subject: [PATCH] Fix AttributeError in fix_route53_ids when Route53 ID parameter is not a string --- .../next-release/bugfix-Route53-3033.json | 5 ++++ botocore/handlers.py | 2 +- tests/unit/test_handlers.py | 23 +++++++++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 .changes/next-release/bugfix-Route53-3033.json diff --git a/.changes/next-release/bugfix-Route53-3033.json b/.changes/next-release/bugfix-Route53-3033.json new file mode 100644 index 0000000000..37b778bd4c --- /dev/null +++ b/.changes/next-release/bugfix-Route53-3033.json @@ -0,0 +1,5 @@ +{ + "type": "bugfix", + "category": "Route53", + "description": "Fixed AttributeError in fix_route53_ids when a Route53 resource ID parameter (e.g. HostedZoneId) is None. Non-string values are now passed through to normal parameter validation." +} diff --git a/botocore/handlers.py b/botocore/handlers.py index d0eec0a150..1258906c4b 100644 --- a/botocore/handlers.py +++ b/botocore/handlers.py @@ -694,7 +694,7 @@ def fix_route53_ids(params, model, **kwargs): ] for name in members: - if name in params: + if name in params and isinstance(params[name], str): orig_value = params[name] params[name] = orig_value.split('/')[-1] logger.debug('%s %s -> %s', name, orig_value, params[name]) diff --git a/tests/unit/test_handlers.py b/tests/unit/test_handlers.py index afe84dc85d..eac01643d0 100644 --- a/tests/unit/test_handlers.py +++ b/tests/unit/test_handlers.py @@ -585,6 +585,29 @@ def test_route53_resource_id_missing_input_shape(self): self.assertEqual(params['HostedZoneId'], '/hostedzone/ABC123') + def test_route53_resource_id_non_string_left_alone(self): + event = 'before-parameter-build.route53.GetHostedZone' + params = {'HostedZoneId': None} + operation_def = { + 'name': 'GetHostedZone', + 'input': {'shape': 'GetHostedZoneInput'}, + } + service_def = { + 'metadata': {}, + 'shapes': { + 'GetHostedZoneInput': { + 'type': 'structure', + 'members': { + 'HostedZoneId': {'shape': 'ResourceId'}, + }, + }, + 'ResourceId': {'type': 'string'}, + }, + } + model = OperationModel(operation_def, ServiceModel(service_def)) + self.session.emit(event, params=params, model=model) + self.assertIsNone(params['HostedZoneId']) + def test_run_instances_userdata(self): user_data = 'This is a test' b64_user_data = base64.b64encode(user_data.encode('latin-1')).decode(