D2730: hgweb: ensure all wsgi environment values are str

2018-03-09 Thread indygreg (Gregory Szorc)
This revision was automatically updated to reflect the committed changes.
Closed by commit rHG7fc80c982656: hgweb: ensure all wsgi environment values are 
str (authored by indygreg, committed by ).

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D2730?vs=6736=6774

REVISION DETAIL
  https://phab.mercurial-scm.org/D2730

AFFECTED FILES
  mercurial/hgweb/hgweb_mod.py
  mercurial/hgweb/server.py

CHANGE DETAILS

diff --git a/mercurial/hgweb/server.py b/mercurial/hgweb/server.py
--- a/mercurial/hgweb/server.py
+++ b/mercurial/hgweb/server.py
@@ -124,8 +124,8 @@
 env[r'SERVER_NAME'] = self.server.server_name
 env[r'SERVER_PORT'] = str(self.server.server_port)
 env[r'REQUEST_URI'] = self.path
-env[r'SCRIPT_NAME'] = self.server.prefix
-env[r'PATH_INFO'] = path[len(self.server.prefix):]
+env[r'SCRIPT_NAME'] = pycompat.sysstr(self.server.prefix)
+env[r'PATH_INFO'] = pycompat.sysstr(path[len(self.server.prefix):])
 env[r'REMOTE_HOST'] = self.client_address[0]
 env[r'REMOTE_ADDR'] = self.client_address[0]
 if query:
@@ -154,7 +154,7 @@
 env[hkey] = hval
 env[r'SERVER_PROTOCOL'] = self.request_version
 env[r'wsgi.version'] = (1, 0)
-env[r'wsgi.url_scheme'] = self.url_scheme
+env[r'wsgi.url_scheme'] = pycompat.sysstr(self.url_scheme)
 if env.get(r'HTTP_EXPECT', '').lower() == '100-continue':
 self.rfile = common.continuereader(self.rfile, self.wfile.write)
 
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
@@ -159,7 +159,8 @@
 urlbase = r'%s://%s%s' % (proto, req.env[r'SERVER_NAME'], port)
 logourl = self.config('web', 'logourl')
 logoimg = self.config('web', 'logoimg')
-staticurl = self.config('web', 'staticurl') or req.url + 'static/'
+staticurl = (self.config('web', 'staticurl')
+ or pycompat.sysbytes(req.url) + 'static/')
 if not staticurl.endswith('/'):
 staticurl += '/'
 
@@ -182,24 +183,24 @@
 if not self.reponame:
 self.reponame = (self.config('web', 'name', '')
  or req.env.get('REPO_NAME')
- or req.url.strip('/') or self.repo.root)
+ or req.url.strip(r'/') or self.repo.root)
 
 def websubfilter(text):
 return templatefilters.websub(text, self.websubtable)
 
 # create the templater
 # TODO: export all keywords: defaults = templatekw.keywords.copy()
 defaults = {
-'url': req.url,
+'url': pycompat.sysbytes(req.url),
 'logourl': logourl,
 'logoimg': logoimg,
 'staticurl': staticurl,
 'urlbase': urlbase,
 'repo': self.reponame,
 'encoding': encoding.encoding,
 'motd': motd,
 'sessionvars': sessionvars,
-'pathdef': makebreadcrumb(req.url),
+'pathdef': makebreadcrumb(pycompat.sysbytes(req.url)),
 'style': style,
 'nonce': self.nonce,
 }
@@ -333,17 +334,17 @@
 # use SCRIPT_NAME, PATH_INFO and QUERY_STRING as well as our REPO_NAME
 
 req.url = req.env[r'SCRIPT_NAME']
-if not req.url.endswith('/'):
-req.url += '/'
+if not req.url.endswith(r'/'):
+req.url += r'/'
 if req.env.get('REPO_NAME'):
 req.url += req.env[r'REPO_NAME'] + r'/'
 
 if r'PATH_INFO' in req.env:
-parts = req.env[r'PATH_INFO'].strip('/').split('/')
+parts = req.env[r'PATH_INFO'].strip(r'/').split(r'/')
 repo_parts = req.env.get(r'REPO_NAME', r'').split(r'/')
 if parts[:len(repo_parts)] == repo_parts:
 parts = parts[len(repo_parts):]
-query = '/'.join(parts)
+query = r'/'.join(parts)
 else:
 query = req.env[r'QUERY_STRING'].partition(r'&')[0]
 query = query.partition(r';')[0]
@@ -364,7 +365,7 @@
 
 # translate user-visible url structure to internal structure
 
-args = query.split('/', 2)
+args = query.split(r'/', 2)
 if 'cmd' not in req.form and args and args[0]:
 cmd = args.pop(0)
 style = cmd.rfind('-')



To: indygreg, #hg-reviewers, durin42
Cc: mercurial-devel
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


D2730: hgweb: ensure all wsgi environment values are str

2018-03-08 Thread indygreg (Gregory Szorc)
indygreg created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  Previously, we had a few entries that were bytes on Python 3.
  PEP-0333 states that all entries must be the native str type
  (bytes on Python 2, str on Python 3).
  
  This required a number of changes to hgweb_mod to unbreak
  things on Python 3. I suspect there still may be some regressions.
  
  I'm going to introduce a data structure that represents a parsed
  WSGI request in upcoming commits. This will hold bytes and will
  allow us to stop using raw literals throughout the WSGI code.

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D2730

AFFECTED FILES
  mercurial/hgweb/hgweb_mod.py
  mercurial/hgweb/server.py

CHANGE DETAILS

diff --git a/mercurial/hgweb/server.py b/mercurial/hgweb/server.py
--- a/mercurial/hgweb/server.py
+++ b/mercurial/hgweb/server.py
@@ -124,8 +124,8 @@
 env[r'SERVER_NAME'] = self.server.server_name
 env[r'SERVER_PORT'] = str(self.server.server_port)
 env[r'REQUEST_URI'] = self.path
-env[r'SCRIPT_NAME'] = self.server.prefix
-env[r'PATH_INFO'] = path[len(self.server.prefix):]
+env[r'SCRIPT_NAME'] = pycompat.sysstr(self.server.prefix)
+env[r'PATH_INFO'] = pycompat.sysstr(path[len(self.server.prefix):])
 env[r'REMOTE_HOST'] = self.client_address[0]
 env[r'REMOTE_ADDR'] = self.client_address[0]
 if query:
@@ -154,7 +154,7 @@
 env[hkey] = hval
 env[r'SERVER_PROTOCOL'] = self.request_version
 env[r'wsgi.version'] = (1, 0)
-env[r'wsgi.url_scheme'] = self.url_scheme
+env[r'wsgi.url_scheme'] = pycompat.sysstr(self.url_scheme)
 if env.get(r'HTTP_EXPECT', '').lower() == '100-continue':
 self.rfile = common.continuereader(self.rfile, self.wfile.write)
 
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
@@ -159,7 +159,8 @@
 urlbase = r'%s://%s%s' % (proto, req.env[r'SERVER_NAME'], port)
 logourl = self.config('web', 'logourl')
 logoimg = self.config('web', 'logoimg')
-staticurl = self.config('web', 'staticurl') or req.url + 'static/'
+staticurl = (self.config('web', 'staticurl')
+ or pycompat.sysbytes(req.url) + 'static/')
 if not staticurl.endswith('/'):
 staticurl += '/'
 
@@ -182,24 +183,24 @@
 if not self.reponame:
 self.reponame = (self.config('web', 'name', '')
  or req.env.get('REPO_NAME')
- or req.url.strip('/') or self.repo.root)
+ or req.url.strip(r'/') or self.repo.root)
 
 def websubfilter(text):
 return templatefilters.websub(text, self.websubtable)
 
 # create the templater
 # TODO: export all keywords: defaults = templatekw.keywords.copy()
 defaults = {
-'url': req.url,
+'url': pycompat.sysbytes(req.url),
 'logourl': logourl,
 'logoimg': logoimg,
 'staticurl': staticurl,
 'urlbase': urlbase,
 'repo': self.reponame,
 'encoding': encoding.encoding,
 'motd': motd,
 'sessionvars': sessionvars,
-'pathdef': makebreadcrumb(req.url),
+'pathdef': makebreadcrumb(pycompat.sysbytes(req.url)),
 'style': style,
 'nonce': self.nonce,
 }
@@ -333,17 +334,17 @@
 # use SCRIPT_NAME, PATH_INFO and QUERY_STRING as well as our REPO_NAME
 
 req.url = req.env[r'SCRIPT_NAME']
-if not req.url.endswith('/'):
-req.url += '/'
+if not req.url.endswith(r'/'):
+req.url += r'/'
 if req.env.get('REPO_NAME'):
 req.url += req.env[r'REPO_NAME'] + r'/'
 
 if r'PATH_INFO' in req.env:
-parts = req.env[r'PATH_INFO'].strip('/').split('/')
+parts = req.env[r'PATH_INFO'].strip(r'/').split(r'/')
 repo_parts = req.env.get(r'REPO_NAME', r'').split(r'/')
 if parts[:len(repo_parts)] == repo_parts:
 parts = parts[len(repo_parts):]
-query = '/'.join(parts)
+query = r'/'.join(parts)
 else:
 query = req.env[r'QUERY_STRING'].partition(r'&')[0]
 query = query.partition(r';')[0]
@@ -364,7 +365,7 @@
 
 # translate user-visible url structure to internal structure
 
-args = query.split('/', 2)
+args = query.split(r'/', 2)
 if 'cmd' not in req.form and args and args[0]:
 cmd = args.pop(0)
 style = cmd.rfind('-')



To: indygreg, #hg-reviewers
Cc: mercurial-devel
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org