django-commons / django-debug-toolbar

A configurable set of panels that display various debug information about the current request/response.
https://django-debug-toolbar.readthedocs.io
BSD 3-Clause "New" or "Revised" License
8.08k stars 1.05k forks source link

Crash on non-text views #1959

Closed nijel closed 3 months ago

nijel commented 3 months ago

On view that generates a PNG image, django-debug-toolbar alert panel crashes:

Traceback (most recent call last):
  File "/home/nijel/weblate/weblate/.venv/lib/python3.11/site-packages/django/core/handlers/exception.py", line 55, in inner
    response = get_response(request)
               ^^^^^^^^^^^^^^^^^^^^^
  File "/home/nijel/weblate/weblate/.venv/lib/python3.11/site-packages/sentry_sdk/integrations/django/middleware.py", line 169, in __call__
    return f(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^
  File "/home/nijel/weblate/weblate/.venv/lib/python3.11/site-packages/debug_toolbar/middleware.py", line 94, in __call__
    panel.generate_stats(request, response)
  File "/home/nijel/weblate/weblate/.venv/lib/python3.11/site-packages/debug_toolbar/panels/alerts.py", line 146, in generate_stats
    html_content = response.content.decode(response.charset)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x89 in position 0: invalid start byte

The response is <HttpResponse status_code=200, "image/png"> and doesn't have charset set. In this case charset property falls back to the default, what happens to be 'utf-8'.

I think it should check response.headers["Content-Type"] if the response is something what makes sense to decode before doing so here:

https://github.com/jazzband/django-debug-toolbar/blob/9bcd6cac17fd1721d60c2b1b8218884caf0ee45e/debug_toolbar/panels/alerts.py#L145