Skip to content

Commit 828dca1

Browse files
committed
Fix #1621: Do not crash when encountering unexpected data in the request
1 parent 99d4884 commit 828dca1

File tree

3 files changed

+26
-8
lines changed

3 files changed

+26
-8
lines changed

debug_toolbar/panels/request.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ def nav_subtitle(self):
2626
def generate_stats(self, request, response):
2727
self.record_stats(
2828
{
29-
"get": get_sorted_request_variable(request.GET),
30-
"post": get_sorted_request_variable(request.POST),
31-
"cookies": get_sorted_request_variable(request.COOKIES),
29+
"get": get_sorted_request_variable(request.GET, source="GET"),
30+
"post": get_sorted_request_variable(request.POST, source="POST"),
31+
"cookies": get_sorted_request_variable(request.COOKIES, source="COOKIES"),
3232
}
3333
)
3434

debug_toolbar/utils.py

+8-5
Original file line numberDiff line numberDiff line change
@@ -229,14 +229,17 @@ def getframeinfo(frame, context=1):
229229
return (filename, lineno, frame.f_code.co_name, lines, index)
230230

231231

232-
def get_sorted_request_variable(variable):
232+
def get_sorted_request_variable(variable, *, source):
233233
"""
234234
Get a sorted list of variables from the request data.
235235
"""
236-
if isinstance(variable, dict):
237-
return [(k, variable.get(k)) for k in sorted(variable)]
238-
else:
239-
return [(k, variable.getlist(k)) for k in sorted(variable)]
236+
try:
237+
if isinstance(variable, dict):
238+
return [(k, variable.get(k)) for k in sorted(variable)]
239+
else:
240+
return [(k, variable.getlist(k)) for k in sorted(variable)]
241+
except TypeError:
242+
return [(f"<{source}>", variable)]
240243

241244

242245
def get_stack(context=1):

tests/panels/test_request.py

+15
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,21 @@ def test_dict_for_request_in_method_post(self):
8585
self.assertIn("foo", content)
8686
self.assertIn("bar", content)
8787

88+
def test_list_for_request_in_method_post(self):
89+
"""
90+
Verify that the toolbar doesn't crash if request.POST contains unexpected data.
91+
92+
See https://github.com/jazzband/django-debug-toolbar/issues/1621
93+
"""
94+
self.request.POST = [{"a": 1}, {"b": 2}]
95+
response = self.panel.process_request(self.request)
96+
self.panel.generate_stats(self.request, response)
97+
# ensure the panel POST request data is processed correctly.
98+
content = self.panel.content
99+
print(content)
100+
# self.assertIn("foo", content)
101+
# self.assertIn("bar", content)
102+
88103
def test_namespaced_url(self):
89104
self.request.path = "/admin/login/"
90105
response = self.panel.process_request(self.request)

0 commit comments

Comments
 (0)