Skip to content

Commit e78ac8c

Browse files
authored
Merge pull request #1107 from dbowd/patch-1
Fix unicode error when trying to escape binary data
2 parents 52f9ac8 + efc9180 commit e78ac8c

File tree

2 files changed

+24
-2
lines changed

2 files changed

+24
-2
lines changed

debug_toolbar/panels/sql/tracking.py

+5-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from time import time
77

88
from django.utils import six
9-
from django.utils.encoding import force_text
9+
from django.utils.encoding import DjangoUnicodeDecodeError, force_text
1010

1111
from debug_toolbar import settings as dt_settings
1212
from debug_toolbar.utils import get_stack, get_template_info, tidy_stacktrace
@@ -88,7 +88,10 @@ def __init__(self, cursor, db, logger):
8888

8989
def _quote_expr(self, element):
9090
if isinstance(element, six.string_types):
91-
return "'%s'" % force_text(element).replace("'", "''")
91+
try:
92+
return "'%s'" % force_text(element).replace("'", "''")
93+
except DjangoUnicodeDecodeError:
94+
return repr(element)
9295
else:
9396
return repr(element)
9497

tests/panels/test_sql.py

+19
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,25 @@ def test_param_conversion(self):
113113
('["Foo", true, false]', "[10, 1]", '["2017-12-22 16:07:01"]'),
114114
)
115115

116+
@unittest.skipIf(
117+
connection.vendor in ("sqlite", "postgresql"),
118+
"Mixing bytestrings and text is not allowed on PostgreSQL and SQLite",
119+
)
120+
def test_binary_param_force_text(self):
121+
self.assertEqual(len(self.panel._queries), 0)
122+
123+
with connection.cursor() as cursor:
124+
cursor.execute("SELECT * FROM auth_user WHERE username = %s", [b"\xff"])
125+
126+
self.panel.process_response(self.request, self.response)
127+
self.panel.generate_stats(self.request, self.response)
128+
129+
self.assertEqual(len(self.panel._queries), 1)
130+
self.assertEqual(
131+
self.panel._queries[0][1]["sql"],
132+
"SELECT * FROM auth_user WHERE username = '\ufffd'",
133+
)
134+
116135
@unittest.skipUnless(connection.vendor != "sqlite", "Test invalid for SQLite")
117136
def test_raw_query_param_conversion(self):
118137
self.assertEqual(len(self.panel._queries), 0)

0 commit comments

Comments
 (0)