hgweb: convert req.form to bytes for all keys and values
authorAugie Fackler <augie@google.com>
Sun, 04 Mar 2018 13:03:22 -0500
changeset 36736 2442927cdd96
parent 36735 e79adc12cde3
child 36737 250f3168d907
hgweb: convert req.form to bytes for all keys and values This is just going to be a lot cleaner for our internals. Differential Revision: https://phab.mercurial-scm.org/D2660
mercurial/hgweb/hgweb_mod.py
mercurial/hgweb/request.py
mercurial/wireprotoserver.py
--- a/mercurial/hgweb/hgweb_mod.py	Sun Mar 04 12:33:15 2018 -0500
+++ b/mercurial/hgweb/hgweb_mod.py	Sun Mar 04 13:03:22 2018 -0500
@@ -377,7 +377,7 @@
         # translate user-visible url structure to internal structure
 
         args = query.split('/', 2)
-        if r'cmd' not in req.form and args and args[0]:
+        if 'cmd' not in req.form and args and args[0]:
             cmd = args.pop(0)
             style = cmd.rfind('-')
             if style != -1:
@@ -386,7 +386,7 @@
 
             # avoid accepting e.g. style parameter as command
             if util.safehasattr(webcommands, cmd):
-                req.form[r'cmd'] = [cmd]
+                req.form['cmd'] = [cmd]
 
             if cmd == 'static':
                 req.form['file'] = ['/'.join(args)]
@@ -409,7 +409,7 @@
                         req.form['node'] = [fn[:-len(ext)]]
                         req.form['type'] = [type_]
         else:
-            cmd = pycompat.sysbytes(req.form.get(r'cmd', [r''])[0])
+            cmd = req.form.get('cmd', [''])[0]
 
         # process the web interface request
 
@@ -423,8 +423,8 @@
                 self.check_perm(rctx, req, None)
 
             if cmd == '':
-                req.form[r'cmd'] = [tmpl.cache['default']]
-                cmd = req.form[r'cmd'][0]
+                req.form['cmd'] = [tmpl.cache['default']]
+                cmd = req.form['cmd'][0]
 
             # Don't enable caching if using a CSP nonce because then it wouldn't
             # be a nonce.
@@ -433,7 +433,7 @@
             if cmd not in webcommands.__all__:
                 msg = 'no such method: %s' % cmd
                 raise ErrorResponse(HTTP_BAD_REQUEST, msg)
-            elif cmd == 'file' and r'raw' in req.form.get(r'style', []):
+            elif cmd == 'file' and 'raw' in req.form.get('style', []):
                 rctx.ctype = ctype
                 content = webcommands.rawfile(rctx, req, tmpl)
             else:
--- a/mercurial/hgweb/request.py	Sun Mar 04 12:33:15 2018 -0500
+++ b/mercurial/hgweb/request.py	Sun Mar 04 13:03:22 2018 -0500
@@ -48,9 +48,11 @@
                 form[name] = value
             del form[k]
     # And strip the values
+    bytesform = {}
     for k, v in form.iteritems():
-        form[k] = [i.strip() for i in v]
-    return form
+        bytesform[pycompat.bytesurl(k)] = [
+            pycompat.bytesurl(i.strip()) for i in v]
+    return bytesform
 
 class wsgirequest(object):
     """Higher-level API for a WSGI request.
--- a/mercurial/wireprotoserver.py	Sun Mar 04 12:33:15 2018 -0500
+++ b/mercurial/wireprotoserver.py	Sun Mar 04 13:03:22 2018 -0500
@@ -159,10 +159,10 @@
     # HTTP version 1 wire protocol requests are denoted by a "cmd" query
     # string parameter. If it isn't present, this isn't a wire protocol
     # request.
-    if r'cmd' not in req.form:
+    if 'cmd' not in req.form:
         return None
 
-    cmd = pycompat.sysbytes(req.form[r'cmd'][0])
+    cmd = req.form['cmd'][0]
 
     # The "cmd" request parameter is used by both the wire protocol and hgweb.
     # While not all wire protocol commands are available for all transports,