From cd0bb36ff3cad3d097bf1217e2460f0c3d9a2411 Mon Sep 17 00:00:00 2001 From: Fabio Caccamo Date: Thu, 20 Feb 2020 17:15:14 +0100 Subject: [PATCH] Refactored Base64Serializer. --- benedict/serializers/base64.py | 83 ++++++++++++++++++++++------------ 1 file changed, 53 insertions(+), 30 deletions(-) diff --git a/benedict/serializers/base64.py b/benedict/serializers/base64.py index a8bbcdf..e048ac7 100644 --- a/benedict/serializers/base64.py +++ b/benedict/serializers/base64.py @@ -15,41 +15,64 @@ except ImportError: import base64 -class Base64Serializer(AbstractSerializer): +class Base64CoreSerializer(AbstractSerializer): - @staticmethod - def decode(s, **kwargs): + def __init__(self): + super(Base64CoreSerializer, self).__init__() + + def _fix_url_encoding_and_padding(self, s): # fix urlencoded chars s = unquote(s) # fix padding m = len(s) % 4 if m != 0: s += '=' * (4 - m) - data = base64.b64decode(s) - subformat = kwargs.pop('subformat', None) - encoding = kwargs.pop('encoding', 'utf-8' if subformat else None) - if encoding: - data = data.decode(encoding) - if subformat: - from benedict.serializers import get_serializer_by_format - serializer = get_serializer_by_format(subformat) - if serializer: - data = serializer.decode(data, **kwargs) - return data + return s - @staticmethod - def encode(d, **kwargs): - data = d - subformat = kwargs.pop('subformat', None) - encoding = kwargs.pop('encoding', 'utf-8' if subformat else None) - if not type_util.is_string(data) and subformat: - from benedict.serializers import get_serializer_by_format - serializer = get_serializer_by_format(subformat) - if serializer: - data = serializer.encode(data, **kwargs) - if type_util.is_string(data) and encoding: - data = data.encode(encoding) - data = base64.b64encode(data) - if type_util.is_binary(data) and encoding: - data = data.decode(encoding) - return data + def decode(self, s, **kwargs): + value = self._fix_url_encoding_and_padding(s) + encoding = kwargs.pop('encoding', 'utf-8') + if encoding: + value = value.encode(encoding) + value = base64.b64decode(value) + if encoding and type_util.is_string(value): + return value.decode(encoding) + return value + + def encode(self, d, **kwargs): + value = d + encoding = kwargs.pop('encoding', 'utf-8') + if encoding and type_util.is_string(value): + value = value.encode(encoding) + value = base64.b64encode(value) + if encoding: + value = value.decode(encoding) + return value + + +class Base64Serializer(Base64CoreSerializer): + + def __init__(self): + super(Base64Serializer, self).__init__() + + def _pop_options(self, options): + encoding = options.pop('encoding', 'utf-8') + subformat = options.pop('subformat', None) + from benedict.serializers import get_serializer_by_format + serializer = get_serializer_by_format(subformat) + return (serializer, encoding, ) + + def decode(self, s, **kwargs): + serializer, encoding = self._pop_options(kwargs) + value = super(Base64Serializer, self).decode(s, encoding=encoding) + if serializer: + value = serializer.decode(value, **kwargs) + return value + + def encode(self, d, **kwargs): + serializer, encoding = self._pop_options(kwargs) + value = d + if serializer: + value = serializer.encode(value, **kwargs) + value = super(Base64Serializer, self).encode(value, encoding=encoding) + return value