classification
Title: cgitb.py should assume a binary stream for output
Type: behavior Stage:
Components: Unicode Versions: Python 3.10, Python 3.9, Python 3.8
process
Status: open Resolution:
Dependencies: Superseder:
Assigned To: Nosy List: facundobatista, fdrake, orsenthil, v+python
Priority: normal Keywords:

Created on 2010-11-21 05:37 by v+python, last changed 2020-11-16 21:55 by iritkatriel.

Messages (2)
msg121865 - (view) Author: Glenn Linderman (v+python) * Date: 2010-11-21 05:37
The CGI interface is a binary stream, because it is pumped directly to/from the HTTP protocol, which is a binary stream.

Hence, cgitb.py should produce binary output.  Presently, it produces text output.

When one sets stdout to a binary stream, and then cgitb intercepts an error, cgitb fails.

Demonstration of problem:

import sys
import traceback
sys.stdout = open("sob", "wb")  # WSGI sez data should be binary, so stdout should be binary???
import cgitb
sys.stdout.write(b"out")
fhb = open("fhb", "wb")
cgitb.enable()
fhb.write("abcdef")  # try writing non-binary to binary file.  Expect an error, of course.
msg127574 - (view) Author: Glenn Linderman (v+python) * Date: 2011-01-31 04:43
So since cgi.py was fixed to use the .buffer attribute of sys.stdout, that leaves sys.stdout itself as a character stream, and cgitb.py can successfully write to that.

If cgitb.py never writes anything but ASCII, then maybe that should be documented, and this issue closed.

If cgitb.py writes non-ASCII, then it should use an appropriate encoding for the web application, which isn't necessarily the default encoding on the system.  Some user control over the appropriate encoding should be given, or it should be documented that the encoding of sys.stdout should be changed to an appropriate encoding, because that is where cgitb.py will write its character stream.  Guidance on how to do that would be appropriate for the documentation also, as a CGI application may be the first one a programmer might write that can't just use the default encoding configured for the system.
History
Date User Action Args
2020-11-16 21:55:03iritkatrielsetversions: + Python 3.8, Python 3.9, Python 3.10, - Python 3.1, Python 3.2
2011-01-31 04:43:32v+pythonsetnosy: fdrake, facundobatista, orsenthil, v+python
messages: + msg127574
2010-11-21 16:58:06pitrousetnosy: + fdrake, facundobatista, orsenthil

versions: + Python 3.1
2010-11-21 07:54:24v+pythonsettype: behavior
2010-11-21 05:37:14v+pythoncreate