# HG changeset patch # User Gregory Szorc # Date 2018-03-10 18:56:10 # Node ID 1f7d9024674c4925c60c1713d5f08d548b1e55c8 # Parent 2cdf47e14c30dbdc2ebc0fd498fc0b85205ce2b3 hgweb: make parsedrequest part of wsgirequest This is kind of ugly. But an upcoming commit will teach parsedrequest about the input stream. Because the input stream is global state and can't be accessed without side-effects, we need to take actions to ensure that multiple consumers don't read from it independently. The easiest way to do this is for one object to hold a reference to both items having access to the input stream so that when a copy is made, we can remove the attribute from the other instance. So we create our parsed request instance from the wsgirequest constructor and hold a reference to it there. This is better than our new type holding a reference to wsgirequest because all the code for managing access will be temporary and we shouldn't pollute parsedrequest with this ugly history. Differential Revision: https://phab.mercurial-scm.org/D2770 diff --git a/mercurial/hgweb/hgweb_mod.py b/mercurial/hgweb/hgweb_mod.py --- a/mercurial/hgweb/hgweb_mod.py +++ b/mercurial/hgweb/hgweb_mod.py @@ -304,7 +304,7 @@ class hgweb(object): yield r def _runwsgi(self, wsgireq, repo): - req = requestmod.parserequestfromenv(wsgireq.env) + req = wsgireq.req rctx = requestcontext(self, repo) # This state is global across all threads. 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 @@ -287,6 +287,11 @@ class hgwebdir(object): real = repos.get(virtualrepo) if real: wsgireq.env['REPO_NAME'] = virtualrepo + # We have to re-parse because of updated environment + # variable. + # TODO this is kind of hacky and we should have a better + # way of doing this than with REPO_NAME side-effects. + wsgireq.req = requestmod.parserequestfromenv(wsgireq.env) try: # ensure caller gets private copy of ui repo = hg.repository(self.ui.copy(), real) diff --git a/mercurial/hgweb/request.py b/mercurial/hgweb/request.py --- a/mercurial/hgweb/request.py +++ b/mercurial/hgweb/request.py @@ -254,6 +254,8 @@ class wsgirequest(object): self.server_write = None self.headers = [] + self.req = parserequestfromenv(wsgienv) + def respond(self, status, type, filename=None, body=None): if not isinstance(type, str): type = pycompat.sysstr(type)