diff --git a/CHANGELOG.md b/CHANGELOG.md index cb9e453..53bb57e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ * MetaProcessor.include_extra to add support for arbitrary extra values to be set on the meta record. +* Correctly handled quoted svcparams when parsing SVCB/HTTPS rdata text ## v1.9.1 - 2024-06-21 - What's in a name diff --git a/octodns/record/svcb.py b/octodns/record/svcb.py index c9927ab..399414c 100644 --- a/octodns/record/svcb.py +++ b/octodns/record/svcb.py @@ -102,6 +102,8 @@ def validate_svckey_number(paramkey): def parse_rdata_text_svcparamvalue_list(svcparamvalue): + if svcparamvalue.startswith('"'): + svcparamvalue = svcparamvalue[1:-1] return svcparamvalue.split(',') @@ -158,11 +160,15 @@ class SvcbValue(EqualityTupleMixin, dict): if paramkey in params.keys(): raise RrParseError(f'{paramkey} is specified twice') if len(paramvalue) != 0: - params[paramkey] = paramvalue[0] parse_rdata_text = SUPPORTED_PARAMS.get(paramkey, {}).get( 'parse_rdata_text', None ) - if parse_rdata_text is not None: + if parse_rdata_text is None: + v = paramvalue[0] + if v.startswith('"'): + v = v[1:-1] + params[paramkey] = v + else: params[paramkey] = parse_rdata_text(paramvalue[0]) else: params[paramkey] = None diff --git a/tests/test_octodns_record_svcb.py b/tests/test_octodns_record_svcb.py index 6566f16..2d8cecd 100644 --- a/tests/test_octodns_record_svcb.py +++ b/tests/test_octodns_record_svcb.py @@ -177,6 +177,13 @@ class TestRecordSvcb(TestCase): ) self.assertEqual(rdata, record.values[0].rdata_text) + # quoted params need to be correctly handled + rdata = '1 svcb.unit.tests. no-default-alpn port=8080 ipv4hint="192.0.2.2,192.0.2.53" key3333="foobar"' + record = SvcbRecord( + zone, 'svc', {'ttl': 32, 'value': SvcbValue.parse_rdata_text(rdata)} + ) + self.assertEqual(rdata.replace('"', ''), record.values[0].rdata_text) + def test_svcb_value(self): a = SvcbValue( {'svcpriority': 0, 'targetname': 'foo.', 'svcparams': dict()}