From cc9b767fc60a8b0455a67f00ca23077b55e709bb Mon Sep 17 00:00:00 2001
From: Claude Paroz <claude@2xlibre.net>
Date: Tue, 4 Sep 2012 09:24:39 +0200
Subject: [PATCH] Fixed #18902 -- Made force_bytes properly handle exception
 input

Thanks Aymeric Augustin for the report and the initial patch.
---
 django/utils/encoding.py                |  2 +-
 tests/regressiontests/utils/encoding.py | 17 +++++++++++++++++
 tests/regressiontests/utils/tests.py    |  1 +
 3 files changed, 19 insertions(+), 1 deletion(-)
 create mode 100644 tests/regressiontests/utils/encoding.py

diff --git a/django/utils/encoding.py b/django/utils/encoding.py
index 998cf4f3f7..3b284f3ed0 100644
--- a/django/utils/encoding.py
+++ b/django/utils/encoding.py
@@ -174,7 +174,7 @@ def force_bytes(s, encoding='utf-8', strings_only=False, errors='strict'):
                 # An Exception subclass containing non-ASCII data that doesn't
                 # know how to print itself properly. We shouldn't raise a
                 # further exception.
-                return ' '.join([force_bytes(arg, encoding, strings_only,
+                return b' '.join([force_bytes(arg, encoding, strings_only,
                         errors) for arg in s])
             return six.text_type(s).encode(encoding, errors)
     else:
diff --git a/tests/regressiontests/utils/encoding.py b/tests/regressiontests/utils/encoding.py
new file mode 100644
index 0000000000..d191845518
--- /dev/null
+++ b/tests/regressiontests/utils/encoding.py
@@ -0,0 +1,17 @@
+# -*- encoding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.utils import unittest
+from django.utils.encoding import force_bytes
+
+
+class TestEncodingUtils(unittest.TestCase):
+    def test_force_bytes_exception(self):
+        """
+        Test that force_bytes knows how to convert to bytes an exception
+        containing non-ASCII characters in its args.
+        """
+        error_msg = "This is an exception, voilĂ "
+        exc = ValueError(error_msg)
+        result = force_bytes(exc)
+        self.assertEqual(result, error_msg.encode('utf-8'))
diff --git a/tests/regressiontests/utils/tests.py b/tests/regressiontests/utils/tests.py
index 08f5f760cc..f4fa75b177 100644
--- a/tests/regressiontests/utils/tests.py
+++ b/tests/regressiontests/utils/tests.py
@@ -13,6 +13,7 @@ from .dateformat import DateFormatTests
 from .dateparse import DateParseTests
 from .datetime_safe import DatetimeTests
 from .decorators import DecoratorFromMiddlewareTests
+from .encoding import TestEncodingUtils
 from .feedgenerator import FeedgeneratorTest
 from .functional import FunctionalTestCase
 from .html import TestUtilsHtml