fetch all input body in gaiohttp to work w/ non asyncio wsgi apps

I took the suggestion of @asvetlov. This change load first all the body
in RAM in the gaiohttp worker to handle classic WSGI application. This
is a temporary fix, it should be replaced asap by a streaming behaviour.
It does the trick anyway for most application since you're not supposed
to handle large body directly with gunicorn.

fix #803
This commit is contained in:
benoitc 2014-06-28 16:38:01 +02:00
parent feae663092
commit aacfba1aed
2 changed files with 39 additions and 1 deletions

37
examples/echo.py Normal file
View File

@ -0,0 +1,37 @@
# -*- coding: utf-8 -
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
#
# Example code from Eventlet sources
import os
import pprint
from wsgiref.validate import validator
import sys
from gunicorn import __version__
#@validator
def app(environ, start_response):
"""Simplest possible application object"""
errors = environ['wsgi.errors']
# pprint.pprint(('ENVIRON', environ), stream=errors)
print(environ)
if environ['REQUEST_METHOD'].upper() != 'POST':
data = b'Hello, World!\n'
else:
data = environ['wsgi.input'].read()
status = '200 OK'
response_headers = [
('Content-type','text/plain'),
('Content-Length', str(len(data))),
('X-Gunicorn-Version', __version__),
("Test", "test тест"),
]
start_response(status, response_headers)
return iter([data])

View File

@ -49,7 +49,8 @@ class AiohttpWorker(base.Worker):
def factory(self, wsgi, host, port):
proto = WSGIServerHttpProtocol(
wsgi, loop=self.loop,
wsgi, readpayload=True,
loop=self.loop,
log=self.log,
debug=self.cfg.debug,
keep_alive=self.cfg.keepalive,