Mercurial > public > mercurial-scm > hg
comparison mercurial/hgweb/hgweb_mod.py @ 34704:c51380879054
hgweb: rewrite most obviously-native-strings to be native strings
This clearly won't be everything, but it unblocks a fair amount of
stuff here.
Differential Revision: https://phab.mercurial-scm.org/D1079
author | Augie Fackler <augie@google.com> |
---|---|
date | Sat, 14 Oct 2017 15:42:38 -0400 |
parents | d1fccbd50fcd |
children | b2601c5977a4 |
comparison
equal
deleted
inserted
replaced
34703:d1fccbd50fcd | 34704:c51380879054 |
---|---|
163 default_port = '443' | 163 default_port = '443' |
164 else: | 164 else: |
165 proto = 'http' | 165 proto = 'http' |
166 default_port = '80' | 166 default_port = '80' |
167 | 167 |
168 port = req.env['SERVER_PORT'] | 168 port = req.env[r'SERVER_PORT'] |
169 port = port != default_port and (':' + port) or '' | 169 port = port != default_port and (r':' + port) or r'' |
170 urlbase = '%s://%s%s' % (proto, req.env['SERVER_NAME'], port) | 170 urlbase = r'%s://%s%s' % (proto, req.env[r'SERVER_NAME'], port) |
171 logourl = self.config('web', 'logourl') | 171 logourl = self.config('web', 'logourl') |
172 logoimg = self.config('web', 'logoimg') | 172 logoimg = self.config('web', 'logoimg') |
173 staticurl = self.config('web', 'staticurl') or req.url + 'static/' | 173 staticurl = self.config('web', 'staticurl') or req.url + 'static/' |
174 if not staticurl.endswith('/'): | 174 if not staticurl.endswith('/'): |
175 staticurl += '/' | 175 staticurl += '/' |
339 req.headers.append(('Content-Security-Policy', rctx.csp)) | 339 req.headers.append(('Content-Security-Policy', rctx.csp)) |
340 | 340 |
341 # work with CGI variables to create coherent structure | 341 # work with CGI variables to create coherent structure |
342 # use SCRIPT_NAME, PATH_INFO and QUERY_STRING as well as our REPO_NAME | 342 # use SCRIPT_NAME, PATH_INFO and QUERY_STRING as well as our REPO_NAME |
343 | 343 |
344 req.url = req.env['SCRIPT_NAME'] | 344 req.url = req.env[r'SCRIPT_NAME'] |
345 if not req.url.endswith('/'): | 345 if not req.url.endswith('/'): |
346 req.url += '/' | 346 req.url += '/' |
347 if req.env.get('REPO_NAME'): | 347 if req.env.get('REPO_NAME'): |
348 req.url += req.env['REPO_NAME'] + '/' | 348 req.url += req.env[r'REPO_NAME'] + r'/' |
349 | 349 |
350 if 'PATH_INFO' in req.env: | 350 if r'PATH_INFO' in req.env: |
351 parts = req.env['PATH_INFO'].strip('/').split('/') | 351 parts = req.env[r'PATH_INFO'].strip('/').split('/') |
352 repo_parts = req.env.get('REPO_NAME', '').split('/') | 352 repo_parts = req.env.get(r'REPO_NAME', r'').split(r'/') |
353 if parts[:len(repo_parts)] == repo_parts: | 353 if parts[:len(repo_parts)] == repo_parts: |
354 parts = parts[len(repo_parts):] | 354 parts = parts[len(repo_parts):] |
355 query = '/'.join(parts) | 355 query = '/'.join(parts) |
356 else: | 356 else: |
357 query = req.env['QUERY_STRING'].partition('&')[0] | 357 query = req.env[r'QUERY_STRING'].partition(r'&')[0] |
358 query = query.partition(';')[0] | 358 query = query.partition(r';')[0] |
359 | 359 |
360 # process this if it's a protocol request | 360 # process this if it's a protocol request |
361 # protocol bits don't need to create any URLs | 361 # protocol bits don't need to create any URLs |
362 # and the clients always use the old URL structure | 362 # and the clients always use the old URL structure |
363 | 363 |
364 cmd = req.form.get('cmd', [''])[0] | 364 cmd = pycompat.sysbytes(req.form.get(r'cmd', [r''])[0]) |
365 if protocol.iscmd(cmd): | 365 if protocol.iscmd(cmd): |
366 try: | 366 try: |
367 if query: | 367 if query: |
368 raise ErrorResponse(HTTP_NOT_FOUND) | 368 raise ErrorResponse(HTTP_NOT_FOUND) |
369 if cmd in perms: | 369 if cmd in perms: |
384 return '' | 384 return '' |
385 | 385 |
386 # translate user-visible url structure to internal structure | 386 # translate user-visible url structure to internal structure |
387 | 387 |
388 args = query.split('/', 2) | 388 args = query.split('/', 2) |
389 if 'cmd' not in req.form and args and args[0]: | 389 if r'cmd' not in req.form and args and args[0]: |
390 | |
391 cmd = args.pop(0) | 390 cmd = args.pop(0) |
392 style = cmd.rfind('-') | 391 style = cmd.rfind('-') |
393 if style != -1: | 392 if style != -1: |
394 req.form['style'] = [cmd[:style]] | 393 req.form['style'] = [cmd[:style]] |
395 cmd = cmd[style + 1:] | 394 cmd = cmd[style + 1:] |
396 | 395 |
397 # avoid accepting e.g. style parameter as command | 396 # avoid accepting e.g. style parameter as command |
398 if util.safehasattr(webcommands, cmd): | 397 if util.safehasattr(webcommands, cmd): |
399 req.form['cmd'] = [cmd] | 398 req.form[r'cmd'] = [cmd] |
400 | 399 |
401 if cmd == 'static': | 400 if cmd == 'static': |
402 req.form['file'] = ['/'.join(args)] | 401 req.form['file'] = ['/'.join(args)] |
403 else: | 402 else: |
404 if args and args[0]: | 403 if args and args[0]: |
429 # check read permissions non-static content | 428 # check read permissions non-static content |
430 if cmd != 'static': | 429 if cmd != 'static': |
431 self.check_perm(rctx, req, None) | 430 self.check_perm(rctx, req, None) |
432 | 431 |
433 if cmd == '': | 432 if cmd == '': |
434 req.form['cmd'] = [tmpl.cache['default']] | 433 req.form[r'cmd'] = [tmpl.cache['default']] |
435 cmd = req.form['cmd'][0] | 434 cmd = req.form[r'cmd'][0] |
436 | 435 |
437 # Don't enable caching if using a CSP nonce because then it wouldn't | 436 # Don't enable caching if using a CSP nonce because then it wouldn't |
438 # be a nonce. | 437 # be a nonce. |
439 if rctx.configbool('web', 'cache') and not rctx.nonce: | 438 if rctx.configbool('web', 'cache') and not rctx.nonce: |
440 caching(self, req) # sets ETag header or raises NOT_MODIFIED | 439 caching(self, req) # sets ETag header or raises NOT_MODIFIED |
441 if cmd not in webcommands.__all__: | 440 if cmd not in webcommands.__all__: |
442 msg = 'no such method: %s' % cmd | 441 msg = 'no such method: %s' % cmd |
443 raise ErrorResponse(HTTP_BAD_REQUEST, msg) | 442 raise ErrorResponse(HTTP_BAD_REQUEST, msg) |
444 elif cmd == 'file' and 'raw' in req.form.get('style', []): | 443 elif cmd == 'file' and r'raw' in req.form.get(r'style', []): |
445 rctx.ctype = ctype | 444 rctx.ctype = ctype |
446 content = webcommands.rawfile(rctx, req, tmpl) | 445 content = webcommands.rawfile(rctx, req, tmpl) |
447 else: | 446 else: |
448 content = getattr(webcommands, cmd)(rctx, req, tmpl) | 447 content = getattr(webcommands, cmd)(rctx, req, tmpl) |
449 req.respond(HTTP_OK, ctype) | 448 req.respond(HTTP_OK, ctype) |