Mercurial > hg
diff mercurial/hgweb/hgwebdir_mod.py @ 36897:d7fd203e36cc
hgweb: refactor repository name URL parsing
The hgwebdir WSGI application detects when a requested URL is for
a known repository and it effectively forwards the request to the
hgweb WSGI application.
The hgweb WSGI application needs to route the request based on the
base URL for the repository. The way this normally works is
SCRIPT_NAME is used to resolve the base URL and PATH_INFO
contains the path after the script.
But with hgwebdir, SCRIPT_NAME refers to hgwebdir, not the base
URL for the repository. So, there was a hacky REPO_NAME environment
variable being set to convey the part of the URL that represented
the repository so hgweb could ignore this path component for
routing purposes.
The use of the environment variable for passing internal state
is pretty hacky. Plus, it wasn't clear from the perspective of
the URL parsing code what was going on.
This commit improves matters by making the repository name an
explicit argument to the request parser. The logic around
handling of this value has been shored up. We add various checks
that the argument is used properly - that the repository name
does represent the prefix of the PATH_INFO.
Differential Revision: https://phab.mercurial-scm.org/D2819
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Sun, 11 Mar 2018 13:11:13 -0700 |
parents | a5c478843c82 |
children | 219b23359f4c |
line wrap: on
line diff
--- a/mercurial/hgweb/hgwebdir_mod.py Sun Mar 11 12:53:47 2018 -0700 +++ b/mercurial/hgweb/hgwebdir_mod.py Sun Mar 11 13:11:13 2018 -0700 @@ -452,13 +452,10 @@ for virtualrepo in _virtualdirs(): 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. + # Re-parse the WSGI environment to take into account our + # repository path component. wsgireq.req = requestmod.parserequestfromenv( - wsgireq.env, wsgireq.req.bodyfh) + wsgireq.env, wsgireq.req.bodyfh, reponame=virtualrepo) try: # ensure caller gets private copy of ui repo = hg.repository(self.ui.copy(), real)