# HG changeset patch # User Gregory Szorc # Date 2018-03-10 23:46:29 # Node ID 98baf8dea553430c8093c244dbad8d79f4a23f88 # Parent 89002d07a114a867a7e65b0be1f307f0eec7cc4c hgweb: port static file handling to new response API hgwebdir_mod hasn't received as much porting effort. So we had to do some minor plumbing to get it to match hgweb_mod and to support the new response object. Differential Revision: https://phab.mercurial-scm.org/D2789 diff --git a/mercurial/hgweb/common.py b/mercurial/hgweb/common.py --- a/mercurial/hgweb/common.py +++ b/mercurial/hgweb/common.py @@ -153,7 +153,7 @@ def ispathsafe(path): return True -def staticfile(directory, fname, req): +def staticfile(directory, fname, res): """return a file inside directory with guessed Content-Type header fname always uses '/' as directory separator and isn't allowed to @@ -178,7 +178,9 @@ def staticfile(directory, fname, req): with open(path, 'rb') as fh: data = fh.read() - req.respond(HTTP_OK, ct, body=data) + res.headers['Content-Type'] = ct + res.setbodybytes(data) + return res except TypeError: raise ErrorResponse(HTTP_SERVER_ERROR, 'illegal filename') except OSError as err: diff --git a/mercurial/hgweb/hgwebdir_mod.py b/mercurial/hgweb/hgwebdir_mod.py --- a/mercurial/hgweb/hgwebdir_mod.py +++ b/mercurial/hgweb/hgwebdir_mod.py @@ -230,12 +230,14 @@ class hgwebdir(object): def _runwsgi(self, wsgireq): req = wsgireq.req + res = wsgireq.res try: self.refresh() csp, nonce = cspvalues(self.ui) if csp: + res.headers['Content-Security-Policy'] = csp wsgireq.headers.append(('Content-Security-Policy', csp)) virtual = wsgireq.env.get("PATH_INFO", "").strip('/') @@ -243,6 +245,10 @@ class hgwebdir(object): ctype = tmpl('mimetype', encoding=encoding.encoding) ctype = templater.stringify(ctype) + # Global defaults. These can be overridden by any handler. + res.status = '200 Script output follows' + res.headers['Content-Type'] = ctype + # a static file if virtual.startswith('static/') or 'static' in req.qsparams: if virtual.startswith('static/'): @@ -256,8 +262,9 @@ class hgwebdir(object): if isinstance(tp, str): tp = [tp] static = [os.path.join(p, 'static') for p in tp] - staticfile(static, fname, wsgireq) - return [] + + staticfile(static, fname, res) + return res.sendresponse() # top-level index diff --git a/mercurial/hgweb/webcommands.py b/mercurial/hgweb/webcommands.py --- a/mercurial/hgweb/webcommands.py +++ b/mercurial/hgweb/webcommands.py @@ -1232,8 +1232,9 @@ def static(web, req, tmpl): if isinstance(tp, str): tp = [tp] static = [os.path.join(p, 'static') for p in tp] - staticfile(static, fname, req) - return [] + + staticfile(static, fname, web.res) + return web.res @webcommand('graph') def graph(web, req, tmpl):