#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.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/051.86ef50431634159c2c2e04b115443a2d%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to