示例#1
0
    def test_routes_raise(self):
        '''
        Test URLs that raise exceptions
        '''
        # test non-exception variants
        load(data='')
        self.assertEqual(
            filter_url('http://domain.com/init'), "/init/default/index")
        self.assertEqual(filter_url(
            'http://domain.com/init/default'), "/init/default/index")
        self.assertEqual(filter_url('http://domain.com/init/default/fcn.ext'),
                         "/init/default/fcn.ext")
        self.assertEqual(filter_url('http://domain.com/init/default/fcn/arg'),
                         "/init/default/fcn ['arg']")
        # now raise-HTTP variants
        self.assertRaises(HTTP, filter_url, 'http://domain.com/bad!ctl')
        self.assertRaises(HTTP, filter_url, 'http://domain.com/ctl/bad!fcn')
        self.assertRaises(
            HTTP, filter_url, 'http://domain.com/ctl/fcn.bad!ext')
        #self.assertRaises(
        #    HTTP, filter_url, 'http://domain.com/ctl/fcn/bad!arg')
        #try:
        #    # 2.7+ only
        #    self.assertRaisesRegexp(HTTP, '400 BAD REQUEST \[invalid path\]', filter_url, 'http://domain.com/init/bad!ctl')
        #    self.assertRaisesRegexp(HTTP, '400 BAD REQUEST \[invalid path\]', filter_url, 'http://domain.com/init/ctlr/bad!fcn')
        #    self.assertRaisesRegexp(HTTP, '400 BAD REQUEST \[invalid path\]', filter_url, 'http://domain.com/init/ctlr/fcn.bad!ext')
        #    self.assertRaisesRegexp(HTTP, '400 BAD REQUEST \[invalid path\]', filter_url, 'http://domain.com/appc/init/fcn/bad!arg')
        #except AttributeError:
        #    pass

        self.assertEqual(filter_url('http://domain.com/welcome/default/fcn_1'),
                         "/welcome/default/fcn_1")
示例#2
0
    def test_routes_raise(self):
        '''
        Test URLs that raise exceptions
        '''
        # test non-exception variants
        load(data='')
        self.assertEqual(filter_url('http://domain.com/init'),
                         "/init/default/index")
        self.assertEqual(filter_url('http://domain.com/init/default'),
                         "/init/default/index")
        self.assertEqual(filter_url('http://domain.com/init/default/fcn.ext'),
                         "/init/default/fcn.ext")
        self.assertEqual(filter_url('http://domain.com/init/default/fcn/arg'),
                         "/init/default/fcn ['arg']")
        # now raise-HTTP variants
        self.assertRaises(HTTP, filter_url, 'http://domain.com/bad!ctl')
        self.assertRaises(HTTP, filter_url, 'http://domain.com/ctl/bad!fcn')
        self.assertRaises(HTTP, filter_url,
                          'http://domain.com/ctl/fcn.bad!ext')
        #self.assertRaises(
        #    HTTP, filter_url, 'http://domain.com/ctl/fcn/bad!arg')
        #try:
        #    # 2.7+ only
        #    self.assertRaisesRegexp(HTTP, '400 BAD REQUEST \[invalid path\]', filter_url, 'http://domain.com/init/bad!ctl')
        #    self.assertRaisesRegexp(HTTP, '400 BAD REQUEST \[invalid path\]', filter_url, 'http://domain.com/init/ctlr/bad!fcn')
        #    self.assertRaisesRegexp(HTTP, '400 BAD REQUEST \[invalid path\]', filter_url, 'http://domain.com/init/ctlr/fcn.bad!ext')
        #    self.assertRaisesRegexp(HTTP, '400 BAD REQUEST \[invalid path\]', filter_url, 'http://domain.com/appc/init/fcn/bad!arg')
        #except AttributeError:
        #    pass

        self.assertEqual(filter_url('http://domain.com/welcome/default/fcn_1'),
                         "/welcome/default/fcn_1")
示例#3
0
    def test_routes_query(self):
        """ Test query appending """
        data = r'''
routes_in = (
 ('/service/$model/create', '/app/default/call/json/create?model=$model'),
)
'''
        load(data=data)
        self.assertEqual(filter_url('http://localhost:8000/service/person/create'), "/app/default/call ['json', 'create'] ?model=person")
        self.assertEqual(filter_url('http://localhost:8000/service/person/create?var1=val1'), "/app/default/call ['json', 'create'] ?model=person&var1=val1")
示例#4
0
    def test_routes_query(self):
        """ Test query appending """
        data = r'''
routes_in = (
 ('/service/$model/create', '/app/default/call/json/create?model=$model'),
)
'''
        load(data=data)
        self.assertEqual(
            filter_url('http://localhost:8000/service/person/create'),
            "/app/default/call ['json', 'create'] ?model=person")
        self.assertEqual(
            filter_url(
                'http://localhost:8000/service/person/create?var1=val1'),
            "/app/default/call ['json', 'create'] ?model=person&var1=val1")
示例#5
0
    def test_routes_specific(self):
        """
        Test app-specific routes.py

        Note that make_apptree above created applications/examples/routes.py with a default_function.
        """
        data = r'''
routes_app = [
    (r'/(?P<app>welcome|admin|examples)\b.*', r'\g<app>'),
    (r'$anything', r'welcome'),
    (r'/?$anything', r'welcome'),
]
'''
        load(data=data)
        self.assertEqual(
            filter_url('http://domain.com/welcome'), '/welcome/default/index')
        self.assertEqual(filter_url(
            'http://domain.com/examples'), '/examples/default/exdef')
示例#6
0
    def test_routes_specific(self):
        """
        Test app-specific routes.py

        Note that make_apptree above created applications/examples/routes.py with a default_function.
        """
        data = r'''
routes_app = [
    (r'/(?P<app>welcome|admin|examples)\b.*', r'\g<app>'),
    (r'$anything', r'welcome'),
    (r'/?$anything', r'welcome'),
]
'''
        load(data=data)
        self.assertEqual(filter_url('http://domain.com/welcome'),
                         '/welcome/default/index')
        self.assertEqual(filter_url('http://domain.com/examples'),
                         '/examples/default/exdef')
示例#7
0
    def test_request_uri(self):
        '''
        Test REQUEST_URI in env
        '''
        data = r'''routes_in = [
    ('/abc', '/init/default/abc'),
    ('/index/$anything', '/init/default/index/$anything'),
    ]
'''
        load(data=data)
        self.assertEqual(
            filter_url('http://domain.com/abc', env=True).request_uri,
            '/init/default/abc')
        self.assertEqual(
            filter_url('http://domain.com/abc?def', env=True).request_uri,
            '/init/default/abc?def')
        self.assertEqual(
            filter_url('http://domain.com/index/abc', env=True).request_uri,
            "/init/default/index/abc")
        self.assertEqual(
            filter_url('http://domain.com/index/a%20bc', env=True).request_uri,
            "/init/default/index/a bc")
示例#8
0
    def test_request_uri(self):
        '''
        Test REQUEST_URI in env
        '''
        data = r'''routes_in = [
    ('/abc', '/init/default/abc'),
    ('/index/$anything', '/init/default/index/$anything'),
    ]
'''
        load(data=data)
        self.assertEqual(
            filter_url('http://domain.com/abc', env=True).request_uri,
            '/init/default/abc')
        self.assertEqual(
            filter_url('http://domain.com/abc?def', env=True).request_uri,
            '/init/default/abc?def')
        self.assertEqual(
            filter_url('http://domain.com/index/abc', env=True).request_uri,
            "/init/default/index/abc")
        self.assertEqual(
            filter_url('http://domain.com/index/a%20bc', env=True).request_uri,
            "/init/default/index/a bc")
示例#9
0
    def test_routes_defapp(self):
        """ Test the default-application function """
        data = r'''
default_application = 'defapp'
'''
        load(data=data)
        # incoming
        self.assertEqual(
            filter_url('http://domain.com'), '/defapp/default/index')
        self.assertEqual(
            filter_url('http://domain.com/'), '/defapp/default/index')
        self.assertEqual(
            filter_url('http://domain.com/welcome'), '/welcome/default/index')
        self.assertEqual(
            filter_url('http://domain.com/app'), '/app/default/index')
        self.assertEqual(filter_url('http://domain.com/welcome/default/index/abc'), "/welcome/default/index ['abc']")
        self.assertEqual(filter_url('http://domain.com/welcome/static/abc'),
                         '%s/applications/welcome/static/abc' % root)
        self.assertEqual(filter_url('http://domain.com/defapp/static/path/to/static'), "%s/applications/defapp/static/path/to/static" % root)
示例#10
0
    def test_routes_defapp(self):
        """ Test the default-application function """
        data = r'''
default_application = 'defapp'
'''
        load(data=data)
        # incoming
        self.assertEqual(filter_url('http://domain.com'),
                         '/defapp/default/index')
        self.assertEqual(filter_url('http://domain.com/'),
                         '/defapp/default/index')
        self.assertEqual(filter_url('http://domain.com/welcome'),
                         '/welcome/default/index')
        self.assertEqual(filter_url('http://domain.com/app'),
                         '/app/default/index')
        self.assertEqual(
            filter_url('http://domain.com/welcome/default/index/abc'),
            "/welcome/default/index ['abc']")
        self.assertEqual(filter_url('http://domain.com/welcome/static/abc'),
                         '%s/applications/welcome/static/abc' % root)
        self.assertEqual(
            filter_url('http://domain.com/defapp/static/path/to/static'),
            "%s/applications/defapp/static/path/to/static" % root)
示例#11
0
 def test_routes_null(self):
     """ Tests a null routes table """
     load(data='')
     # incoming
     self.assertEqual(
         filter_url('http://domain.com'), '/init/default/index')
     self.assertEqual(
         filter_url('http://domain.com/'), '/init/default/index')
     self.assertEqual(
         filter_url('http://domain.com/abc'), '/abc/default/index')
     self.assertEqual(
         filter_url('http://domain.com/abc/'), '/abc/default/index')
     self.assertEqual(
         filter_url('http://domain.com/abc/def'), "/abc/def/index")
     self.assertEqual(
         filter_url('http://domain.com/abc/def/'), "/abc/def/index")
     self.assertEqual(
         filter_url('http://domain.com/abc/def/ghi'), "/abc/def/ghi")
     self.assertEqual(
         filter_url('http://domain.com/abc/def/ghi/'), "/abc/def/ghi")
     self.assertEqual(filter_url(
         'http://domain.com/abc/def/ghi/jkl'), "/abc/def/ghi ['jkl']")
     self.assertEqual(filter_url(
         'http://domain.com/abc/def/ghi/j%20kl'), "/abc/def/ghi ['j_kl']")
     self.assertEqual(filter_url('http://domain.com/welcome/static/path/to/static'), 
         norm_root("%s/applications/welcome/static/path/to/static" % root))
     # no more necessary since explcit check for directory traversal attacks
     """
     self.assertRaises(HTTP, filter_url, 'http://domain.com/welcome/static/bad/path/to/st~tic')
     try:
         # 2.7+ only
         self.assertRaisesRegexp(HTTP, "400.*BAD REQUEST \[invalid path\]", filter_url, 'http://domain.com/welcome/static/bad/path/to/st~tic')
     except AttributeError:
         pass
     """
     # outgoing
     self.assertEqual(filter_url('http://domain.com/init/default/index',
                      out=True), '/init/default/index')
     self.assertEqual(filter_url('http://domain.com/init/default/index/arg1', out=True), '/init/default/index/arg1')
     self.assertEqual(filter_url('http://domain.com/init/default/abc',
                      out=True), '/init/default/abc')
示例#12
0
    def test_routes_args(self):
        '''
        Test URL args parsing/generation
        '''
        data = r'''routes_in = [
    ('/robots.txt', '/welcome/static/robots.txt'),
    ('/favicon.ico', '/welcome/static/favicon.ico'),
    ('/admin$anything', '/admin$anything'),
    ('.*:https?://(.*\\.)?domain1.com:$method /', '/app1/default'),
    ('.*:https?://(.*\\.)?domain1.com:$method /static/$anything',
     '/app1/static/$anything'),
    ('.*:https?://(.*\\.)?domain1.com:$method /appadmin/$anything',
     '/app1/appadmin/$anything'),
    ('.*:https?://(.*\\.)?domain1.com:$method /$anything',
     '/app1/default/$anything'),
    ('.*:https?://(.*\\.)?domain2.com:$method /', '/app2/default'),
    ('.*:https?://(.*\\.)?domain2.com:$method /static/$anything',
     '/app2/static/$anything'),
    ('.*:https?://(.*\\.)?domain2.com:$method /appadmin/$anything',
     '/app2/appadmin/$anything'),
    ('.*:https?://(.*\\.)?domain2.com:$method /$anything',
     '/app2/default/$anything'),
    ('.*:https?://(.*\\.)?domain3.com:$method /', '/app3/defcon3'),
    ('.*:https?://(.*\\.)?domain3.com:$method /static/$anything',
     '/app3/static/$anything'),
    ('.*:https?://(.*\\.)?domain3.com:$method /appadmin/$anything',
     '/app3/appadmin/$anything'),
    ('.*:https?://(.*\\.)?domain3.com:$method /$anything',
     '/app3/defcon3/$anything'),
    ('/', '/welcome/default'),
    ('/welcome/default/$anything', '/welcome/default/$anything'),
    ('/welcome/$anything', '/welcome/default/$anything'),
    ('/static/$anything', '/welcome/static/$anything'),
    ('/appadmin/$anything', '/welcome/appadmin/$anything'),
    ('/$anything', '/welcome/default/$anything'),
    ]
routes_out = [
    ('/welcome/static/$anything', '/static/$anything'),
    ('/welcome/appadmin/$anything', '/appadmin/$anything'),
    ('/welcome/default/$anything', '/$anything'),
    ('/app1/static/$anything', '/static/$anything'),
    ('/app1/appadmin/$anything', '/appadmin/$anything'),
    ('/app1/default/$anything', '/$anything'),
    ('/app2/static/$anything', '/static/$anything'),
    ('/app2/appadmin/$anything', '/appadmin/$anything'),
    ('/app2/default/$anything', '/$anything'),
    ('/app3/static/$anything', '/static/$anything'),
    ('/app3/appadmin/$anything', '/appadmin/$anything'),
    ('/app3/defcon3/$anything', '/$anything')
    ]
'''
        load(data=data)
        self.assertEqual(
            filter_url('http://domain.com/welcome/default/f/arg1'),
            "/welcome/default/f ['arg1']")
        self.assertEqual(
            filter_url('http://domain.com/welcome/default/f/arg1/'),
            "/welcome/default/f ['arg1']")
        self.assertEqual(
            filter_url('http://domain.com/welcome/default/f/arg1//'),
            "/welcome/default/f ['arg1', '']")
        self.assertEqual(
            filter_url('http://domain.com/welcome/default/f//arg1'),
            "/welcome/default/f ['', 'arg1']")
        self.assertEqual(
            filter_url('http://domain.com/welcome/default/f/arg1/arg2'),
            "/welcome/default/f ['arg1', 'arg2']")
        self.assertEqual(
            filter_url('http://domain.com/welcome/default/f/arg1//arg2'),
            "/welcome/default/f ['arg1', '', 'arg2']")
        self.assertEqual(
            filter_url('http://domain.com/welcome/default/f/arg1//arg3/'),
            "/welcome/default/f ['arg1', '', 'arg3']")
        self.assertEqual(
            filter_url('http://domain.com/welcome/default/f/arg1//arg3//'),
            "/welcome/default/f ['arg1', '', 'arg3', '']")

        self.assertEqual(
            filter_url('http://domain.com/welcome/default/f', out=True), "/f")
        self.assertEqual(regex_filter_out('/welcome/default/f'), "/f")
        self.assertEqual(
            str(URL(a='welcome', c='default', f='f', args=None)), "/f")
        self.assertEqual(str(
            URL(a='welcome', c='default', f='f', args=['arg1'])), "/f/arg1")
        self.assertEqual(str(URL(
            a='welcome', c='default', f='f', args=['arg1', ''])), "/f/arg1//")
        self.assertEqual(str(URL(a='welcome', c='default', f='f',
                         args=['arg1', '', 'arg3'])), "/f/arg1//arg3")
        self.assertEqual(str(
            URL(a='welcome', c='default', f='f', args=['ar g'])), "/f/ar%20g")
        self.assertEqual(str(URL(
            a='welcome', c='default', f='f', args=['årg'])), "/f/%C3%A5rg")
        self.assertEqual(
            str(URL(a='welcome', c='default', f='fünc')), "/f\xc3\xbcnc")
示例#13
0
 def test_routes_null(self):
     """ Tests a null routes table """
     load(data='')
     # incoming
     self.assertEqual(filter_url('http://domain.com'),
                      '/init/default/index')
     self.assertEqual(filter_url('http://domain.com/'),
                      '/init/default/index')
     self.assertEqual(filter_url('http://domain.com/abc'),
                      '/abc/default/index')
     self.assertEqual(filter_url('http://domain.com/abc/'),
                      '/abc/default/index')
     self.assertEqual(filter_url('http://domain.com/abc/def'),
                      "/abc/def/index")
     self.assertEqual(filter_url('http://domain.com/abc/def/'),
                      "/abc/def/index")
     self.assertEqual(filter_url('http://domain.com/abc/def/ghi'),
                      "/abc/def/ghi")
     self.assertEqual(filter_url('http://domain.com/abc/def/ghi/'),
                      "/abc/def/ghi")
     self.assertEqual(filter_url('http://domain.com/abc/def/ghi/jkl'),
                      "/abc/def/ghi ['jkl']")
     self.assertEqual(filter_url('http://domain.com/abc/def/ghi/j%20kl'),
                      "/abc/def/ghi ['j_kl']")
     self.assertEqual(
         filter_url('http://domain.com/welcome/static/path/to/static'),
         norm_root("%s/applications/welcome/static/path/to/static" % root))
     # no more necessary since explcit check for directory traversal attacks
     """
     self.assertRaises(HTTP, filter_url, 'http://domain.com/welcome/static/bad/path/to/st~tic')
     try:
         # 2.7+ only
         self.assertRaisesRegexp(HTTP, "400.*BAD REQUEST \[invalid path\]", filter_url, 'http://domain.com/welcome/static/bad/path/to/st~tic')
     except AttributeError:
         pass
     """
     # outgoing
     self.assertEqual(
         filter_url('http://domain.com/init/default/index', out=True),
         '/init/default/index')
     self.assertEqual(
         filter_url('http://domain.com/init/default/index/arg1', out=True),
         '/init/default/index/arg1')
     self.assertEqual(
         filter_url('http://domain.com/init/default/abc', out=True),
         '/init/default/abc')
示例#14
0
    def test_routes_args(self):
        '''
        Test URL args parsing/generation
        '''
        data = r'''routes_in = [
    ('/robots.txt', '/welcome/static/robots.txt'),
    ('/favicon.ico', '/welcome/static/favicon.ico'),
    ('/admin$anything', '/admin$anything'),
    ('.*:https?://(.*\\.)?domain1.com:$method /', '/app1/default'),
    ('.*:https?://(.*\\.)?domain1.com:$method /static/$anything',
     '/app1/static/$anything'),
    ('.*:https?://(.*\\.)?domain1.com:$method /appadmin/$anything',
     '/app1/appadmin/$anything'),
    ('.*:https?://(.*\\.)?domain1.com:$method /$anything',
     '/app1/default/$anything'),
    ('.*:https?://(.*\\.)?domain2.com:$method /', '/app2/default'),
    ('.*:https?://(.*\\.)?domain2.com:$method /static/$anything',
     '/app2/static/$anything'),
    ('.*:https?://(.*\\.)?domain2.com:$method /appadmin/$anything',
     '/app2/appadmin/$anything'),
    ('.*:https?://(.*\\.)?domain2.com:$method /$anything',
     '/app2/default/$anything'),
    ('.*:https?://(.*\\.)?domain3.com:$method /', '/app3/defcon3'),
    ('.*:https?://(.*\\.)?domain3.com:$method /static/$anything',
     '/app3/static/$anything'),
    ('.*:https?://(.*\\.)?domain3.com:$method /appadmin/$anything',
     '/app3/appadmin/$anything'),
    ('.*:https?://(.*\\.)?domain3.com:$method /$anything',
     '/app3/defcon3/$anything'),
    ('/', '/welcome/default'),
    ('/welcome/default/$anything', '/welcome/default/$anything'),
    ('/welcome/$anything', '/welcome/default/$anything'),
    ('/static/$anything', '/welcome/static/$anything'),
    ('/appadmin/$anything', '/welcome/appadmin/$anything'),
    ('/$anything', '/welcome/default/$anything'),
    ]
routes_out = [
    ('/welcome/static/$anything', '/static/$anything'),
    ('/welcome/appadmin/$anything', '/appadmin/$anything'),
    ('/welcome/default/$anything', '/$anything'),
    ('/app1/static/$anything', '/static/$anything'),
    ('/app1/appadmin/$anything', '/appadmin/$anything'),
    ('/app1/default/$anything', '/$anything'),
    ('/app2/static/$anything', '/static/$anything'),
    ('/app2/appadmin/$anything', '/appadmin/$anything'),
    ('/app2/default/$anything', '/$anything'),
    ('/app3/static/$anything', '/static/$anything'),
    ('/app3/appadmin/$anything', '/appadmin/$anything'),
    ('/app3/defcon3/$anything', '/$anything')
    ]
'''
        load(data=data)
        self.assertEqual(
            filter_url('http://domain.com/welcome/default/f/arg1'),
            "/welcome/default/f ['arg1']")
        self.assertEqual(
            filter_url('http://domain.com/welcome/default/f/arg1/'),
            "/welcome/default/f ['arg1']")
        self.assertEqual(
            filter_url('http://domain.com/welcome/default/f/arg1//'),
            "/welcome/default/f ['arg1', '']")
        self.assertEqual(
            filter_url('http://domain.com/welcome/default/f//arg1'),
            "/welcome/default/f ['', 'arg1']")
        self.assertEqual(
            filter_url('http://domain.com/welcome/default/f/arg1/arg2'),
            "/welcome/default/f ['arg1', 'arg2']")
        self.assertEqual(
            filter_url('http://domain.com/welcome/default/f/arg1//arg2'),
            "/welcome/default/f ['arg1', '', 'arg2']")
        self.assertEqual(
            filter_url('http://domain.com/welcome/default/f/arg1//arg3/'),
            "/welcome/default/f ['arg1', '', 'arg3']")
        self.assertEqual(
            filter_url('http://domain.com/welcome/default/f/arg1//arg3//'),
            "/welcome/default/f ['arg1', '', 'arg3', '']")

        self.assertEqual(
            filter_url('http://domain.com/welcome/default/f', out=True), "/f")
        self.assertEqual(regex_filter_out('/welcome/default/f'), "/f")
        self.assertEqual(str(URL(a='welcome', c='default', f='f', args=None)),
                         "/f")
        self.assertEqual(
            str(URL(a='welcome', c='default', f='f', args=['arg1'])),
            "/f/arg1")
        self.assertEqual(
            str(URL(a='welcome', c='default', f='f', args=['arg1', ''])),
            "/f/arg1//")
        self.assertEqual(
            str(URL(a='welcome', c='default', f='f',
                    args=['arg1', '', 'arg3'])), "/f/arg1//arg3")
        self.assertEqual(
            str(URL(a='welcome', c='default', f='f', args=['ar g'])),
            "/f/ar%20g")
        self.assertEqual(
            str(URL(a='welcome', c='default', f='f', args=['årg'])),
            "/f/%C3%A5rg")
        self.assertEqual(str(URL(a='welcome', c='default', f='fünc')),
                         "/f\xc3\xbcnc")
示例#15
0
    def test_routes(self):
        # This tests the ~/routes.py settings.

        # line-too-long (C0301): *Line too long (%%s/%%s)*
        # pylint: disable=C0301
        app_root = '/srv/http/dev.zco.mx/web2py/applications'
        in_tests = [
            # (url, URL)
            ('http://my.domain.com/', '/zcomx/search/index'),
            ('http://my.domain.com/zcomx', '/zcomx/search/index'),

            ('http://my.domain.com/books', '/zcomx/books/index'),
            ('http://my.domain.com/books/index', '/zcomx/books/index'),
            ('http://my.domain.com/books/book', '/zcomx/books/book'),
            ('http://my.domain.com/zcomx/books', '/zcomx/books/index'),
            ('http://my.domain.com/zcomx/books/index', '/zcomx/books/index'),
            ('http://my.domain.com/zcomx/books/book', '/zcomx/books/book'),
            ('http://my.domain.com/zcomx/books/book/1', "/zcomx/books/book ['1']"),

            # Test: creators controller
            ('http://my.domain.com/creators', '/zcomx/creators/index'),
            ('http://my.domain.com/creators/index', '/zcomx/creators/index'),
            ('http://my.domain.com/zcomx/creators', '/zcomx/creators/index'),
            ('http://my.domain.com/zcomx/creators/index', '/zcomx/creators/index'),
            ('https://my.domain.com/zcomx/search/index', '/zcomx/search/index'),

            # Test: default/user/???
            ('http://my.domain.com/login', "/zcomx/default/user ['login']"),
            ('http://my.domain.com/default/user/login', "/zcomx/default/user ['login']"),
            ('http://my.domain.com/default/user/logout', "/zcomx/default/user ['logout']"),

            # Test rss
            ('http://my.domain.com/abc.rss', "/zcomx/rss/route ?rss=abc.rss"),
            ('http://my.domain.com/zcomx/abc.rss', "/zcomx/rss/route ?rss=abc.rss"),
            ('http://my.domain.com/zco.mx.rss', "/zcomx/rss/route ?rss=zco.mx.rss"),
            ('http://my.domain.com/FirstLast(101.zco.mx).rss', "/zcomx/rss/route ?rss=FirstLast(101.zco.mx).rss"),
            ('http://my.domain.com/123/MyBook-001.rss', "/zcomx/rss/route ?creator=123&rss=MyBook-001.rss"),
            ('http://my.domain.com/FirstLast/MyBook-001.rss', "/zcomx/rss/route ?creator=FirstLast&rss=MyBook-001.rss"),

            # Test torrents
            ('http://my.domain.com/abc.torrent', "/zcomx/torrents/route ?torrent=abc.torrent"),
            ('http://my.domain.com/zcomx/abc.torrent', "/zcomx/torrents/route ?torrent=abc.torrent"),
            ('http://my.domain.com/zco.mx.torrent', "/zcomx/torrents/route ?torrent=zco.mx.torrent"),
            ('http://my.domain.com/FirstLast(101.zco.mx).torrent', "/zcomx/torrents/route ?torrent=FirstLast(101.zco.mx).torrent"),
            ('http://my.domain.com/123/My Book 001.torrent', "/zcomx/torrents/route ?creator=123&torrent=My Book 001.torrent"),
            ('http://my.domain.com/FirstLast/My Book 001.torrent', "/zcomx/torrents/route ?creator=FirstLast&torrent=My Book 001.torrent"),

            # Static files
            ('http://my.domain.com/favicon.ico', app_root + '/zcomx/static/images/favicon.ico'),
            ('http://dev.zco.mx/robots.txt', app_root + '/zcomx/static/robots.txt'),
            ('http://my.domain.com/zcomx/static/images/loading/16x16.gif', app_root + '/zcomx/static/images/loading/16x16.gif'),
            ('http://my.domain.com/zcomx/static/css/custom.css', app_root + '/zcomx/static/css/custom.css'),
            ('http://my.domain.com/zcomx/static/js/web2py.js', app_root + '/zcomx/static/js/web2py.js'),

            # Test https
            ('https://my.domain.com/', '/zcomx/search/index'),
            ('https://my.domain.com/zcomx', '/zcomx/search/index'),
            ('https://my.domain.com/books', '/zcomx/books/index'),
            ('https://my.domain.com/books/index', '/zcomx/books/index'),

            # Creator variations
            ('http://my.domain.com/aaa', "/zcomx/creators/index ?creator=aaa"),
            ('http://my.domain.com/aaa/', "/zcomx/creators/index ?creator=aaa"),
            ('http://my.domain.com/aaa/bbb', "/zcomx/creators/index ?creator=aaa&book=bbb"),
            ('http://my.domain.com/aaa/bbb/', "/zcomx/creators/index ?creator=aaa&book=bbb"),
            ('http://my.domain.com/aaa/monies', "/zcomx/creators/index ?creator=aaa&monies=1"),
            ('http://my.domain.com/aaa/monies/', "/zcomx/creators/index ?creator=aaa&monies=1"),
            ('http://my.domain.com/aaa/bbb/ccc', "/zcomx/creators/index ?creator=aaa&book_reader_url=/aaa/bbb/ccc"),
            ('http://my.domain.com/aaa/bbb/ccc/', "/zcomx/creators/index ?creator=aaa&book_reader_url=/aaa/bbb/ccc"),
            ('http://my.domain.com/zcomx/aaa', "/zcomx/creators/index ?creator=aaa"),
            ('http://my.domain.com/zcomx/aaa/', "/zcomx/creators/index ?creator=aaa"),
            ('http://my.domain.com/zcomx/aaa/bbb', "/zcomx/creators/index ?creator=aaa&book=bbb"),
            ('http://my.domain.com/zcomx/aaa/bbb/', "/zcomx/creators/index ?creator=aaa&book=bbb"),
            ('http://my.domain.com/zcomx/aaa/monies', "/zcomx/creators/index ?creator=aaa&monies=1"),
            ('http://my.domain.com/zcomx/aaa/monies/', "/zcomx/creators/index ?creator=aaa&monies=1"),
            ('http://my.domain.com/zcomx/aaa/bbb/ccc', "/zcomx/creators/index ?creator=aaa&book_reader_url=/aaa/bbb/ccc"),
            ('http://my.domain.com/zcomx/aaa/bbb/ccc/', "/zcomx/creators/index ?creator=aaa&book_reader_url=/aaa/bbb/ccc"),

            # Creators
            ('http://my.domain.com/FirstLast', "/zcomx/creators/index ?creator=FirstLast"),
            ('http://my.domain.com/First_M_Last', "/zcomx/creators/index ?creator=First_M_Last"),
            ("http://my.domain.com/First_O'Last", "/zcomx/creators/index ?creator=First_O'Last"),

            # Books
            ('http://my.domain.com/FirstLast/MyBook', '/zcomx/creators/index ?creator=FirstLast&book=MyBook'),
            ('http://my.domain.com/FirstLast/MyBook_(2014)', '/zcomx/creators/index ?creator=FirstLast&book=MyBook_(2014)'),
            ('http://my.domain.com/FirstLast/MyBook_001_(2014)', '/zcomx/creators/index ?creator=FirstLast&book=MyBook_001_(2014)'),
            ('http://my.domain.com/FirstLast/MyBook_01_of_04_(2014)', '/zcomx/creators/index ?creator=FirstLast&book=MyBook_01_of_04_(2014)'),

            # Monies
            ('http://my.domain.com/FirstLast/monies', '/zcomx/creators/index ?creator=FirstLast&monies=1'),
            # if anything after 'monies', assume 'monies' is a book title
            ('http://my.domain.com/zcomx/FirstLast/monies/001', '/zcomx/creators/index ?creator=FirstLast&book_reader_url=/FirstLast/monies/001'),

            # Pages
            ('http://my.domain.com/zcomx/FirstLast/MyBook/001', '/zcomx/creators/index ?creator=FirstLast&book_reader_url=/FirstLast/MyBook/001'),
            ('http://my.domain.com/zcomx/FirstLast/MyBook/001.jpg', '/zcomx/creators/index ?creator=FirstLast&book=MyBook&page=001.jpg'),

            # Embed books.
            ('http://my.domain.com/embed/FirstLast/MyBook', '/zcomx/creators/index ?creator=FirstLast&book=MyBook&page=001&embed=1'),
            ('http://my.domain.com/zcomx/embed/FirstLast/MyBook', '/zcomx/creators/index ?creator=FirstLast&book=MyBook&page=001&embed=1'),
            ('http://my.domain.com/embed/FirstLast/MyBook/003', '/zcomx/creators/index ?creator=FirstLast&book=MyBook&page=003&embed=1'),
            ('http://my.domain.com/zcomx/embed/FirstLast/MyBook/003', '/zcomx/creators/index ?creator=FirstLast&book=MyBook&page=003&embed=1'),

            # Appadmin should be routed like any other url
            ('http://my.domain.com/appadmin', "/zcomx/creators/index ?creator=appadmin"),
            ('http://my.domain.com/zcomx/appadmin', "/zcomx/creators/index ?creator=appadmin"),

            # Invalid controller (treated as creator name)
            ('http://my.domain.com/something', "/zcomx/creators/index ?creator=something"),
        ]
        for t in in_tests:
            self.assertEqual(filter_url(t[0]), t[1])

        # in_tests_exceptions = [
        #     'http://my.domain.com/aaa/bbb/a"bc.def',
        # ]
        # for t in in_tests_exceptions:
        #     self.assertRaises(HTTP, filter_url, t)

        out_tests = [
            # (URL, url)
            ('http://my.domain.com/zcomx/search/index', '/'),

            ('http://my.domain.com/zcomx/books/index', '/books'),
            ('http://my.domain.com/zcomx/books/book/1', '/books/book/1'),
            # Test: creators controller
            ('http://my.domain.com/zcomx/creators/index', '/creators'),

            # Test: default/user/???
            ('http://my.domain.com/zcomx/default/user/login', '/login'),
            ('http://my.domain.com/zcomx/default/user/logout', '/default/user/logout'),

            # Static files
            ('http://my.domain.com/zcomx/static/images/favicon.ico', '/favicon.ico'),
            ('http://dev.zco.mx/zcomx/static/robots.txt', '/robots.txt'),
            ('http://my.domain.com/zcomx/static/images/loading.gif', '/zcomx/static/images/loading.gif'),
            ('http://my.domain.com/zcomx/static/css/custom.css', '/zcomx/static/css/custom.css'),
            ('http://my.domain.com/zcomx/static/js/web2py.js', '/zcomx/static/js/web2py.js'),

            # Test https
            ('https://my.domain.com/zcomx/books/index', '/books'),

            # Creators
            ('http://my.domain.com/creators/index/FirstLast', '/FirstLast'),
            ('http://my.domain.com/zcomx/creators/index/FirstLast', '/FirstLast'),
            ("http://my.domain.com/zcomx/creators/index/First_O'Last", "/First_O'Last"),

            # Test rss
            ('http://my.domain.com/zcomx/abc.rss/index', "/abc.rss"),
            ('http://my.domain.com/zcomx/zco.mx.rss/index', "/zco.mx.rss"),
            ('http://my.domain.com/zcomx/FirstLast(101.zco.mx).rss/index', "/FirstLast(101.zco.mx).rss"),
            ('http://my.domain.com/zcomx/FirstLast/MyBook-001.rss', "/FirstLast/MyBook-001.rss"),

            # Test torrents
            ('http://my.domain.com/zcomx/abc.torrent/index', "/abc.torrent"),
            ('http://my.domain.com/zcomx/zco.mx.torrent/index', "/zco.mx.torrent"),
            ('http://my.domain.com/zcomx/FirstLast(101.zco.mx).torrent/index', "/FirstLast(101.zco.mx).torrent"),
            ('http://my.domain.com/zcomx/FirstLast/My Book 001.torrent', "/FirstLast/My Book 001.torrent"),
        ]
        for t in out_tests:
            self.assertEqual(filter_url(t[0], out=True), t[1])

        self.assertEqual(str(URL(a='zcomx', c='default', f='index')), '/')