Criei um middleware WSGI que armazena o corpo bruto do environ['wsgi.input']
fluxo. Salvei o valor no ambiente WSGI para poder acessá-lo request.environ['body_copy']
no meu aplicativo.
Isso não é necessário no Werkzeug ou no Flask, pois request.get_data()
os dados brutos serão obtidos independentemente do tipo de conteúdo, mas com uma melhor manipulação do comportamento HTTP e WSGI.
Isso lê o corpo inteiro na memória, o que será um problema se, por exemplo, um arquivo grande for postado. Isso não lerá nada se o Content-Length
cabeçalho estiver ausente, portanto, não manipulará solicitações de streaming.
from io import BytesIO
class WSGICopyBody(object):
def __init__(self, application):
self.application = application
def __call__(self, environ, start_response):
length = int(environ.get('CONTENT_LENGTH') or 0)
body = environ['wsgi.input'].read(length)
environ['body_copy'] = body
# replace the stream since it was exhausted by read()
environ['wsgi.input'] = BytesIO(body)
return self.application(environ, start_response)
app.wsgi_app = WSGICopyBody(app.wsgi_app)
request.environ['body_copy']