# Buggy code
def _unpack(self, payload, sep=str_to_bytes("\x00\x01")):
    raw_payload = b64decode(ensure_bytes(payload))
    first_sep = raw_payload.find(sep)

    signer = raw_payload[:first_sep]
    signer_cert = self._cert_store[signer]

    sig_len = signer_cert._cert.get_pubkey().bits() >> 3
    signature = raw_payload[first_sep + len(sep) : first_sep + len(sep) + sig_len]
    end_of_sig = first_sep + len(sep) + sig_len + len(sep)

    v = raw_payload[end_of_sig:].split(sep)

    return {
        "signer": signer,
        "signature": signature,
        "content_type": bytes_to_str(v[0]),
        "content_encoding": bytes_to_str(v[1]),
        "body": bytes_to_str(v[2]),
    }


# Traceback (kombu.exceptions.ContentDisallowed)
[2018-09-10 02:33:07,446: CRITICAL/MainProcess] Unrecoverable error: ContentDisallowed('Refusing to deserialize disabled content of type json (application/json)',)
Traceback (most recent call last):
File "/usr/lib/python3.6/site-packages/celery/worker/worker.py", line 205, in start
self.blueprint.start(self)
File "/usr/lib/python3.6/site-packages/celery/bootsteps.py", line 119, in start
step.start(parent)
File "/usr/lib/python3.6/site-packages/celery/bootsteps.py", line 369, in start
return self.obj.start()
File "/usr/lib/python3.6/site-packages/celery/worker/consumer/consumer.py", line 317, in start
blueprint.start(self)
File "/usr/lib/python3.6/site-packages/celery/bootsteps.py", line 119, in start
step.start(parent)
File "/usr/lib/python3.6/site-packages/celery/worker/consumer/consumer.py", line 593, in start
c.loop(*c.loop_args())
File "/usr/lib/python3.6/site-packages/celery/worker/loops.py", line 91, in asynloop
next(loop)
File "/usr/lib/python3.6/site-packages/kombu/asynchronous/hub.py", line 354, in create_loop
cb(*cbargs)
File "/usr/lib/python3.6/site-packages/kombu/transport/redis.py", line 1040, in on_readable
self.cycle.on_readable(fileno)
File "/usr/lib/python3.6/site-packages/kombu/transport/redis.py", line 337, in on_readable
chan.handlers[type]()
File "/usr/lib/python3.6/site-packages/kombu/transport/redis.py", line 667, in _receive
ret.append(self._receive_one(c))
File "/usr/lib/python3.6/site-packages/kombu/transport/redis.py", line 697, in _receive_one
message, self._fanout_to_queue[exchange])
File "/usr/lib/python3.6/site-packages/kombu/transport/virtual/base.py", line 983, in _deliver
callback(message)
File "/usr/lib/python3.6/site-packages/kombu/transport/virtual/base.py", line 633, in _callback
return callback(message)
File "/usr/lib/python3.6/site-packages/kombu/messaging.py", line 624, in _receive_callback
return on_m(message) if on_m else self.receive(decoded, message)
File "/usr/lib/python3.6/site-packages/celery/worker/consumer/gossip.py", line 201, in on_message
_, event = prepare(message.payload)
File "/usr/lib/python3.6/site-packages/kombu/message.py", line 207, in payload
return self._decoded_cache if self._decoded_cache else self.decode()
File "/usr/lib/python3.6/site-packages/kombu/message.py", line 192, in decode
self._decoded_cache = self._decode()
File "/usr/lib/python3.6/site-packages/kombu/message.py", line 197, in _decode
self.content_encoding, accept=self.accept)
File "/usr/lib/python3.6/site-packages/kombu/serialization.py", line 256, in loads
raise self._for_untrusted_content(content_type, 'disabled')
kombu.exceptions.ContentDisallowed: Refusing to deserialize disabled content of type json (application/json)

# Fixed code
def _unpack(self, payload, sep=str_to_bytes("\x00\x01")):
    raw_payload = b64decode(ensure_bytes(payload))
    first_sep = raw_payload.find(sep)

    signer = raw_payload[:first_sep]
    signer_cert = self._cert_store[signer]

    # shift 3 bits right to get signature length
    # 2048bit rsa key has a signature length of 256
    # 4096bit rsa key has a signature length of 512
    sig_len = signer_cert.get_pubkey().key_size >> 3
    sep_len = len(sep)
    signature_start_position = first_sep + sep_len
    signature_end_position = signature_start_position + sig_len
    signature = raw_payload[signature_start_position:signature_end_position]

    v = raw_payload[signature_end_position + sep_len :].split(sep)

    return {
        "signer": signer,
        "signature": signature,
        "content_type": bytes_to_str(v[0]),
        "content_encoding": bytes_to_str(v[1]),
        "body": bytes_to_str(v[2]),
    }