﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
28106	Broken response/request after raising RequestDataTooBig in request.py	Andrew	nobody	"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"")


            
            # 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."	Bug	new	HTTP handling	1.10	Normal				Unreviewed	1	0	0	0	0	0
