the middleware now also triggers when Content-Length is '0' but X-Amz-Decoded-Content-Length or aws-chunked headers indicate a body should be present
This commit is contained in:
@@ -51,21 +51,26 @@ class _ChunkedTransferMiddleware:
|
|||||||
self.app = app
|
self.app = app
|
||||||
|
|
||||||
def __call__(self, environ, start_response):
|
def __call__(self, environ, start_response):
|
||||||
has_content_length = environ.get("CONTENT_LENGTH")
|
if environ.get("REQUEST_METHOD") not in ("PUT", "POST"):
|
||||||
if not has_content_length and environ.get("REQUEST_METHOD") in ("PUT", "POST"):
|
return self.app(environ, start_response)
|
||||||
transfer_chunked = "chunked" in environ.get("HTTP_TRANSFER_ENCODING", "").lower()
|
|
||||||
has_body_hint = bool(environ.get("HTTP_X_AMZ_DECODED_CONTENT_LENGTH"))
|
content_length = environ.get("CONTENT_LENGTH")
|
||||||
content_encoding = environ.get("HTTP_CONTENT_ENCODING", "")
|
body_expected = (
|
||||||
has_aws_chunked = "aws-chunked" in content_encoding.lower()
|
environ.get("HTTP_X_AMZ_DECODED_CONTENT_LENGTH")
|
||||||
if transfer_chunked or has_body_hint or has_aws_chunked:
|
or "chunked" in environ.get("HTTP_TRANSFER_ENCODING", "").lower()
|
||||||
try:
|
or "aws-chunked" in environ.get("HTTP_CONTENT_ENCODING", "").lower()
|
||||||
raw = environ["wsgi.input"]
|
)
|
||||||
body = raw.read()
|
|
||||||
except Exception:
|
if body_expected and (not content_length or content_length == "0"):
|
||||||
body = b""
|
try:
|
||||||
if body:
|
raw = environ["wsgi.input"]
|
||||||
environ["wsgi.input"] = io.BytesIO(body)
|
body = raw.read()
|
||||||
environ["CONTENT_LENGTH"] = str(len(body))
|
except Exception:
|
||||||
|
body = b""
|
||||||
|
if body:
|
||||||
|
environ["wsgi.input"] = io.BytesIO(body)
|
||||||
|
environ["CONTENT_LENGTH"] = str(len(body))
|
||||||
|
|
||||||
return self.app(environ, start_response)
|
return self.app(environ, start_response)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user