diff -r 16499427f6de -r 97f44b0720e2 mercurial/hgweb/webcommands.py --- a/mercurial/hgweb/webcommands.py Sat Mar 10 16:17:51 2018 -0800 +++ b/mercurial/hgweb/webcommands.py Sat Mar 10 20:16:20 2018 -0800 @@ -19,14 +19,10 @@ ErrorResponse, HTTP_FORBIDDEN, HTTP_NOT_FOUND, - HTTP_OK, get_contact, paritygen, staticfile, ) -from . import ( - request as requestmod, -) from .. import ( archival, @@ -64,7 +60,9 @@ The function can return the ``requestcontext.res`` instance to signal that it wants to use this object to generate the response. If an iterable is returned, the ``wsgirequest`` instance will be used and the returned - content will constitute the response body. + content will constitute the response body. ``True`` can be returned to + indicate that the function already sent output and the caller doesn't + need to do anything more to send the response. Usage: @@ -1210,21 +1208,24 @@ 'file(s) not found: %s' % file) mimetype, artype, extension, encoding = web.archivespecs[type_] - headers = [ - ('Content-Disposition', 'attachment; filename=%s%s' % (name, extension)) - ] + + web.res.headers['Content-Type'] = mimetype + web.res.headers['Content-Disposition'] = 'attachment; filename=%s%s' % ( + name, extension) + if encoding: - headers.append(('Content-Encoding', encoding)) - req.headers.extend(headers) - req.respond(HTTP_OK, mimetype) + web.res.headers['Content-Encoding'] = encoding - bodyfh = requestmod.offsettrackingwriter(req.write) + web.res.setbodywillwrite() + assert list(web.res.sendresponse()) == [] + + bodyfh = web.res.getbodyfile() archival.archive(web.repo, bodyfh, cnode, artype, prefix=name, matchfn=match, subrepos=web.configbool("web", "archivesubrepos")) - return [] + return True @webcommand('static') def static(web, req, tmpl):