# coding: utf-8
from __future__ import absolute_import, division, print_function, with_statement
+import re
import sys
import datetime
import tornado.escape
from tornado.escape import utf8
-from tornado.util import raise_exc_info, Configurable, exec_in, ArgReplacer, timedelta_to_seconds, import_object
+from tornado.util import raise_exc_info, Configurable, exec_in, ArgReplacer, timedelta_to_seconds, import_object, re_unescape
from tornado.test.util import unittest
try:
# whether the thing being imported is a module or not.
# This variant requires a byte string in python 2.
self.assertIs(import_object(u'tornado.escape'), tornado.escape)
+
+
+class ReUnescapeTest(unittest.TestCase):
+ def test_re_unescape(self):
+ test_strings = (
+ '/favicon.ico',
+ 'index.html',
+ '\x00\x01\\000',
+ 'Hello, World!',
+ '!$@#%;',
+ )
+ for string in test_strings:
+ self.assertEqual(string, re_unescape(re.escape(string)))
app = Application([])
server = app.listen(0, address='127.0.0.1')
server.stop()
+
+
+class URLSpecReverseTest(unittest.TestCase):
+ def test_reverse(self):
+ self.assertEqual('/favicon.ico', url(r'/favicon\.ico', None).reverse())
import array
import os
+import re
import sys
import zlib
return None
+_re_unescape_split_pattern = re.compile(r'(\\[^0])')
+# re.escape('\x00') is a special case
+
+def re_unescape(s):
+ '''
+ unescape a string escaped by ``re.escape()``
+ '''
+ parts = []
+ for i, splited in enumerate(_re_unescape_split_pattern.split(s)):
+ if i % 2:
+ parts.append(splited[1])
+ else:
+ parts.append(splited.replace(r'\000', '\000'))
+ return ''.join(parts)
+
+
class Configurable(object):
"""Base class for configurable interfaces.
from tornado import template
from tornado.escape import utf8, _unicode
from tornado.util import (import_object, ObjectDict, raise_exc_info,
- unicode_type, _websocket_mask)
+ unicode_type, _websocket_mask, re_unescape)
from tornado.httputil import split_host_and_port
def initialize(self):
"""Hook for subclass initialization. Called for each request.
-
+
A dictionary passed as the third argument of a url spec will be
supplied as keyword arguments to initialize().
if paren_loc >= 0:
pieces.append('%s' + fragment[paren_loc + 1:])
else:
- pieces.append(fragment)
+ pieces.append(re_unescape(fragment))
return (''.join(pieces), self.regex.groups)