diff options
author | Ilya Etingof <etingof@gmail.com> | 2017-09-13 01:10:42 +0200 |
---|---|---|
committer | Ilya Etingof <etingof@gmail.com> | 2017-09-13 01:10:42 +0200 |
commit | c40b8c22c9679e017871617d7cf558b1b7f0ff84 (patch) | |
tree | ea0c3a608294cb740c2a9e6b15f776143c8f2c27 /pyasn1/codec | |
parent | 789a4e2f4f921fdac37f28df557319b89df3050c (diff) | |
download | pyasn1-git-c40b8c22c9679e017871617d7cf558b1b7f0ff84.tar.gz |
refactored OpenType() into a mutable object
Diffstat (limited to 'pyasn1/codec')
-rw-r--r-- | pyasn1/codec/ber/decoder.py | 101 |
1 files changed, 61 insertions, 40 deletions
diff --git a/pyasn1/codec/ber/decoder.py b/pyasn1/codec/ber/decoder.py index 8aac8c9..4a1ef01 100644 --- a/pyasn1/codec/ber/decoder.py +++ b/pyasn1/codec/ber/decoder.py @@ -511,35 +511,45 @@ class UniversalConstructedTypeDecoder(AbstractConstructedDecoder): seenIndices.add(idx) idx += 1 - if namedTypes and options.get('decodeOpenTypes', False): + if namedTypes: if not namedTypes.requiredComponents.issubset(seenIndices): raise error.PyAsn1Error('ASN.1 object %s has uninitialized components' % asn1Object.__class__.__name__) + if namedTypes.hasOpenTypes: - for idx, namedType in enumerate(namedTypes.namedTypes): - if not namedType.openType: - continue + openTypes = options.get('openTypes', {}) - governingValue = asn1Object.getComponentByName( - namedType.openType.name - ) + if openTypes or options.get('decodeOpenTypes', False): - try: - asn1Spec = namedType.openType[governingValue] + for idx, namedType in enumerate(namedTypes.namedTypes): + if not namedType.openType: + continue - except KeyError: - continue + governingValue = asn1Object.getComponentByName( + namedType.openType.name + ) - component, rest = decodeFun( - asn1Object.getComponentByPosition(idx).asOctets(), - asn1Spec=asn1Spec - ) + try: + asn1Spec = openTypes[governingValue] - asn1Object.setComponentByPosition( - idx, component, - matchTags=False, - matchConstraints=False - ) + except KeyError: + + try: + asn1Spec = namedType.openType[governingValue] + + except KeyError: + continue + + component, rest = decodeFun( + asn1Object.getComponentByPosition(idx).asOctets(), + asn1Spec=asn1Spec + ) + + asn1Object.setComponentByPosition( + idx, component, + matchTags=False, + matchConstraints=False + ) else: asn1Object.verifySizeSpec() @@ -637,31 +647,42 @@ class UniversalConstructedTypeDecoder(AbstractConstructedDecoder): if not namedTypes.requiredComponents.issubset(seenIndices): raise error.PyAsn1Error('ASN.1 object %s has uninitialized components' % asn1Object.__class__.__name__) - for idx, namedType in enumerate(namedTypes.namedTypes): - if not namedType.openType: - continue + if namedTypes.hasOpenTypes: - governingValue = asn1Object.getComponentByName( - namedType.openType.name - ) + openTypes = options.get('openTypes', None) - try: - asn1Spec = namedType.openType[governingValue] + if openTypes or options.get('decodeOpenTypes', False): - except KeyError: - continue + for idx, namedType in enumerate(namedTypes.namedTypes): + if not namedType.openType: + continue - component, rest = decodeFun( - asn1Object.getComponentByPosition(idx).asOctets(), - asn1Spec=asn1Spec, allowEoo=True - ) + governingValue = asn1Object.getComponentByName( + namedType.openType.name + ) - if component is not eoo.endOfOctets: - asn1Object.setComponentByPosition( - idx, component, - matchTags=False, - matchConstraints=False - ) + try: + asn1Spec = openTypes[governingValue] + + except KeyError: + + try: + asn1Spec = namedType.openType[governingValue] + + except KeyError: + continue + + component, rest = decodeFun( + asn1Object.getComponentByPosition(idx).asOctets(), + asn1Spec=asn1Spec, allowEoo=True + ) + + if component is not eoo.endOfOctets: + asn1Object.setComponentByPosition( + idx, component, + matchTags=False, + matchConstraints=False + ) else: asn1Object.verifySizeSpec() |