Browse Source

SVCB: sort rdata svcparams

pull/1176/head
Pieter Lexis 2 years ago
parent
commit
b19cf82d05
No known key found for this signature in database GPG Key ID: B6ED640F21BF69E3
2 changed files with 17 additions and 6 deletions
  1. +16
    -5
      octodns/record/svcb.py
  2. +1
    -1
      tests/test_octodns_record_svcb.py

+ 16
- 5
octodns/record/svcb.py View File

@ -105,27 +105,37 @@ def parse_rdata_text_svcparamvalue_list(svcparamvalue):
return svcparamvalue.split(',')
def svcparamkeysort(svcparamkey):
if svcparamkey.startswith('key'):
return int(svcparamkey[3:])
return SUPPORTED_PARAMS[svcparamkey]['key_num']
# cc https://datatracker.ietf.org/doc/html/rfc9460#keys
SUPPORTED_PARAMS = {
'no-default-alpn': {'has_arg': False},
'no-default-alpn': {'key_num': 2, 'has_arg': False},
'alpn': {
'key_num': 1,
'validate': validate_svcparam_alpn,
'parse_rdata_text': parse_rdata_text_svcparamvalue_list,
},
'port': {'validate': validate_svcparam_port},
'port': {'key_num': 3, 'validate': validate_svcparam_port},
'ipv4hint': {
'key_num': 4,
'validate': validate_svcparam_ipv4hint,
'parse_rdata_text': parse_rdata_text_svcparamvalue_list,
},
'ipv6hint': {
'key_num': 6,
'validate': validate_svcparam_ipv6hint,
'parse_rdata_text': parse_rdata_text_svcparamvalue_list,
},
'mandatory': {
'key_num': 0,
'validate': validate_svcparam_mandatory,
'parse_rdata_text': parse_rdata_text_svcparamvalue_list,
},
'ech': {'validate': validate_svcparam_ech},
'ech': {'key_num': 5, 'validate': validate_svcparam_ech},
}
@ -264,9 +274,10 @@ class SvcbValue(EqualityTupleMixin, dict):
@property
def rdata_text(self):
params = ''
# XXX: sort params by key number
for svcparamkey, svcparamvalue in self.svcparams.items():
sorted_svcparamkeys = sorted(self.svcparams, key=svcparamkeysort)
for svcparamkey in sorted_svcparamkeys:
params += f' {svcparamkey}'
svcparamvalue = self.svcparams.get(svcparamkey, None)
if svcparamvalue is not None:
if isinstance(svcparamvalue, list):
params += f'={",".join(svcparamvalue)}'


+ 1
- 1
tests/test_octodns_record_svcb.py View File

@ -164,7 +164,7 @@ class TestRecordSvcb(TestCase):
self.assertEqual({'port': '8080'}, a.values[0].svcparams)
# both directions should match
rdata = '1 svcb.unit.tests. port=8080 no-default-alpn ipv4hint=192.0.2.2,192.0.2.53'
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)}
)


Loading…
Cancel
Save