Refactored Base64Serializer.

This commit is contained in:
Fabio Caccamo 2020-02-20 17:15:14 +01:00
parent a503cd365f
commit cd0bb36ff3
1 changed files with 53 additions and 30 deletions

View File

@ -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