Mercurial > hg
changeset 40545:6107d4549fcc stable
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.
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Fri, 09 Nov 2018 23:49:39 +0000 |
parents | 5b530d767e67 |
children | 7e2c58b08e74 db61a18148a4 |
files | mercurial/hgweb/request.py |
diffstat | 1 files changed, 6 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- 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