tests/test-wsgirequest.py
changeset 36900 219b23359f4c
parent 36898 d0b0fedbfb53
child 36911 f0a851542a05
equal deleted inserted replaced
36899:e67a2e05fa8a 36900:219b23359f4c
    21     r'wsgi.multithread': False,
    21     r'wsgi.multithread': False,
    22     r'wsgi.multiprocess': True,
    22     r'wsgi.multiprocess': True,
    23     r'wsgi.run_once': False,
    23     r'wsgi.run_once': False,
    24 }
    24 }
    25 
    25 
    26 def parse(env, bodyfh=None, reponame=None, extra=None):
    26 def parse(env, bodyfh=None, reponame=None, altbaseurl=None, extra=None):
    27     env = dict(env)
    27     env = dict(env)
    28     env.update(extra or {})
    28     env.update(extra or {})
    29 
    29 
    30     return requestmod.parserequestfromenv(env, bodyfh, reponame=reponame)
    30     return requestmod.parserequestfromenv(env, bodyfh, reponame=reponame,
       
    31                                           altbaseurl=altbaseurl)
    31 
    32 
    32 class ParseRequestTests(unittest.TestCase):
    33 class ParseRequestTests(unittest.TestCase):
    33     def testdefault(self):
    34     def testdefault(self):
    34         r = parse(DEFAULT_ENV)
    35         r = parse(DEFAULT_ENV)
    35         self.assertEqual(r.url, b'http://testserver')
    36         self.assertEqual(r.url, b'http://testserver')
   240         self.assertEqual(r.apppath, b'/prefix/repo')
   241         self.assertEqual(r.apppath, b'/prefix/repo')
   241         self.assertEqual(r.dispatchparts, [b'path1', b'path2'])
   242         self.assertEqual(r.dispatchparts, [b'path1', b'path2'])
   242         self.assertEqual(r.dispatchpath, b'path1/path2')
   243         self.assertEqual(r.dispatchpath, b'path1/path2')
   243         self.assertEqual(r.reponame, b'prefix/repo')
   244         self.assertEqual(r.reponame, b'prefix/repo')
   244 
   245 
       
   246     def testaltbaseurl(self):
       
   247         # Simple hostname remap.
       
   248         r = parse(DEFAULT_ENV, altbaseurl='http://altserver')
       
   249 
       
   250         self.assertEqual(r.url, b'http://testserver')
       
   251         self.assertEqual(r.baseurl, b'http://testserver')
       
   252         self.assertEqual(r.advertisedurl, b'http://altserver')
       
   253         self.assertEqual(r.advertisedbaseurl, b'http://altserver')
       
   254         self.assertEqual(r.urlscheme, b'http')
       
   255         self.assertEqual(r.apppath, b'')
       
   256         self.assertEqual(r.dispatchparts, [])
       
   257         self.assertIsNone(r.dispatchpath)
       
   258         self.assertIsNone(r.reponame)
       
   259 
       
   260         # With a custom port.
       
   261         r = parse(DEFAULT_ENV, altbaseurl='http://altserver:8000')
       
   262         self.assertEqual(r.url, b'http://testserver')
       
   263         self.assertEqual(r.baseurl, b'http://testserver')
       
   264         self.assertEqual(r.advertisedurl, b'http://altserver:8000')
       
   265         self.assertEqual(r.advertisedbaseurl, b'http://altserver:8000')
       
   266         self.assertEqual(r.urlscheme, b'http')
       
   267         self.assertEqual(r.apppath, b'')
       
   268         self.assertEqual(r.dispatchparts, [])
       
   269         self.assertIsNone(r.dispatchpath)
       
   270         self.assertIsNone(r.reponame)
       
   271 
       
   272         # With a changed protocol.
       
   273         r = parse(DEFAULT_ENV, altbaseurl='https://altserver')
       
   274         self.assertEqual(r.url, b'http://testserver')
       
   275         self.assertEqual(r.baseurl, b'http://testserver')
       
   276         self.assertEqual(r.advertisedurl, b'https://altserver')
       
   277         self.assertEqual(r.advertisedbaseurl, b'https://altserver')
       
   278         # URL scheme is defined as the actual scheme, not advertised.
       
   279         self.assertEqual(r.urlscheme, b'http')
       
   280         self.assertEqual(r.apppath, b'')
       
   281         self.assertEqual(r.dispatchparts, [])
       
   282         self.assertIsNone(r.dispatchpath)
       
   283         self.assertIsNone(r.reponame)
       
   284 
       
   285         # Need to specify explicit port number for proper https:// alt URLs.
       
   286         r = parse(DEFAULT_ENV, altbaseurl='https://altserver:443')
       
   287         self.assertEqual(r.url, b'http://testserver')
       
   288         self.assertEqual(r.baseurl, b'http://testserver')
       
   289         self.assertEqual(r.advertisedurl, b'https://altserver')
       
   290         self.assertEqual(r.advertisedbaseurl, b'https://altserver')
       
   291         self.assertEqual(r.urlscheme, b'http')
       
   292         self.assertEqual(r.apppath, b'')
       
   293         self.assertEqual(r.dispatchparts, [])
       
   294         self.assertIsNone(r.dispatchpath)
       
   295         self.assertIsNone(r.reponame)
       
   296 
       
   297         # With only PATH_INFO defined.
       
   298         r = parse(DEFAULT_ENV, altbaseurl='http://altserver', extra={
       
   299             r'PATH_INFO': r'/path1/path2',
       
   300         })
       
   301         self.assertEqual(r.url, b'http://testserver/path1/path2')
       
   302         self.assertEqual(r.baseurl, b'http://testserver')
       
   303         self.assertEqual(r.advertisedurl, b'http://altserver/path1/path2')
       
   304         self.assertEqual(r.advertisedbaseurl, b'http://altserver')
       
   305         self.assertEqual(r.urlscheme, b'http')
       
   306         self.assertEqual(r.apppath, b'')
       
   307         self.assertEqual(r.dispatchparts, [b'path1', b'path2'])
       
   308         self.assertEqual(r.dispatchpath, b'path1/path2')
       
   309         self.assertIsNone(r.reponame)
       
   310 
       
   311         # Path on alt URL.
       
   312         r = parse(DEFAULT_ENV, altbaseurl='http://altserver/altpath')
       
   313         self.assertEqual(r.url, b'http://testserver')
       
   314         self.assertEqual(r.baseurl, b'http://testserver')
       
   315         self.assertEqual(r.advertisedurl, b'http://altserver/altpath')
       
   316         self.assertEqual(r.advertisedbaseurl, b'http://altserver')
       
   317         self.assertEqual(r.urlscheme, b'http')
       
   318         self.assertEqual(r.apppath, b'/altpath')
       
   319         self.assertEqual(r.dispatchparts, [])
       
   320         self.assertIsNone(r.dispatchpath)
       
   321         self.assertIsNone(r.reponame)
       
   322 
       
   323         # With a trailing slash.
       
   324         r = parse(DEFAULT_ENV, altbaseurl='http://altserver/altpath/')
       
   325         self.assertEqual(r.url, b'http://testserver')
       
   326         self.assertEqual(r.baseurl, b'http://testserver')
       
   327         self.assertEqual(r.advertisedurl, b'http://altserver/altpath/')
       
   328         self.assertEqual(r.advertisedbaseurl, b'http://altserver')
       
   329         self.assertEqual(r.urlscheme, b'http')
       
   330         self.assertEqual(r.apppath, b'/altpath/')
       
   331         self.assertEqual(r.dispatchparts, [])
       
   332         self.assertIsNone(r.dispatchpath)
       
   333         self.assertIsNone(r.reponame)
       
   334 
       
   335         # PATH_INFO + path on alt URL.
       
   336         r = parse(DEFAULT_ENV, altbaseurl='http://altserver/altpath', extra={
       
   337             r'PATH_INFO': r'/path1/path2',
       
   338         })
       
   339         self.assertEqual(r.url, b'http://testserver/path1/path2')
       
   340         self.assertEqual(r.baseurl, b'http://testserver')
       
   341         self.assertEqual(r.advertisedurl,
       
   342                          b'http://altserver/altpath/path1/path2')
       
   343         self.assertEqual(r.advertisedbaseurl, b'http://altserver')
       
   344         self.assertEqual(r.urlscheme, b'http')
       
   345         self.assertEqual(r.apppath, b'/altpath')
       
   346         self.assertEqual(r.dispatchparts, [b'path1', b'path2'])
       
   347         self.assertEqual(r.dispatchpath, b'path1/path2')
       
   348         self.assertIsNone(r.reponame)
       
   349 
       
   350         # PATH_INFO + path on alt URL with trailing slash.
       
   351         r = parse(DEFAULT_ENV, altbaseurl='http://altserver/altpath/', extra={
       
   352             r'PATH_INFO': r'/path1/path2',
       
   353         })
       
   354         self.assertEqual(r.url, b'http://testserver/path1/path2')
       
   355         self.assertEqual(r.baseurl, b'http://testserver')
       
   356         self.assertEqual(r.advertisedurl,
       
   357                          b'http://altserver/altpath//path1/path2')
       
   358         self.assertEqual(r.advertisedbaseurl, b'http://altserver')
       
   359         self.assertEqual(r.urlscheme, b'http')
       
   360         self.assertEqual(r.apppath, b'/altpath/')
       
   361         self.assertEqual(r.dispatchparts, [b'path1', b'path2'])
       
   362         self.assertEqual(r.dispatchpath, b'path1/path2')
       
   363         self.assertIsNone(r.reponame)
       
   364 
       
   365         # Local SCRIPT_NAME is ignored.
       
   366         r = parse(DEFAULT_ENV, altbaseurl='http://altserver', extra={
       
   367             r'SCRIPT_NAME': r'/script',
       
   368             r'PATH_INFO': r'/path1/path2',
       
   369         })
       
   370         self.assertEqual(r.url, b'http://testserver/script/path1/path2')
       
   371         self.assertEqual(r.baseurl, b'http://testserver')
       
   372         self.assertEqual(r.advertisedurl, b'http://altserver/path1/path2')
       
   373         self.assertEqual(r.advertisedbaseurl, b'http://altserver')
       
   374         self.assertEqual(r.urlscheme, b'http')
       
   375         self.assertEqual(r.apppath, b'')
       
   376         self.assertEqual(r.dispatchparts, [b'path1', b'path2'])
       
   377         self.assertEqual(r.dispatchpath, b'path1/path2')
       
   378         self.assertIsNone(r.reponame)
       
   379 
       
   380         # Use remote's path for script name, app path
       
   381         r = parse(DEFAULT_ENV, altbaseurl='http://altserver/altroot', extra={
       
   382             r'SCRIPT_NAME': r'/script',
       
   383             r'PATH_INFO': r'/path1/path2',
       
   384         })
       
   385         self.assertEqual(r.url, b'http://testserver/script/path1/path2')
       
   386         self.assertEqual(r.baseurl, b'http://testserver')
       
   387         self.assertEqual(r.advertisedurl,
       
   388                          b'http://altserver/altroot/path1/path2')
       
   389         self.assertEqual(r.advertisedbaseurl, b'http://altserver')
       
   390         self.assertEqual(r.urlscheme, b'http')
       
   391         self.assertEqual(r.apppath, b'/altroot')
       
   392         self.assertEqual(r.dispatchparts, [b'path1', b'path2'])
       
   393         self.assertEqual(r.dispatchpath, b'path1/path2')
       
   394         self.assertIsNone(r.reponame)
       
   395 
       
   396         # reponame is factored in properly.
       
   397         r = parse(DEFAULT_ENV, reponame=b'repo',
       
   398                   altbaseurl='http://altserver/altroot',
       
   399                   extra={
       
   400                 r'SCRIPT_NAME': r'/script',
       
   401                 r'PATH_INFO': r'/repo/path1/path2',
       
   402             })
       
   403 
       
   404         self.assertEqual(r.url, b'http://testserver/script/repo/path1/path2')
       
   405         self.assertEqual(r.baseurl, b'http://testserver')
       
   406         self.assertEqual(r.advertisedurl,
       
   407                          b'http://altserver/altroot/repo/path1/path2')
       
   408         self.assertEqual(r.advertisedbaseurl, b'http://altserver')
       
   409         self.assertEqual(r.apppath, b'/altroot/repo')
       
   410         self.assertEqual(r.dispatchparts, [b'path1', b'path2'])
       
   411         self.assertEqual(r.dispatchpath, b'path1/path2')
       
   412         self.assertEqual(r.reponame, b'repo')
       
   413 
   245 if __name__ == '__main__':
   414 if __name__ == '__main__':
   246     import silenttestrunner
   415     import silenttestrunner
   247     silenttestrunner.main(__name__)
   416     silenttestrunner.main(__name__)