D2770: hgweb: make parsedrequest part of wsgirequest
indygreg (Gregory Szorc)
phabricator at mercurial-scm.org
Sat Mar 10 01:23:30 UTC 2018
indygreg created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.
REVISION SUMMARY
This is kind of ugly. But upcoming commits will teach our parsedrequest
instances about how to read from the input stream and how to parse
form variables which might be specified on 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 things so it
can ensure (via attribute nuking) that consumers only touch one
object or the other.
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.
REPOSITORY
rHG Mercurial
REVISION DETAIL
https://phab.mercurial-scm.org/D2770
AFFECTED FILES
mercurial/hgweb/hgweb_mod.py
mercurial/hgweb/hgwebdir_mod.py
mercurial/hgweb/request.py
CHANGE DETAILS
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 @@
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)
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
@@ -229,7 +229,7 @@
yield r
def _runwsgi(self, wsgireq):
- req = requestmod.parserequestfromenv(wsgireq.env)
+ req = wsgireq.req
try:
self.refresh()
@@ -289,6 +289,11 @@
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/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 @@
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.
To: indygreg, #hg-reviewers
Cc: mercurial-devel
More information about the Mercurial-devel
mailing list