hgweb: cast bytearray to bytes stable
authorGregory Szorc <gregory.szorc@gmail.com>
Fri, 09 Nov 2018 23:49:39 +0000
branchstable
changeset 40545 6107d4549fcc
parent 40544 5b530d767e67
child 40546 7e2c58b08e74
child 40578 db61a18148a4
hgweb: cast bytearray to bytes PEP-3333 seems to indicate that bytes is the only allowed type that can be used to express the output of a WSGI application. And some WSGI environments seem to enforce this (mod_wsgi does). This commit universally casts bytearray instances to bytes to appease the WSGI specification. I found this because wireprotov2 is emitting bytearray instances. I'd like to keep things that way because the way it builds a data structure, bytearray is more efficient. I'd rather keep the low-level code efficient (and using bytearray) and cast at the edges than impose a performance penalty on code that may run outside WSGI contexts.
mercurial/hgweb/request.py
--- a/mercurial/hgweb/request.py	Thu Nov 08 20:04:07 2018 -0500
+++ b/mercurial/hgweb/request.py	Fri Nov 09 23:49:39 2018 +0000
@@ -540,6 +540,12 @@
             yield self._bodybytes
         elif self._bodygen:
             for chunk in self._bodygen:
+                # PEP-3333 says that output must be bytes. And some WSGI
+                # implementations enforce this. We cast bytes-like types here
+                # for convenience.
+                if isinstance(chunk, bytearray):
+                    chunk = bytes(chunk)
+
                 yield chunk
         elif self._bodywillwrite:
             self._bodywritefn = write