# HG changeset patch # User Gregory Szorc # Date 2018-03-08 23:08:20 # Node ID 0031e972ded2343df2abba928ffa3cfbf8db1f50 # Parent 1e2194e0ef62c752c68c82709c072607acb646ac hgweb: use the parsed application path directly Previously, we assigned a custom system string with a trailing slash to wsgirequest.url. The addition of the trailing slash felt arbitrary and seems to go against how things typically work in WSGI. We also want our URLs to be bytes, not system strings. And, assigning a custom attribute to wsgirequest felt wrong. This commit fixes all those things by removing the trailing slash from the app path, changing consumers to use that variable and to use it without a trailing slash, and removing the custom attribute from wsgirequest. We preserve the trailing slash on {url}. Also, makebreadcrumb strips the trailing slash. So no change to it was needed. Differential Revision: https://phab.mercurial-scm.org/D2736 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 @@ -148,7 +148,7 @@ class requestcontext(object): logourl = self.config('web', 'logourl') logoimg = self.config('web', 'logoimg') staticurl = (self.config('web', 'staticurl') - or pycompat.sysbytes(wsgireq.url) + 'static/') + or req.apppath + '/static/') if not staticurl.endswith('/'): staticurl += '/' @@ -170,7 +170,7 @@ class requestcontext(object): if not self.reponame: self.reponame = (self.config('web', 'name', '') or wsgireq.env.get('REPO_NAME') - or wsgireq.url.strip(r'/') or self.repo.root) + or req.apppath or self.repo.root) def websubfilter(text): return templatefilters.websub(text, self.websubtable) @@ -178,7 +178,7 @@ class requestcontext(object): # create the templater # TODO: export all keywords: defaults = templatekw.keywords.copy() defaults = { - 'url': pycompat.sysbytes(wsgireq.url), + 'url': req.apppath + '/', 'logourl': logourl, 'logoimg': logoimg, 'staticurl': staticurl, @@ -187,7 +187,7 @@ class requestcontext(object): 'encoding': encoding.encoding, 'motd': motd, 'sessionvars': sessionvars, - 'pathdef': makebreadcrumb(pycompat.sysbytes(wsgireq.url)), + 'pathdef': makebreadcrumb(req.apppath), 'style': style, 'nonce': self.nonce, } @@ -318,8 +318,6 @@ class hgweb(object): if h[0] != 'Content-Security-Policy'] wsgireq.headers.append(('Content-Security-Policy', rctx.csp)) - wsgireq.url = pycompat.sysstr(req.apppath) - if r'PATH_INFO' in wsgireq.env: parts = wsgireq.env[r'PATH_INFO'].strip(r'/').split(r'/') repo_parts = wsgireq.env.get(r'REPO_NAME', r'').split(r'/') diff --git a/mercurial/hgweb/request.py b/mercurial/hgweb/request.py --- a/mercurial/hgweb/request.py +++ b/mercurial/hgweb/request.py @@ -146,14 +146,13 @@ def parserequestfromenv(env): # root. We also exclude its path components from PATH_INFO when resolving # the dispatch path. - # TODO the use of trailing slashes in apppath is arguably wrong. We need it - # to appease low-level parts of hgweb_mod for now. apppath = env['SCRIPT_NAME'] - if not apppath.endswith('/'): - apppath += '/' if env.get('REPO_NAME'): - apppath += env.get('REPO_NAME') + '/' + if not apppath.endswith('/'): + apppath += '/' + + apppath += env.get('REPO_NAME') if 'PATH_INFO' in env: dispatchparts = env['PATH_INFO'].strip('/').split('/')