﻿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	closed	HTTP handling	dev	Normal	needsinfo			Unreviewed	1	0	0	0	0	0
