def __init__(self, path='/', method="GET"): self.rfile = StringIO.StringIO() self.efile = StringIO.StringIO() if '?' in path: qindex = path.index('?') query = path[qindex + 1:] path = path[:qindex] else: query = None self.environ = { 'REQUEST_METHOD': method, 'SCRIPT_NAME': "", # the definition of PATH_INFO requires removal of # URL-encoding! This will cause problems! 'PATH_INFO': uri.unescape_data(path).decode('utf-8'), 'QUERY_STRING': query, 'SERVER_NAME': "127.0.0.1", 'SERVER_PORT': "80", 'SERVER_PROTOCOL': "HTTP/1.0", 'wsgi.version': (1, 0), 'wsgi.input': self.rfile, 'wsgi.errors': self.efile, 'wsgi.multithread': True, 'wsgi.multiprocess': True, 'wsgi.run_once': False } self.responseCode = None self.responseMessage = None self.responseHeaders = {} self.wfile = None
def test_escape(self): data = "\t\n\r !\"#$%&'()*+,-./0123456789:;<=>?@"\ "ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" escaped_normal = "%09%0A%0D%20!%22%23%24%25%26'()*%2B%2C-.%2F"\ "0123456789%3A%3B%3C%3D%3E%3F%40"\ "ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60"\ "abcdefghijklmnopqrstuvwxyz%7B%7C%7D~" escaped_max = "%09%0A%0D%20%21%22%23%24%25%26%27%28%29%2A%2B%2C%2D"\ "%2E%2F0123456789%3A%3B%3C%3D%3E%3F%40"\ "ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E%5F%60"\ "abcdefghijklmnopqrstuvwxyz%7B%7C%7D%7E" escaped_min = "%09%0A%0D%20!%22%23$%25&'()*+,-./0123456789:;%3C=%3E?@"\ "ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60"\ "abcdefghijklmnopqrstuvwxyz%7B%7C%7D~" self.compare_strings( escaped_normal, uri.escape_data(data), "Normal escaping") self.compare_strings(escaped_max, uri.escape_data(data, lambda x: not uri.is_alpha_num(x)), "Max escaping") self.compare_strings( escaped_min, uri.escape_data(data, lambda x: False), "Min escaping") self.compare_strings(data, uri.unescape_data(uri.escape_data(data)), "Round-trip escaping")
def test_escape(self): data = "\t\n\r !\"#$%&'()*+,-./0123456789:;<=>?@"\ "ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" escaped_normal = "%09%0A%0D%20!%22%23%24%25%26'()*%2B%2C-.%2F"\ "0123456789%3A%3B%3C%3D%3E%3F%40"\ "ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60"\ "abcdefghijklmnopqrstuvwxyz%7B%7C%7D~" escaped_max = "%09%0A%0D%20%21%22%23%24%25%26%27%28%29%2A%2B%2C%2D"\ "%2E%2F0123456789%3A%3B%3C%3D%3E%3F%40"\ "ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E%5F%60"\ "abcdefghijklmnopqrstuvwxyz%7B%7C%7D%7E" escaped_min = "%09%0A%0D%20!%22%23$%25&'()*+,-./0123456789:;%3C=%3E?@"\ "ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60"\ "abcdefghijklmnopqrstuvwxyz%7B%7C%7D~" self.compare_strings(escaped_normal, uri.escape_data(data), "Normal escaping") self.compare_strings( escaped_max, uri.escape_data(data, lambda x: not uri.is_alpha_num(x)), "Max escaping") self.compare_strings(escaped_min, uri.escape_data(data, lambda x: False), "Min escaping") self.compare_strings(data, uri.unescape_data(uri.escape_data(data)), "Round-trip escaping")
def __init__(self, path='/', method="GET"): self.rfile = io.BytesIO() self.efile = io.BytesIO() if '?' in path: qindex = path.index('?') query = path[qindex + 1:] path = path[:qindex] else: query = None self.environ = { 'REQUEST_METHOD': method, 'SCRIPT_NAME': "", # the definition of PATH_INFO requires removal of # URL-encoding! This will cause problems! 'PATH_INFO': uri.unescape_data(path).decode('utf-8'), 'QUERY_STRING': query, 'SERVER_NAME': "127.0.0.1", 'SERVER_PORT': "80", 'SERVER_PROTOCOL': "HTTP/1.0", 'wsgi.version': (1, 0), 'wsgi.input': self.rfile, 'wsgi.errors': self.efile, 'wsgi.multithread': True, 'wsgi.multiprocess': True, 'wsgi.run_once': False } self.responseCode = None self.responseMessage = None self.responseHeaders = {} self.wfile = None
def test_escape(self): data = "\t\n\r !\"#$%&'()*+,-./0123456789:;<=>?@"\ "ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" escaped_normal = "%09%0A%0D%20!%22%23%24%25%26'()*%2B%2C-.%2F"\ "0123456789%3A%3B%3C%3D%3E%3F%40"\ "ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60"\ "abcdefghijklmnopqrstuvwxyz%7B%7C%7D~" escaped_max = "%09%0A%0D%20%21%22%23%24%25%26%27%28%29%2A%2B%2C%2D"\ "%2E%2F0123456789%3A%3B%3C%3D%3E%3F%40"\ "ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E%5F%60"\ "abcdefghijklmnopqrstuvwxyz%7B%7C%7D%7E" escaped_min = "%09%0A%0D%20!%22%23$%25&'()*+,-./0123456789:;%3C=%3E?@"\ "ABCDEFGHIJKLMNOPQRSTUVWXYZ[%5C]%5E_%60"\ "abcdefghijklmnopqrstuvwxyz%7B%7C%7D~" escaped_min_2396 = "%09%0A%0D%20!%22%23$%25&'()*+,-./0123456789:;%3C"\ "=%3E?@ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60"\ "abcdefghijklmnopqrstuvwxyz%7B%7C%7D~" self.compare_strings(escaped_normal, uri.escape_data(data), "Normal escaping") self.compare_strings( escaped_max, uri.escape_data(data, lambda x: not uri.is_alphanum(x)), "Max escaping") self.compare_strings(escaped_min, uri.escape_data(data, lambda x: False), "Min escaping") self.compare_strings( escaped_min_2396, uri.escape_data(data, lambda x: False, allowed_test=uri.is_allowed_2396), "Min escaping") self.compare_strings( data, uri.unescape_data(uri.escape_data(data)).decode('ascii'), "Round-trip escaping") try: uri.escape_data(ul('Caf\xe9')) self.fail("non-ASCII character for escaping") except UnicodeEncodeError: pass # byte strings can contain any data, no UTF-8 encoding is done self.assertTrue(uri.escape_data(b'Caf\xe9') == "Caf%E9")
def test_escape(self): data = "\t\n\r !\"#$%&'()*+,-./0123456789:;<=>?@"\ "ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" escaped_normal = "%09%0A%0D%20!%22%23%24%25%26'()*%2B%2C-.%2F"\ "0123456789%3A%3B%3C%3D%3E%3F%40"\ "ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60"\ "abcdefghijklmnopqrstuvwxyz%7B%7C%7D~" escaped_max = "%09%0A%0D%20%21%22%23%24%25%26%27%28%29%2A%2B%2C%2D"\ "%2E%2F0123456789%3A%3B%3C%3D%3E%3F%40"\ "ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E%5F%60"\ "abcdefghijklmnopqrstuvwxyz%7B%7C%7D%7E" escaped_min = "%09%0A%0D%20!%22%23$%25&'()*+,-./0123456789:;%3C=%3E?@"\ "ABCDEFGHIJKLMNOPQRSTUVWXYZ[%5C]%5E_%60"\ "abcdefghijklmnopqrstuvwxyz%7B%7C%7D~" escaped_min_2396 = "%09%0A%0D%20!%22%23$%25&'()*+,-./0123456789:;%3C"\ "=%3E?@ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60"\ "abcdefghijklmnopqrstuvwxyz%7B%7C%7D~" self.compare_strings( escaped_normal, uri.escape_data(data), "Normal escaping") self.compare_strings(escaped_max, uri.escape_data(data, lambda x: not uri.is_alphanum(x)), "Max escaping") self.compare_strings( escaped_min, uri.escape_data(data, lambda x: False), "Min escaping") self.compare_strings( escaped_min_2396, uri.escape_data( data, lambda x: False, allowed_test=uri.is_allowed_2396), "Min escaping") self.compare_strings( data, uri.unescape_data(uri.escape_data(data)).decode('ascii'), "Round-trip escaping") try: uri.escape_data(ul('Caf\xe9')) self.fail("non-ASCII character for escaping") except UnicodeEncodeError: pass # byte strings can contain any data, no UTF-8 encoding is done self.assertTrue(uri.escape_data(b'Caf\xe9') == "Caf%E9")
def test_unescape(self): data = "%3CC%00a%20f%0d%0a%E9%3e" expected = b"\x3c\x43\x00\x61\x20\x66\x0d\x0a\xe9\x3e" result = uri.unescape_data(data) self.assertTrue(result == expected, "unescaped data: "+repr(result)) self.assertTrue(isinstance(result, bytes), "binary return type") # test forced unicode version data = ul(data) result = uri.unescape_data(data) self.assertTrue(result == expected, "unescaped data (u)") self.assertTrue(isinstance(result, bytes), "binary return type (u)") # now catch attempts to unescape non-ASCII data data = ul("%3CC%00a%20f%0d%0a\xe9%3e") try: uri.unescape_data(data) self.fail("Non-ASCII data to unescape") except UnicodeEncodeError: pass # some bad examples data = "Caf%hay" self.assertTrue(uri.unescape_data(data) == b"Caf%hay", "partial hex 1") data = "Caf%eh" self.assertTrue(uri.unescape_data(data) == b"Caf%eh", "partial hex 2")
def from_str(cls, source): """Creates a slug from a *source* string.""" return cls(unicode(uri.unescape_data(source), 'utf-8'))