changeset 43506 | 9f70512ae2cf |
parent 43076 | 2372284d9457 |
child 45004 | 2632c1ed8f34 |
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( |