summaryrefslogtreecommitdiff
path: root/eventlet/wsgi.py
diff options
context:
space:
mode:
authorJakub Stasiak <jakub@stasiak.at>2016-02-09 02:24:47 +0100
committerJakub Stasiak <jakub@stasiak.at>2016-02-09 11:20:05 +0100
commitb7380fdc70fde26777f4f141da3f01570e870cac (patch)
treede9292ca35265f717b399a3ee09f4de2bc46b6e3 /eventlet/wsgi.py
parent8a4a1212b2097c6ecca96c81dc355388583ac45d (diff)
downloadeventlet-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.py21
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()")