From be8c9b19baeb4daf6bf2e603673714c7536b657c Mon Sep 17 00:00:00 2001 From: IsJn-227 Date: Fri, 13 Jun 2025 15:52:46 +0530 Subject: [PATCH] Fixed #36456 -- Improved content type negotiation in technical 500 error response. --- django/views/debug.py | 5 +++-- tests/view_tests/tests/test_debug.py | 16 ++++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/django/views/debug.py b/django/views/debug.py index 948cdcbf2f..9d8d1987de 100644 --- a/django/views/debug.py +++ b/django/views/debug.py @@ -65,9 +65,10 @@ def technical_500_response(request, exc_type, exc_value, tb, status_code=500): the values returned from sys.exc_info() and friends. """ reporter = get_exception_reporter_class(request)(request, exc_type, exc_value, tb) - if request.accepts("text/html"): + preferred_type = request.get_preferred_type(["text/html", "text/plain"]) + if preferred_type == "text/html": html = reporter.get_traceback_html() - return HttpResponse(html, status=status_code) + return HttpResponse(html, status=status_code, content_type="text/html") else: text = reporter.get_traceback_text() return HttpResponse( diff --git a/tests/view_tests/tests/test_debug.py b/tests/view_tests/tests/test_debug.py index a5a1d85e83..f5cb82cd2d 100644 --- a/tests/view_tests/tests/test_debug.py +++ b/tests/view_tests/tests/test_debug.py @@ -261,6 +261,22 @@ class DebugViewTests(SimpleTestCase): status_code=500, ) + def test_technical_500_content_type_negotiation(self): + for accepts, content_type in [ + ("text/plain", "text/plain; charset=utf-8"), + ("text/html", "text/html"), + ("text/html,text/plain;q=0.9", "text/html"), + ("text/plain,text/html;q=0.9", "text/plain; charset=utf-8"), + ("text/*", "text/html"), + ]: + with self.subTest(accepts=accepts): + with self.assertLogs("django.request", "ERROR"): + response = self.client.get( + "/raises500/", headers={"accept": accepts} + ) + self.assertEqual(response.status_code, 500) + self.assertEqual(response["Content-Type"], content_type) + def test_classbased_technical_500(self): with self.assertLogs("django.request", "ERROR"): response = self.client.get("/classbased500/")