[Django] #28106: Broken response/request after raising RequestDataTooBig in request.py

25 views
Skip to first unread message

Django

unread,
Apr 20, 2017, 4:36:36 PM4/20/17
to django-...@googlegroups.com
#28106: Broken response/request after raising RequestDataTooBig in request.py
-----------------------------------------+------------------------
Reporter: witmolif | Owner: nobody
Type: Uncategorized | Status: new
Component: Uncategorized | Version: 1.10
Severity: Normal | Keywords:
Triage Stage: Unreviewed | Has patch: 0
Needs documentation: 0 | Needs tests: 0
Patch needs improvement: 0 | Easy pickings: 0
UI/UX: 0 |
-----------------------------------------+------------------------
I have a middleware where I want to catch RequestDataTooBig exeption,
process it and return a valid response to the user.
However, browser can not see response, though django says response was
sent.

To be more precise:
middleware:

{{{
from django.http import JsonResponse, HttpResponse
from django.shortcuts import render
from django.core.exceptions import RequestDataTooBig

class CheckRequest(object):

def __init__(self, get_response):
print('middleware init')
self.get_response = get_response

def __call__(self, request):
print('middleware call')

response = self.get_response(request)

return response

def process_exception(self, request, exception):
print('middleware process exeption', exception)
if isinstance(exception, RequestDataTooBig):
print('CALLED')
return HttpResponse("dummy", content_type="text/plain")
#return JsonResponse({"error":"file is too big"})
}}}

Browser:
"Failed to load response data"

I did some research and found out that if I add one line to
https://github.com/django/django/blob/master/django/http/request.py

(create _body to the object before raise) everything starts work as
supposed - I get correct response in browser.

{{{
@property
def body(self):
if not hasattr(self, '_body'):
if self._read_started:
raise RawPostDataException("You cannot access body after
reading from request's data stream")


self._body = self.read(None) # <------ THIS ONE
# Limit the maximum request data size that will be handled in-
memory.
if (settings.DATA_UPLOAD_MAX_MEMORY_SIZE is not None and
int(self.META.get('CONTENT_LENGTH') or 0) >
settings.DATA_UPLOAD_MAX_MEMORY_SIZE):
raise RequestDataTooBig('Request body exceeded
settings.DATA_UPLOAD_MAX_MEMORY_SIZE.')

try:
self._body = self.read()
except IOError as e:
six.reraise(UnreadablePostError,
UnreadablePostError(*e.args), sys.exc_info()[2])
self._stream = BytesIO(self._body)
return self._body
}}}

I do not think it's a right solution, and I may by totally wrong, but it
seems that either response or request object becomes invalid when this
exception is raised.

I left logs and pics at stackoverflow
http://stackoverflow.com/questions/43496658/django-catch-
requestdatatoobig-exception/43528969#43528969, and can add additional
information if needed.

To make long story short, you can not send valid response if this
exception was raised.

--
Ticket URL: <https://code.djangoproject.com/ticket/28106>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

Django

unread,
Apr 21, 2017, 2:32:56 AM4/21/17
to django-...@googlegroups.com
#28106: Broken response/request after raising RequestDataTooBig in request.py
-------------------------------+--------------------------------------
Reporter: Andrew | Owner: nobody

Type: Uncategorized | Status: new
Component: Uncategorized | Version: 1.10
Severity: Normal | Resolution:

Keywords: | Triage Stage: Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------+--------------------------------------
Description changed by Andrew:

Old description:

New description:

class CheckRequest(object):

response = self.get_response(request)

return response

# Limit the maximum request data size that will be handled in-

--

--
Ticket URL: <https://code.djangoproject.com/ticket/28106#comment:1>

Django

unread,
Apr 21, 2017, 3:39:17 AM4/21/17
to django-...@googlegroups.com
#28106: Broken response/request after raising RequestDataTooBig in request.py
-------------------------------+--------------------------------------
Reporter: Andrew | Owner: nobody
Type: Uncategorized | Status: new
Component: HTTP handling | Version: 1.10
Severity: Normal | Resolution:
Keywords: | Triage Stage: Unreviewed
Has patch: 1 | Needs documentation: 0

Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------+--------------------------------------
Changes (by Andrew):

* has_patch: 0 => 1
* component: Uncategorized => HTTP handling


--
Ticket URL: <https://code.djangoproject.com/ticket/28106#comment:2>

Django

unread,
Apr 21, 2017, 3:39:40 AM4/21/17
to django-...@googlegroups.com
#28106: Broken response/request after raising RequestDataTooBig in request.py
-------------------------------+--------------------------------------
Reporter: Andrew | Owner: nobody
Type: Bug | Status: new

Component: HTTP handling | Version: 1.10
Severity: Normal | Resolution:
Keywords: | Triage Stage: Unreviewed
Has patch: 1 | Needs documentation: 0

Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------+--------------------------------------
Changes (by Andrew):

* type: Uncategorized => Bug


--
Ticket URL: <https://code.djangoproject.com/ticket/28106#comment:3>

Django

unread,
Apr 21, 2017, 3:40:34 AM4/21/17
to django-...@googlegroups.com
#28106: Broken response/request after raising RequestDataTooBig in request.py
-------------------------------+--------------------------------------
Reporter: Andrew | Owner: nobody
Type: Bug | Status: new
Component: HTTP handling | Version: 1.10
Severity: Normal | Resolution:
Keywords: | Triage Stage: Unreviewed
Has patch: 1 | Needs documentation: 0

Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------+--------------------------------------
Description changed by Andrew:

Old description:

> I have a middleware where I want to catch RequestDataTooBig exeption,

>


> # Limit the maximum request data size that will be handled
> in-memory.
> if (settings.DATA_UPLOAD_MAX_MEMORY_SIZE is not None and
> int(self.META.get('CONTENT_LENGTH') or 0) >
> settings.DATA_UPLOAD_MAX_MEMORY_SIZE):
> self._body = self.read(None) # <------ THIS ONE
> raise RequestDataTooBig('Request body exceeded
> settings.DATA_UPLOAD_MAX_MEMORY_SIZE.')
>
> try:
> self._body = self.read()
> except IOError as e:
> six.reraise(UnreadablePostError,
> UnreadablePostError(*e.args), sys.exc_info()[2])
> self._stream = BytesIO(self._body)
> return self._body
> }}}
>
> I do not think it's a right solution, and I may by totally wrong, but it
> seems that either response or request object becomes invalid when this
> exception is raised.
>
> I left logs and pics at stackoverflow
> http://stackoverflow.com/questions/43496658/django-catch-
> requestdatatoobig-exception/43528969#43528969, and can add additional
> information if needed.
>
> To make long story short, you can not send valid response if this
> exception was raised.

New description:

class CheckRequest(object):

response = self.get_response(request)

return response

# Limit the maximum request data size that will be handled in-


memory.
if (settings.DATA_UPLOAD_MAX_MEMORY_SIZE is not None and
int(self.META.get('CONTENT_LENGTH') or 0) >
settings.DATA_UPLOAD_MAX_MEMORY_SIZE):
self._body = self.read(None) # <------ THIS ONE
raise RequestDataTooBig('Request body exceeded
settings.DATA_UPLOAD_MAX_MEMORY_SIZE.')

try:
self._body = self.read()
except IOError as e:
six.reraise(UnreadablePostError,
UnreadablePostError(*e.args), sys.exc_info()[2])
self._stream = BytesIO(self._body)
return self._body
}}}

It seems that either response or request object becomes invalid when this
exception is raised.

I left logs and pics at stackoverflow
http://stackoverflow.com/questions/43496658/django-catch-
requestdatatoobig-exception/43528969#43528969, and can add additional
information if needed.

To make long story short, you can not send valid response if this
exception was raised.

--

--
Ticket URL: <https://code.djangoproject.com/ticket/28106#comment:4>

Django

unread,
Apr 21, 2017, 3:41:27 AM4/21/17
to django-...@googlegroups.com
#28106: Broken response/request after raising RequestDataTooBig in request.py
-------------------------------+--------------------------------------
Reporter: Andrew | Owner: nobody
Type: Bug | Status: new
Component: HTTP handling | Version: master
Severity: Normal | Resolution:
Keywords: | Triage Stage: Unreviewed
Has patch: 1 | Needs documentation: 0

Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------+--------------------------------------
Changes (by Andrew):

* version: 1.10 => master


--
Ticket URL: <https://code.djangoproject.com/ticket/28106#comment:5>

Django

unread,
May 9, 2017, 12:25:38 PM5/9/17
to django-...@googlegroups.com
#28106: Broken response/request after raising RequestDataTooBig in request.py
-------------------------------+--------------------------------------
Reporter: Andrew | Owner: nobody
Type: Bug | Status: new
Component: HTTP handling | Version: master
Severity: Normal | Resolution:
Keywords: | Triage Stage: Unreviewed
Has patch: 1 | Needs documentation: 0

Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------+--------------------------------------

Comment (by Tim Graham):

I'm not able to reproduce the issue with the information you provided.
Could you provide a sample project or a test for Django's test suite?

--
Ticket URL: <https://code.djangoproject.com/ticket/28106#comment:6>

Django

unread,
May 15, 2017, 9:03:09 AM5/15/17
to django-...@googlegroups.com
#28106: Broken response/request after raising RequestDataTooBig in request.py
-------------------------------+--------------------------------------
Reporter: Andrew | Owner: nobody
Type: Bug | Status: closed

Component: HTTP handling | Version: master
Severity: Normal | Resolution: needsinfo
Keywords: | Triage Stage: Unreviewed
Has patch: 1 | Needs documentation: 0

Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------+--------------------------------------
Changes (by Tim Graham):

* status: new => closed
* resolution: => needsinfo


--
Ticket URL: <https://code.djangoproject.com/ticket/28106#comment:7>

Django

unread,
May 22, 2018, 2:00:59 PM5/22/18
to django-...@googlegroups.com
#28106: Broken response/request after raising RequestDataTooBig in request.py
-------------------------------+--------------------------------------
Reporter: Andrew | Owner: nobody
Type: Bug | Status: closed
Component: HTTP handling | Version: master
Severity: Normal | Resolution: needsinfo
Keywords: | Triage Stage: Unreviewed
Has patch: 1 | Needs documentation: 0

Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------+--------------------------------------

Comment (by Tim Graham):

#29427 is a duplicate that's been accepted.

--
Ticket URL: <https://code.djangoproject.com/ticket/28106#comment:8>

Reply all
Reply to author
Forward
0 new messages