mirror of
https://github.com/django/django.git
synced 2025-08-21 17:29:13 +00:00
Fixed #36456 -- Improved content type negotiation in technical 500 error response.
This commit is contained in:
parent
449b9f9aee
commit
be8c9b19ba
@ -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.
|
the values returned from sys.exc_info() and friends.
|
||||||
"""
|
"""
|
||||||
reporter = get_exception_reporter_class(request)(request, exc_type, exc_value, tb)
|
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()
|
html = reporter.get_traceback_html()
|
||||||
return HttpResponse(html, status=status_code)
|
return HttpResponse(html, status=status_code, content_type="text/html")
|
||||||
else:
|
else:
|
||||||
text = reporter.get_traceback_text()
|
text = reporter.get_traceback_text()
|
||||||
return HttpResponse(
|
return HttpResponse(
|
||||||
|
@ -261,6 +261,22 @@ class DebugViewTests(SimpleTestCase):
|
|||||||
status_code=500,
|
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):
|
def test_classbased_technical_500(self):
|
||||||
with self.assertLogs("django.request", "ERROR"):
|
with self.assertLogs("django.request", "ERROR"):
|
||||||
response = self.client.get("/classbased500/")
|
response = self.client.get("/classbased500/")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user