tests/test-wsgirequest.py
changeset 43506 9f70512ae2cf
parent 43076 2372284d9457
child 45004 2632c1ed8f34
equal deleted inserted replaced
43505:47fac1692ede 43506:9f70512ae2cf
     4 
     4 
     5 from mercurial.hgweb import request as requestmod
     5 from mercurial.hgweb import request as requestmod
     6 from mercurial import error
     6 from mercurial import error
     7 
     7 
     8 DEFAULT_ENV = {
     8 DEFAULT_ENV = {
     9     r'REQUEST_METHOD': r'GET',
     9     'REQUEST_METHOD': 'GET',
    10     r'SERVER_NAME': r'testserver',
    10     'SERVER_NAME': 'testserver',
    11     r'SERVER_PORT': r'80',
    11     'SERVER_PORT': '80',
    12     r'SERVER_PROTOCOL': r'http',
    12     'SERVER_PROTOCOL': 'http',
    13     r'wsgi.version': (1, 0),
    13     'wsgi.version': (1, 0),
    14     r'wsgi.url_scheme': r'http',
    14     'wsgi.url_scheme': 'http',
    15     r'wsgi.input': None,
    15     'wsgi.input': None,
    16     r'wsgi.errors': None,
    16     'wsgi.errors': None,
    17     r'wsgi.multithread': False,
    17     'wsgi.multithread': False,
    18     r'wsgi.multiprocess': True,
    18     'wsgi.multiprocess': True,
    19     r'wsgi.run_once': False,
    19     'wsgi.run_once': False,
    20 }
    20 }
    21 
    21 
    22 
    22 
    23 def parse(env, reponame=None, altbaseurl=None, extra=None):
    23 def parse(env, reponame=None, altbaseurl=None, extra=None):
    24     env = dict(env)
    24     env = dict(env)
    47         self.assertEqual(r.querystring, b'')
    47         self.assertEqual(r.querystring, b'')
    48         self.assertEqual(len(r.qsparams), 0)
    48         self.assertEqual(len(r.qsparams), 0)
    49         self.assertEqual(len(r.headers), 0)
    49         self.assertEqual(len(r.headers), 0)
    50 
    50 
    51     def testcustomport(self):
    51     def testcustomport(self):
    52         r = parse(DEFAULT_ENV, extra={r'SERVER_PORT': r'8000',})
    52         r = parse(DEFAULT_ENV, extra={'SERVER_PORT': '8000',})
    53 
    53 
    54         self.assertEqual(r.url, b'http://testserver:8000')
    54         self.assertEqual(r.url, b'http://testserver:8000')
    55         self.assertEqual(r.baseurl, b'http://testserver:8000')
    55         self.assertEqual(r.baseurl, b'http://testserver:8000')
    56         self.assertEqual(r.advertisedurl, b'http://testserver:8000')
    56         self.assertEqual(r.advertisedurl, b'http://testserver:8000')
    57         self.assertEqual(r.advertisedbaseurl, b'http://testserver:8000')
    57         self.assertEqual(r.advertisedbaseurl, b'http://testserver:8000')
    58 
    58 
    59         r = parse(
    59         r = parse(
    60             DEFAULT_ENV,
    60             DEFAULT_ENV,
    61             extra={r'SERVER_PORT': r'4000', r'wsgi.url_scheme': r'https',},
    61             extra={'SERVER_PORT': '4000', 'wsgi.url_scheme': 'https',},
    62         )
    62         )
    63 
    63 
    64         self.assertEqual(r.url, b'https://testserver:4000')
    64         self.assertEqual(r.url, b'https://testserver:4000')
    65         self.assertEqual(r.baseurl, b'https://testserver:4000')
    65         self.assertEqual(r.baseurl, b'https://testserver:4000')
    66         self.assertEqual(r.advertisedurl, b'https://testserver:4000')
    66         self.assertEqual(r.advertisedurl, b'https://testserver:4000')
    67         self.assertEqual(r.advertisedbaseurl, b'https://testserver:4000')
    67         self.assertEqual(r.advertisedbaseurl, b'https://testserver:4000')
    68 
    68 
    69     def testhttphost(self):
    69     def testhttphost(self):
    70         r = parse(DEFAULT_ENV, extra={r'HTTP_HOST': r'altserver',})
    70         r = parse(DEFAULT_ENV, extra={'HTTP_HOST': 'altserver',})
    71 
    71 
    72         self.assertEqual(r.url, b'http://altserver')
    72         self.assertEqual(r.url, b'http://altserver')
    73         self.assertEqual(r.baseurl, b'http://altserver')
    73         self.assertEqual(r.baseurl, b'http://altserver')
    74         self.assertEqual(r.advertisedurl, b'http://testserver')
    74         self.assertEqual(r.advertisedurl, b'http://testserver')
    75         self.assertEqual(r.advertisedbaseurl, b'http://testserver')
    75         self.assertEqual(r.advertisedbaseurl, b'http://testserver')
    76 
    76 
    77     def testscriptname(self):
    77     def testscriptname(self):
    78         r = parse(DEFAULT_ENV, extra={r'SCRIPT_NAME': r'',})
    78         r = parse(DEFAULT_ENV, extra={'SCRIPT_NAME': '',})
    79 
    79 
    80         self.assertEqual(r.url, b'http://testserver')
    80         self.assertEqual(r.url, b'http://testserver')
    81         self.assertEqual(r.baseurl, b'http://testserver')
    81         self.assertEqual(r.baseurl, b'http://testserver')
    82         self.assertEqual(r.advertisedurl, b'http://testserver')
    82         self.assertEqual(r.advertisedurl, b'http://testserver')
    83         self.assertEqual(r.advertisedbaseurl, b'http://testserver')
    83         self.assertEqual(r.advertisedbaseurl, b'http://testserver')
    84         self.assertEqual(r.apppath, b'')
    84         self.assertEqual(r.apppath, b'')
    85         self.assertEqual(r.dispatchparts, [])
    85         self.assertEqual(r.dispatchparts, [])
    86         self.assertIsNone(r.dispatchpath)
    86         self.assertIsNone(r.dispatchpath)
    87 
    87 
    88         r = parse(DEFAULT_ENV, extra={r'SCRIPT_NAME': r'/script',})
    88         r = parse(DEFAULT_ENV, extra={'SCRIPT_NAME': '/script',})
    89 
    89 
    90         self.assertEqual(r.url, b'http://testserver/script')
    90         self.assertEqual(r.url, b'http://testserver/script')
    91         self.assertEqual(r.baseurl, b'http://testserver')
    91         self.assertEqual(r.baseurl, b'http://testserver')
    92         self.assertEqual(r.advertisedurl, b'http://testserver/script')
    92         self.assertEqual(r.advertisedurl, b'http://testserver/script')
    93         self.assertEqual(r.advertisedbaseurl, b'http://testserver')
    93         self.assertEqual(r.advertisedbaseurl, b'http://testserver')
    94         self.assertEqual(r.apppath, b'/script')
    94         self.assertEqual(r.apppath, b'/script')
    95         self.assertEqual(r.dispatchparts, [])
    95         self.assertEqual(r.dispatchparts, [])
    96         self.assertIsNone(r.dispatchpath)
    96         self.assertIsNone(r.dispatchpath)
    97 
    97 
    98         r = parse(DEFAULT_ENV, extra={r'SCRIPT_NAME': r'/multiple words',})
    98         r = parse(DEFAULT_ENV, extra={'SCRIPT_NAME': '/multiple words',})
    99 
    99 
   100         self.assertEqual(r.url, b'http://testserver/multiple%20words')
   100         self.assertEqual(r.url, b'http://testserver/multiple%20words')
   101         self.assertEqual(r.baseurl, b'http://testserver')
   101         self.assertEqual(r.baseurl, b'http://testserver')
   102         self.assertEqual(r.advertisedurl, b'http://testserver/multiple%20words')
   102         self.assertEqual(r.advertisedurl, b'http://testserver/multiple%20words')
   103         self.assertEqual(r.advertisedbaseurl, b'http://testserver')
   103         self.assertEqual(r.advertisedbaseurl, b'http://testserver')
   104         self.assertEqual(r.apppath, b'/multiple words')
   104         self.assertEqual(r.apppath, b'/multiple words')
   105         self.assertEqual(r.dispatchparts, [])
   105         self.assertEqual(r.dispatchparts, [])
   106         self.assertIsNone(r.dispatchpath)
   106         self.assertIsNone(r.dispatchpath)
   107 
   107 
   108     def testpathinfo(self):
   108     def testpathinfo(self):
   109         r = parse(DEFAULT_ENV, extra={r'PATH_INFO': r'',})
   109         r = parse(DEFAULT_ENV, extra={'PATH_INFO': '',})
   110 
   110 
   111         self.assertEqual(r.url, b'http://testserver')
   111         self.assertEqual(r.url, b'http://testserver')
   112         self.assertEqual(r.baseurl, b'http://testserver')
   112         self.assertEqual(r.baseurl, b'http://testserver')
   113         self.assertEqual(r.advertisedurl, b'http://testserver')
   113         self.assertEqual(r.advertisedurl, b'http://testserver')
   114         self.assertEqual(r.advertisedbaseurl, b'http://testserver')
   114         self.assertEqual(r.advertisedbaseurl, b'http://testserver')
   115         self.assertEqual(r.apppath, b'')
   115         self.assertEqual(r.apppath, b'')
   116         self.assertEqual(r.dispatchparts, [])
   116         self.assertEqual(r.dispatchparts, [])
   117         self.assertEqual(r.dispatchpath, b'')
   117         self.assertEqual(r.dispatchpath, b'')
   118 
   118 
   119         r = parse(DEFAULT_ENV, extra={r'PATH_INFO': r'/pathinfo',})
   119         r = parse(DEFAULT_ENV, extra={'PATH_INFO': '/pathinfo',})
   120 
   120 
   121         self.assertEqual(r.url, b'http://testserver/pathinfo')
   121         self.assertEqual(r.url, b'http://testserver/pathinfo')
   122         self.assertEqual(r.baseurl, b'http://testserver')
   122         self.assertEqual(r.baseurl, b'http://testserver')
   123         self.assertEqual(r.advertisedurl, b'http://testserver/pathinfo')
   123         self.assertEqual(r.advertisedurl, b'http://testserver/pathinfo')
   124         self.assertEqual(r.advertisedbaseurl, b'http://testserver')
   124         self.assertEqual(r.advertisedbaseurl, b'http://testserver')
   125         self.assertEqual(r.apppath, b'')
   125         self.assertEqual(r.apppath, b'')
   126         self.assertEqual(r.dispatchparts, [b'pathinfo'])
   126         self.assertEqual(r.dispatchparts, [b'pathinfo'])
   127         self.assertEqual(r.dispatchpath, b'pathinfo')
   127         self.assertEqual(r.dispatchpath, b'pathinfo')
   128 
   128 
   129         r = parse(DEFAULT_ENV, extra={r'PATH_INFO': r'/one/two/',})
   129         r = parse(DEFAULT_ENV, extra={'PATH_INFO': '/one/two/',})
   130 
   130 
   131         self.assertEqual(r.url, b'http://testserver/one/two/')
   131         self.assertEqual(r.url, b'http://testserver/one/two/')
   132         self.assertEqual(r.baseurl, b'http://testserver')
   132         self.assertEqual(r.baseurl, b'http://testserver')
   133         self.assertEqual(r.advertisedurl, b'http://testserver/one/two/')
   133         self.assertEqual(r.advertisedurl, b'http://testserver/one/two/')
   134         self.assertEqual(r.advertisedbaseurl, b'http://testserver')
   134         self.assertEqual(r.advertisedbaseurl, b'http://testserver')
   137         self.assertEqual(r.dispatchpath, b'one/two')
   137         self.assertEqual(r.dispatchpath, b'one/two')
   138 
   138 
   139     def testscriptandpathinfo(self):
   139     def testscriptandpathinfo(self):
   140         r = parse(
   140         r = parse(
   141             DEFAULT_ENV,
   141             DEFAULT_ENV,
   142             extra={r'SCRIPT_NAME': r'/script', r'PATH_INFO': r'/pathinfo',},
   142             extra={'SCRIPT_NAME': '/script', 'PATH_INFO': '/pathinfo',},
   143         )
   143         )
   144 
   144 
   145         self.assertEqual(r.url, b'http://testserver/script/pathinfo')
   145         self.assertEqual(r.url, b'http://testserver/script/pathinfo')
   146         self.assertEqual(r.baseurl, b'http://testserver')
   146         self.assertEqual(r.baseurl, b'http://testserver')
   147         self.assertEqual(r.advertisedurl, b'http://testserver/script/pathinfo')
   147         self.assertEqual(r.advertisedurl, b'http://testserver/script/pathinfo')
   151         self.assertEqual(r.dispatchpath, b'pathinfo')
   151         self.assertEqual(r.dispatchpath, b'pathinfo')
   152 
   152 
   153         r = parse(
   153         r = parse(
   154             DEFAULT_ENV,
   154             DEFAULT_ENV,
   155             extra={
   155             extra={
   156                 r'SCRIPT_NAME': r'/script1/script2',
   156                 'SCRIPT_NAME': '/script1/script2',
   157                 r'PATH_INFO': r'/path1/path2',
   157                 'PATH_INFO': '/path1/path2',
   158             },
   158             },
   159         )
   159         )
   160 
   160 
   161         self.assertEqual(
   161         self.assertEqual(
   162             r.url, b'http://testserver/script1/script2/path1/path2'
   162             r.url, b'http://testserver/script1/script2/path1/path2'
   171         self.assertEqual(r.dispatchpath, b'path1/path2')
   171         self.assertEqual(r.dispatchpath, b'path1/path2')
   172 
   172 
   173         r = parse(
   173         r = parse(
   174             DEFAULT_ENV,
   174             DEFAULT_ENV,
   175             extra={
   175             extra={
   176                 r'HTTP_HOST': r'hostserver',
   176                 'HTTP_HOST': 'hostserver',
   177                 r'SCRIPT_NAME': r'/script',
   177                 'SCRIPT_NAME': '/script',
   178                 r'PATH_INFO': r'/pathinfo',
   178                 'PATH_INFO': '/pathinfo',
   179             },
   179             },
   180         )
   180         )
   181 
   181 
   182         self.assertEqual(r.url, b'http://hostserver/script/pathinfo')
   182         self.assertEqual(r.url, b'http://hostserver/script/pathinfo')
   183         self.assertEqual(r.baseurl, b'http://hostserver')
   183         self.assertEqual(r.baseurl, b'http://hostserver')
   206             error.ProgrammingError, 'PATH_INFO does not begin with repo ' 'name'
   206             error.ProgrammingError, 'PATH_INFO does not begin with repo ' 'name'
   207         ):
   207         ):
   208             parse(
   208             parse(
   209                 DEFAULT_ENV,
   209                 DEFAULT_ENV,
   210                 reponame=b'repo',
   210                 reponame=b'repo',
   211                 extra={r'PATH_INFO': r'/pathinfo',},
   211                 extra={'PATH_INFO': '/pathinfo',},
   212             )
   212             )
   213 
   213 
   214         with self.assertRaisesRegex(
   214         with self.assertRaisesRegex(
   215             error.ProgrammingError, 'reponame prefix of PATH_INFO'
   215             error.ProgrammingError, 'reponame prefix of PATH_INFO'
   216         ):
   216         ):
   217             parse(
   217             parse(
   218                 DEFAULT_ENV,
   218                 DEFAULT_ENV,
   219                 reponame=b'repo',
   219                 reponame=b'repo',
   220                 extra={r'PATH_INFO': r'/repoextra/path',},
   220                 extra={'PATH_INFO': '/repoextra/path',},
   221             )
   221             )
   222 
   222 
   223         r = parse(
   223         r = parse(
   224             DEFAULT_ENV,
   224             DEFAULT_ENV,
   225             reponame=b'repo',
   225             reponame=b'repo',
   226             extra={r'PATH_INFO': r'/repo/path1/path2',},
   226             extra={'PATH_INFO': '/repo/path1/path2',},
   227         )
   227         )
   228 
   228 
   229         self.assertEqual(r.url, b'http://testserver/repo/path1/path2')
   229         self.assertEqual(r.url, b'http://testserver/repo/path1/path2')
   230         self.assertEqual(r.baseurl, b'http://testserver')
   230         self.assertEqual(r.baseurl, b'http://testserver')
   231         self.assertEqual(r.advertisedurl, b'http://testserver/repo/path1/path2')
   231         self.assertEqual(r.advertisedurl, b'http://testserver/repo/path1/path2')
   236         self.assertEqual(r.reponame, b'repo')
   236         self.assertEqual(r.reponame, b'repo')
   237 
   237 
   238         r = parse(
   238         r = parse(
   239             DEFAULT_ENV,
   239             DEFAULT_ENV,
   240             reponame=b'prefix/repo',
   240             reponame=b'prefix/repo',
   241             extra={r'PATH_INFO': r'/prefix/repo/path1/path2',},
   241             extra={'PATH_INFO': '/prefix/repo/path1/path2',},
   242         )
   242         )
   243 
   243 
   244         self.assertEqual(r.url, b'http://testserver/prefix/repo/path1/path2')
   244         self.assertEqual(r.url, b'http://testserver/prefix/repo/path1/path2')
   245         self.assertEqual(r.baseurl, b'http://testserver')
   245         self.assertEqual(r.baseurl, b'http://testserver')
   246         self.assertEqual(
   246         self.assertEqual(
   305 
   305 
   306         # With only PATH_INFO defined.
   306         # With only PATH_INFO defined.
   307         r = parse(
   307         r = parse(
   308             DEFAULT_ENV,
   308             DEFAULT_ENV,
   309             altbaseurl=b'http://altserver',
   309             altbaseurl=b'http://altserver',
   310             extra={r'PATH_INFO': r'/path1/path2',},
   310             extra={'PATH_INFO': '/path1/path2',},
   311         )
   311         )
   312         self.assertEqual(r.url, b'http://testserver/path1/path2')
   312         self.assertEqual(r.url, b'http://testserver/path1/path2')
   313         self.assertEqual(r.baseurl, b'http://testserver')
   313         self.assertEqual(r.baseurl, b'http://testserver')
   314         self.assertEqual(r.advertisedurl, b'http://altserver/path1/path2')
   314         self.assertEqual(r.advertisedurl, b'http://altserver/path1/path2')
   315         self.assertEqual(r.advertisedbaseurl, b'http://altserver')
   315         self.assertEqual(r.advertisedbaseurl, b'http://altserver')
   345 
   345 
   346         # PATH_INFO + path on alt URL.
   346         # PATH_INFO + path on alt URL.
   347         r = parse(
   347         r = parse(
   348             DEFAULT_ENV,
   348             DEFAULT_ENV,
   349             altbaseurl=b'http://altserver/altpath',
   349             altbaseurl=b'http://altserver/altpath',
   350             extra={r'PATH_INFO': r'/path1/path2',},
   350             extra={'PATH_INFO': '/path1/path2',},
   351         )
   351         )
   352         self.assertEqual(r.url, b'http://testserver/path1/path2')
   352         self.assertEqual(r.url, b'http://testserver/path1/path2')
   353         self.assertEqual(r.baseurl, b'http://testserver')
   353         self.assertEqual(r.baseurl, b'http://testserver')
   354         self.assertEqual(
   354         self.assertEqual(
   355             r.advertisedurl, b'http://altserver/altpath/path1/path2'
   355             r.advertisedurl, b'http://altserver/altpath/path1/path2'
   363 
   363 
   364         # PATH_INFO + path on alt URL with trailing slash.
   364         # PATH_INFO + path on alt URL with trailing slash.
   365         r = parse(
   365         r = parse(
   366             DEFAULT_ENV,
   366             DEFAULT_ENV,
   367             altbaseurl=b'http://altserver/altpath/',
   367             altbaseurl=b'http://altserver/altpath/',
   368             extra={r'PATH_INFO': r'/path1/path2',},
   368             extra={'PATH_INFO': '/path1/path2',},
   369         )
   369         )
   370         self.assertEqual(r.url, b'http://testserver/path1/path2')
   370         self.assertEqual(r.url, b'http://testserver/path1/path2')
   371         self.assertEqual(r.baseurl, b'http://testserver')
   371         self.assertEqual(r.baseurl, b'http://testserver')
   372         self.assertEqual(
   372         self.assertEqual(
   373             r.advertisedurl, b'http://altserver/altpath//path1/path2'
   373             r.advertisedurl, b'http://altserver/altpath//path1/path2'
   381 
   381 
   382         # Local SCRIPT_NAME is ignored.
   382         # Local SCRIPT_NAME is ignored.
   383         r = parse(
   383         r = parse(
   384             DEFAULT_ENV,
   384             DEFAULT_ENV,
   385             altbaseurl=b'http://altserver',
   385             altbaseurl=b'http://altserver',
   386             extra={r'SCRIPT_NAME': r'/script', r'PATH_INFO': r'/path1/path2',},
   386             extra={'SCRIPT_NAME': '/script', 'PATH_INFO': '/path1/path2',},
   387         )
   387         )
   388         self.assertEqual(r.url, b'http://testserver/script/path1/path2')
   388         self.assertEqual(r.url, b'http://testserver/script/path1/path2')
   389         self.assertEqual(r.baseurl, b'http://testserver')
   389         self.assertEqual(r.baseurl, b'http://testserver')
   390         self.assertEqual(r.advertisedurl, b'http://altserver/path1/path2')
   390         self.assertEqual(r.advertisedurl, b'http://altserver/path1/path2')
   391         self.assertEqual(r.advertisedbaseurl, b'http://altserver')
   391         self.assertEqual(r.advertisedbaseurl, b'http://altserver')
   397 
   397 
   398         # Use remote's path for script name, app path
   398         # Use remote's path for script name, app path
   399         r = parse(
   399         r = parse(
   400             DEFAULT_ENV,
   400             DEFAULT_ENV,
   401             altbaseurl=b'http://altserver/altroot',
   401             altbaseurl=b'http://altserver/altroot',
   402             extra={r'SCRIPT_NAME': r'/script', r'PATH_INFO': r'/path1/path2',},
   402             extra={'SCRIPT_NAME': '/script', 'PATH_INFO': '/path1/path2',},
   403         )
   403         )
   404         self.assertEqual(r.url, b'http://testserver/script/path1/path2')
   404         self.assertEqual(r.url, b'http://testserver/script/path1/path2')
   405         self.assertEqual(r.baseurl, b'http://testserver')
   405         self.assertEqual(r.baseurl, b'http://testserver')
   406         self.assertEqual(
   406         self.assertEqual(
   407             r.advertisedurl, b'http://altserver/altroot/path1/path2'
   407             r.advertisedurl, b'http://altserver/altroot/path1/path2'
   416         # reponame is factored in properly.
   416         # reponame is factored in properly.
   417         r = parse(
   417         r = parse(
   418             DEFAULT_ENV,
   418             DEFAULT_ENV,
   419             reponame=b'repo',
   419             reponame=b'repo',
   420             altbaseurl=b'http://altserver/altroot',
   420             altbaseurl=b'http://altserver/altroot',
   421             extra={
   421             extra={'SCRIPT_NAME': '/script', 'PATH_INFO': '/repo/path1/path2',},
   422                 r'SCRIPT_NAME': r'/script',
       
   423                 r'PATH_INFO': r'/repo/path1/path2',
       
   424             },
       
   425         )
   422         )
   426 
   423 
   427         self.assertEqual(r.url, b'http://testserver/script/repo/path1/path2')
   424         self.assertEqual(r.url, b'http://testserver/script/repo/path1/path2')
   428         self.assertEqual(r.baseurl, b'http://testserver')
   425         self.assertEqual(r.baseurl, b'http://testserver')
   429         self.assertEqual(
   426         self.assertEqual(