[1.1.X] 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.

r12621 and r12622 from trunk.


git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.1.X@12623 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Karen Tracey 2010-02-28 15:29:14 +00:00
parent e0679ef165
commit 1b2b3b0dba
6 changed files with 51 additions and 1 deletions

View File

@ -89,7 +89,16 @@ def force_unicode(s, encoding='utf-8', strings_only=False, errors='strict'):
# SafeUnicode at the end.
s = s.decode(encoding, errors)
except UnicodeDecodeError, e:
raise DjangoUnicodeDecodeError(s, *e.args)
if not isinstance(s, Exception):
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
def smart_str(s, encoding='utf-8', strings_only=False, errors='strict'):

View File

@ -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

View File

View File

@ -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,)))

View File

@ -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'),
)

View File

@ -0,0 +1,5 @@
from regressiontests.debug import BrokenException, except_args
def view_exception(request, n):
raise BrokenException(except_args[int(n)])