Fixed #12302: Modified force_unicode to avoid raising unicode errors when
handed exceptions with non-ASCII bytestring data and no working unicode method under Python 2.6 and higher. git-svn-id: http://code.djangoproject.com/svn/django/trunk@12621 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
68f216a692
commit
9e95d6f604
|
@ -89,7 +89,16 @@ def force_unicode(s, encoding='utf-8', strings_only=False, errors='strict'):
|
||||||
# SafeUnicode at the end.
|
# SafeUnicode at the end.
|
||||||
s = s.decode(encoding, errors)
|
s = s.decode(encoding, errors)
|
||||||
except UnicodeDecodeError, e:
|
except UnicodeDecodeError, e:
|
||||||
|
if not isinstance(s, Exception):
|
||||||
raise DjangoUnicodeDecodeError(s, *e.args)
|
raise DjangoUnicodeDecodeError(s, *e.args)
|
||||||
|
else:
|
||||||
|
# If we get to here, the caller has passed in an Exception
|
||||||
|
# subclass populated with non-ASCII bytestring data without a
|
||||||
|
# working unicode method. Try to handle this without raising a
|
||||||
|
# further exception by individually forcing the exception args
|
||||||
|
# to unicode.
|
||||||
|
s = ' '.join([force_unicode(arg, encoding, strings_only,
|
||||||
|
errors) for arg in s])
|
||||||
return s
|
return s
|
||||||
|
|
||||||
def smart_str(s, encoding='utf-8', strings_only=False, errors='strict'):
|
def smart_str(s, encoding='utf-8', strings_only=False, errors='strict'):
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
# -*- coding: utf8 -*-
|
||||||
|
|
||||||
|
class BrokenException(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
except_args = ('Broken!', # plain exception with ASCII text
|
||||||
|
u'¡Broken!', # non-ASCII unicode data
|
||||||
|
'¡Broken!', # non-ASCII, utf-8 encoded bytestring
|
||||||
|
'\xa1Broken!', ) # non-ASCII, latin1 bytestring
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
from django.test import TestCase
|
||||||
|
from django.conf import settings
|
||||||
|
from django.core.urlresolvers import reverse
|
||||||
|
|
||||||
|
from regressiontests.debug import BrokenException, except_args
|
||||||
|
|
||||||
|
class ExceptionTest(TestCase):
|
||||||
|
urls = 'regressiontests.debug.urls'
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
self.old_debug = settings.DEBUG
|
||||||
|
settings.DEBUG = True
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
settings.DEBUG = self.old_debug
|
||||||
|
|
||||||
|
def test_view_exceptions(self):
|
||||||
|
for n in range(len(except_args)):
|
||||||
|
self.assertRaises(BrokenException, self.client.get,
|
||||||
|
reverse('view_exception', args=(n,)))
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
from django.conf.urls.defaults import *
|
||||||
|
|
||||||
|
urlpatterns = patterns('regressiontests.debug.views',
|
||||||
|
url(r'view_exception/(?P<n>\d+)/$', 'view_exception', name='view_exception'),
|
||||||
|
)
|
|
@ -0,0 +1,5 @@
|
||||||
|
from regressiontests.debug import BrokenException, except_args
|
||||||
|
|
||||||
|
def view_exception(request, n):
|
||||||
|
raise BrokenException(except_args[int(n)])
|
||||||
|
|
Loading…
Reference in New Issue