diff options
| author | Jakub Stasiak <jakub@stasiak.at> | 2016-02-09 02:24:47 +0100 |
|---|---|---|
| committer | Jakub Stasiak <jakub@stasiak.at> | 2016-02-09 11:20:05 +0100 |
| commit | b7380fdc70fde26777f4f141da3f01570e870cac (patch) | |
| tree | de9292ca35265f717b399a3ee09f4de2bc46b6e3 /eventlet/wsgi.py | |
| parent | 8a4a1212b2097c6ecca96c81dc355388583ac45d (diff) | |
| download | eventlet-partial-write-fix-2.tar.gz | |
wsgi: Fix handling partial writes on Python 3partial-write-fix-2
Closes https://github.com/eventlet/eventlet/issues/295 (in the wsgi
module we use a custom writelines implementation now).
Those write() calls might write only part of the data (and even if they
don't - it's more readable to make sure all data is written
explicitly).
I changed the test code so that the write() implementation returns the
number of characters logged and it cooperates nicely with writeall()
now.
Diffstat (limited to 'eventlet/wsgi.py')
| -rw-r--r-- | eventlet/wsgi.py | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/eventlet/wsgi.py b/eventlet/wsgi.py index 88e7752..e72fec7 100644 --- a/eventlet/wsgi.py +++ b/eventlet/wsgi.py @@ -1,4 +1,5 @@ import errno +import functools import os import sys import time @@ -11,7 +12,7 @@ from eventlet.green import socket from eventlet import greenio from eventlet import greenpool from eventlet import support -from eventlet.support import six +from eventlet.support import safe_writelines, six, writeall from eventlet.support.six.moves import urllib @@ -112,7 +113,7 @@ class Input(object): # Blank line towrite.append(b'\r\n') - self.wfile.writelines(towrite) + safe_writelines(self.wfile, towrite) # Reinitialize chunk_length (expect more data) self.chunk_length = -1 @@ -260,7 +261,7 @@ class LoggerFileWrapper(object): msg = msg + '\n' if args: msg = msg % args - self.log.write(msg) + writeall(self.log, msg) class FileObjectForHeaders(object): @@ -314,7 +315,8 @@ class HttpProtocol(BaseHTTPServer.BaseHTTPRequestHandler): try: self.raw_requestline = self.rfile.readline(self.server.url_length_limit) if len(self.raw_requestline) == self.server.url_length_limit: - self.wfile.write( + writeall( + self.wfile, b"HTTP/1.0 414 Request URI Too Long\r\n" b"Connection: close\r\nContent-length: 0\r\n\r\n") self.close_connection = 1 @@ -336,13 +338,15 @@ class HttpProtocol(BaseHTTPServer.BaseHTTPRequestHandler): if not self.parse_request(): return except HeaderLineTooLong: - self.wfile.write( + writeall( + self.wfile, b"HTTP/1.0 400 Header Line Too Long\r\n" b"Connection: close\r\nContent-length: 0\r\n\r\n") self.close_connection = 1 return except HeadersTooLarge: - self.wfile.write( + writeall( + self.wfile, b"HTTP/1.0 400 Headers Too Large\r\n" b"Connection: close\r\nContent-length: 0\r\n\r\n") self.close_connection = 1 @@ -355,7 +359,8 @@ class HttpProtocol(BaseHTTPServer.BaseHTTPRequestHandler): try: int(content_length) except ValueError: - self.wfile.write( + writeall( + self.wfile, b"HTTP/1.0 400 Bad Request\r\n" b"Connection: close\r\nContent-length: 0\r\n\r\n") self.close_connection = 1 @@ -385,7 +390,7 @@ class HttpProtocol(BaseHTTPServer.BaseHTTPRequestHandler): length = [0] status_code = [200] - def write(data, _writelines=wfile.writelines): + def write(data, _writelines=functools.partial(safe_writelines, wfile)): towrite = [] if not headers_set: raise AssertionError("write() before start_response()") |
