| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 | import typing as _timport zlibfrom ._json import _CompactJSONfrom .encoding import base64_decodefrom .encoding import base64_encodefrom .exc import BadPayloadfrom .serializer import Serializerfrom .timed import TimedSerializerclass URLSafeSerializerMixin(Serializer):    """Mixed in with a regular serializer it will attempt to zlib    compress the string to make it shorter if necessary. It will also    base64 encode the string so that it can safely be placed in a URL.    """    default_serializer = _CompactJSON    def load_payload(        self,        payload: bytes,        *args: _t.Any,        serializer: _t.Optional[_t.Any] = None,        **kwargs: _t.Any,    ) -> _t.Any:        decompress = False        if payload.startswith(b"."):            payload = payload[1:]            decompress = True        try:            json = base64_decode(payload)        except Exception as e:            raise BadPayload(                "Could not base64 decode the payload because of an exception",                original_error=e,            ) from e        if decompress:            try:                json = zlib.decompress(json)            except Exception as e:                raise BadPayload(                    "Could not zlib decompress the payload before decoding the payload",                    original_error=e,                ) from e        return super().load_payload(json, *args, **kwargs)    def dump_payload(self, obj: _t.Any) -> bytes:        json = super().dump_payload(obj)        is_compressed = False        compressed = zlib.compress(json)        if len(compressed) < (len(json) - 1):            json = compressed            is_compressed = True        base64d = base64_encode(json)        if is_compressed:            base64d = b"." + base64d        return base64dclass URLSafeSerializer(URLSafeSerializerMixin, Serializer):    """Works like :class:`.Serializer` but dumps and loads into a URL    safe string consisting of the upper and lowercase character of the    alphabet as well as ``'_'``, ``'-'`` and ``'.'``.    """class URLSafeTimedSerializer(URLSafeSerializerMixin, TimedSerializer):    """Works like :class:`.TimedSerializer` but dumps and loads into a    URL safe string consisting of the upper and lowercase character of    the alphabet as well as ``'_'``, ``'-'`` and ``'.'``.    """
 |