Refactored Base64Serializer.
This commit is contained in:
parent
a503cd365f
commit
cd0bb36ff3
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue