Commit 1b2b3b0d authored by Karen Tracey's avatar Karen Tracey
Browse files

[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
parent e0679ef1
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -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:
        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'):
+10 −0
Original line number Diff line number Diff line
# -*- 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

Empty file added.

+21 −0
Original line number Diff line number Diff line
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,)))
+5 −0
Original line number Diff line number Diff line
from django.conf.urls.defaults import *

urlpatterns = patterns('regressiontests.debug.views',
    url(r'view_exception/(?P<n>\d+)/$', 'view_exception', name='view_exception'),
)
Loading