hgweb: pass strings in WSGI environment correctly from wsgicgi stable
authorManuel Jacob <me@manueljacob.de>
Fri, 08 Sep 2023 15:33:03 +0200
branchstable
changeset 50937 04bfcb416745
parent 50935 615569b2785e
child 50938 f02b62b7b056
child 50943 32c13716147e
hgweb: pass strings in WSGI environment correctly from wsgicgi According to PEP 3333, the strings in the WSGI environment must be translatable to bytes using the ISO-8859-1 codec.
mercurial/hgweb/wsgicgi.py
tests/test-wsgicgi.t
--- a/mercurial/hgweb/wsgicgi.py	Wed Sep 06 18:11:12 2023 +0200
+++ b/mercurial/hgweb/wsgicgi.py	Fri Sep 08 15:33:03 2023 +0200
@@ -9,10 +9,8 @@
 # http://www.python.org/dev/peps/pep-0333/#the-server-gateway-side
 
 
-import os
-
 from ..pycompat import getattr
-from .. import pycompat
+from .. import encoding, pycompat
 
 from ..utils import procutil
 
@@ -23,7 +21,10 @@
     procutil.setbinary(procutil.stdin)
     procutil.setbinary(procutil.stdout)
 
-    environ = dict(os.environ.items())  # re-exports
+    environ = {
+        k.decode('iso8859-1'): v.decode('iso8859-1')
+        for k, v in encoding.environ.items()
+    }  # re-exports
     environ.setdefault('PATH_INFO', '')
     if environ.get('SERVER_SOFTWARE', '').startswith('Microsoft-IIS'):
         # IIS includes script_name in PATH_INFO
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-wsgicgi.t	Fri Sep 08 15:33:03 2023 +0200
@@ -0,0 +1,18 @@
+  $ hg init test
+  $ cat >hgweb.cgi <<HGWEB
+  > #!$PYTHON
+  > from mercurial import demandimport; demandimport.enable()
+  > from mercurial.hgweb import hgweb
+  > from mercurial.hgweb import wsgicgi
+  > application = hgweb(b"test", b"Empty test repository")
+  > wsgicgi.launch(application)
+  > HGWEB
+  $ chmod 755 hgweb.cgi
+
+Check that non-ASCII bytes roundtrip correctly.
+
+  $ . "$TESTDIR/cgienv"
+  $ PATH_INFO="/rev/$(python -c 'import sys; sys.stdout.buffer.write(b"\xe2\x80\x94")')"; export PATH_INFO
+  $ QUERY_STRING="style=raw"; export QUERY_STRING
+  $ "$PYTHON" ./hgweb.cgi | grep error
+  error: unknown revision '\xe2\x80\x94' (esc)