wsgi: env['wsgi.input'] was returning 1 byte strings
Fixes https://bitbucket.org/eventlet/eventlet/issue/150/env-wsgiinput-returns-a-single-byte-at-a
This commit is contained in:

committed by
Sergey Shepelev

parent
7f4e6d1840
commit
4fc1f4550d
@@ -161,7 +161,7 @@ class Input(object):
|
|||||||
return self._do_read(self.rfile.readlines, hint)
|
return self._do_read(self.rfile.readlines, hint)
|
||||||
|
|
||||||
def __iter__(self):
|
def __iter__(self):
|
||||||
return iter(self.read())
|
return iter(self.read, '')
|
||||||
|
|
||||||
def get_socket(self):
|
def get_socket(self):
|
||||||
return self.rfile._sock
|
return self.rfile._sock
|
||||||
|
@@ -956,6 +956,34 @@ class TestHttpd(_TestBase):
|
|||||||
'HTTP/1.0 400 Headers Too Large\r\n')
|
'HTTP/1.0 400 Headers Too Large\r\n')
|
||||||
fd.close()
|
fd.close()
|
||||||
|
|
||||||
|
def test_032_wsgi_input_as_iterable(self):
|
||||||
|
# https://bitbucket.org/eventlet/eventlet/issue/150
|
||||||
|
# env['wsgi.input'] returns a single byte at a time
|
||||||
|
# when used as an iterator
|
||||||
|
g = [0]
|
||||||
|
|
||||||
|
def echo_by_iterating(env, start_response):
|
||||||
|
start_response('200 OK', [('Content-type', 'text/plain')])
|
||||||
|
for chunk in env['wsgi.input']:
|
||||||
|
g[0] += 1
|
||||||
|
yield chunk
|
||||||
|
|
||||||
|
self.site.application = echo_by_iterating
|
||||||
|
upload_data = '123456789abcdef' * 100
|
||||||
|
request = (
|
||||||
|
'POST / HTTP/1.0\r\n'
|
||||||
|
'Host: localhost\r\n'
|
||||||
|
'Content-Length: %i\r\n\r\n%s'
|
||||||
|
) % (len(upload_data), upload_data)
|
||||||
|
sock = eventlet.connect(('localhost', self.port))
|
||||||
|
fd = sock.makefile('rw')
|
||||||
|
fd.write(request)
|
||||||
|
fd.flush()
|
||||||
|
response_line, headers, body = read_http(sock)
|
||||||
|
self.assertEquals(body, upload_data)
|
||||||
|
fd.close()
|
||||||
|
self.assertEquals(g[0], 1)
|
||||||
|
|
||||||
def test_zero_length_chunked_response(self):
|
def test_zero_length_chunked_response(self):
|
||||||
def zero_chunked_app(env, start_response):
|
def zero_chunked_app(env, start_response):
|
||||||
start_response('200 OK', [('Content-type', 'text/plain')])
|
start_response('200 OK', [('Content-type', 'text/plain')])
|
||||||
|
Reference in New Issue
Block a user