#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 django-updates+unsubscr...@googlegroups.com.
To post to this group, send email to django-updates@googlegroups.com.
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