]> git.ipfire.org Git - thirdparty/tornado.git/commitdiff
Accept utf8-encoded byte strings in json_encode
authorBen Darnell <ben@bendarnell.com>
Sun, 26 Jun 2011 02:02:55 +0000 (19:02 -0700)
committerBen Darnell <ben@bendarnell.com>
Sun, 26 Jun 2011 02:02:55 +0000 (19:02 -0700)
tornado/escape.py
tornado/test/escape_test.py

index fd686bb4d200a85ca5823452417eac25d87d4986..44fe9368d2934659448b77f2898625ff4b2bb4cd 100644 (file)
@@ -79,7 +79,7 @@ def json_encode(value):
     # the javscript.  Some json libraries do this escaping by default,
     # although python's standard library does not, so we do it here.
     # http://stackoverflow.com/questions/1580647/json-why-are-forward-slashes-escaped
-    return _json_encode(value).replace("</", "<\\/")
+    return _json_encode(recursive_unicode(value)).replace("</", "<\\/")
 
 
 def json_decode(value):
index 5904a540cbd7f427c670bfdd4b9027f587b2d1fd..42ba50bbf5adba2f2dc18ebfcff271caefd6ac54 100644 (file)
@@ -3,7 +3,7 @@
 import tornado.escape
 import unittest
 
-from tornado.escape import utf8, xhtml_escape, xhtml_unescape, url_escape, url_unescape, to_unicode, json_decode
+from tornado.escape import utf8, xhtml_escape, xhtml_unescape, url_escape, url_unescape, to_unicode, json_decode, json_encode
 from tornado.util import b
 
 linkify_tests = [
@@ -180,3 +180,10 @@ class EscapeTestCase(unittest.TestCase):
 
         # Non-ascii bytes are interpreted as utf8
         self.assertEqual(json_decode(utf8(u'"\u00e9"')), u"\u00e9")
+
+    def test_json_encode(self):
+        # json deals with strings, not bytes, but our encoding function should
+        # accept bytes as well as long as they are utf8.
+        self.assertEqual(json_decode(json_encode(u"\u00e9")), u"\u00e9")
+        self.assertEqual(json_decode(json_encode(utf8(u"\u00e9"))), u"\u00e9")
+        self.assertRaises(UnicodeDecodeError, json_encode, b("\xe9"))