Survive people passing unicode objects to the wsgi response that do not have out-of-range characters. Report the error nicely and respond with a 500 to the browser.
This commit is contained in:
@@ -150,7 +150,7 @@ class HttpProtocol(BaseHTTPServer.BaseHTTPRequestHandler):
|
|||||||
length = [0]
|
length = [0]
|
||||||
status_code = [200]
|
status_code = [200]
|
||||||
|
|
||||||
def write(data, _write=wfile.write):
|
def write(data, _writelines=wfile.writelines):
|
||||||
towrite = []
|
towrite = []
|
||||||
if not headers_set:
|
if not headers_set:
|
||||||
raise AssertionError("write() before start_response()")
|
raise AssertionError("write() before start_response()")
|
||||||
@@ -181,13 +181,19 @@ class HttpProtocol(BaseHTTPServer.BaseHTTPRequestHandler):
|
|||||||
towrite.append("%x\r\n%s\r\n" % (len(data), data))
|
towrite.append("%x\r\n%s\r\n" % (len(data), data))
|
||||||
else:
|
else:
|
||||||
towrite.append(data)
|
towrite.append(data)
|
||||||
joined = ''.join(towrite)
|
|
||||||
length[0] = length[0] + len(joined)
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
_write(joined)
|
_writelines(towrite)
|
||||||
|
length[0] = length[0] + sum(map(len, towrite))
|
||||||
except UnicodeEncodeError:
|
except UnicodeEncodeError:
|
||||||
_write("HTTP/1.0 500 Internal Server Error\r\nConnection: close\r\nContent-type: text/plain\r\nContent-length: 98\r\n\r\nInternal Server Error: wsgi application passed a unicode object to the server instead of a string.")
|
print "Encountered unicode while attempting to write wsgi response: ", [x for x in towrite if isinstance(x, unicode)]
|
||||||
|
traceback.print_exc()
|
||||||
|
_writelines(
|
||||||
|
["HTTP/1.0 500 Internal Server Error\r\n",
|
||||||
|
"Connection: close\r\n",
|
||||||
|
"Content-type: text/plain\r\n",
|
||||||
|
"Content-length: 98\r\n",
|
||||||
|
"\r\n",
|
||||||
|
"Internal Server Error: wsgi application passed a unicode object to the server instead of a string."])
|
||||||
|
|
||||||
def start_response(status, response_headers, exc_info=None):
|
def start_response(status, response_headers, exc_info=None):
|
||||||
status_code[0] = status.split()[0]
|
status_code[0] = status.split()[0]
|
||||||
|
Reference in New Issue
Block a user