375 return protohandler['dispatch']() |
375 return protohandler['dispatch']() |
376 |
376 |
377 # translate user-visible url structure to internal structure |
377 # translate user-visible url structure to internal structure |
378 |
378 |
379 args = query.split('/', 2) |
379 args = query.split('/', 2) |
380 if r'cmd' not in req.form and args and args[0]: |
380 if 'cmd' not in req.form and args and args[0]: |
381 cmd = args.pop(0) |
381 cmd = args.pop(0) |
382 style = cmd.rfind('-') |
382 style = cmd.rfind('-') |
383 if style != -1: |
383 if style != -1: |
384 req.form['style'] = [cmd[:style]] |
384 req.form['style'] = [cmd[:style]] |
385 cmd = cmd[style + 1:] |
385 cmd = cmd[style + 1:] |
386 |
386 |
387 # avoid accepting e.g. style parameter as command |
387 # avoid accepting e.g. style parameter as command |
388 if util.safehasattr(webcommands, cmd): |
388 if util.safehasattr(webcommands, cmd): |
389 req.form[r'cmd'] = [cmd] |
389 req.form['cmd'] = [cmd] |
390 |
390 |
391 if cmd == 'static': |
391 if cmd == 'static': |
392 req.form['file'] = ['/'.join(args)] |
392 req.form['file'] = ['/'.join(args)] |
393 else: |
393 else: |
394 if args and args[0]: |
394 if args and args[0]: |
407 ext = spec[2] |
407 ext = spec[2] |
408 if fn.endswith(ext): |
408 if fn.endswith(ext): |
409 req.form['node'] = [fn[:-len(ext)]] |
409 req.form['node'] = [fn[:-len(ext)]] |
410 req.form['type'] = [type_] |
410 req.form['type'] = [type_] |
411 else: |
411 else: |
412 cmd = pycompat.sysbytes(req.form.get(r'cmd', [r''])[0]) |
412 cmd = req.form.get('cmd', [''])[0] |
413 |
413 |
414 # process the web interface request |
414 # process the web interface request |
415 |
415 |
416 try: |
416 try: |
417 tmpl = rctx.templater(req) |
417 tmpl = rctx.templater(req) |
421 # check read permissions non-static content |
421 # check read permissions non-static content |
422 if cmd != 'static': |
422 if cmd != 'static': |
423 self.check_perm(rctx, req, None) |
423 self.check_perm(rctx, req, None) |
424 |
424 |
425 if cmd == '': |
425 if cmd == '': |
426 req.form[r'cmd'] = [tmpl.cache['default']] |
426 req.form['cmd'] = [tmpl.cache['default']] |
427 cmd = req.form[r'cmd'][0] |
427 cmd = req.form['cmd'][0] |
428 |
428 |
429 # Don't enable caching if using a CSP nonce because then it wouldn't |
429 # Don't enable caching if using a CSP nonce because then it wouldn't |
430 # be a nonce. |
430 # be a nonce. |
431 if rctx.configbool('web', 'cache') and not rctx.nonce: |
431 if rctx.configbool('web', 'cache') and not rctx.nonce: |
432 caching(self, req) # sets ETag header or raises NOT_MODIFIED |
432 caching(self, req) # sets ETag header or raises NOT_MODIFIED |
433 if cmd not in webcommands.__all__: |
433 if cmd not in webcommands.__all__: |
434 msg = 'no such method: %s' % cmd |
434 msg = 'no such method: %s' % cmd |
435 raise ErrorResponse(HTTP_BAD_REQUEST, msg) |
435 raise ErrorResponse(HTTP_BAD_REQUEST, msg) |
436 elif cmd == 'file' and r'raw' in req.form.get(r'style', []): |
436 elif cmd == 'file' and 'raw' in req.form.get('style', []): |
437 rctx.ctype = ctype |
437 rctx.ctype = ctype |
438 content = webcommands.rawfile(rctx, req, tmpl) |
438 content = webcommands.rawfile(rctx, req, tmpl) |
439 else: |
439 else: |
440 content = getattr(webcommands, cmd)(rctx, req, tmpl) |
440 content = getattr(webcommands, cmd)(rctx, req, tmpl) |
441 req.respond(HTTP_OK, ctype) |
441 req.respond(HTTP_OK, ctype) |