Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Fixed #16822 -- Added RawPostDataException

Thanks jaylett for the patch.
  • Loading branch information...
commit 58d555caf527d6f1bdfeab14527484e4cca68648 1 parent ddb5385
@timgraham timgraham authored
View
4 django/http/__init__.py
@@ -1,6 +1,6 @@
from django.http.cookie import SimpleCookie, parse_cookie
-from django.http.request import (HttpRequest, QueryDict, UnreadablePostError,
- build_request_repr)
+from django.http.request import (HttpRequest, QueryDict, RawPostDataException,
+ UnreadablePostError, build_request_repr)
from django.http.response import (HttpResponse, StreamingHttpResponse,
HttpResponseRedirect, HttpResponsePermanentRedirect,
HttpResponseNotModified, HttpResponseBadRequest, HttpResponseForbidden,
View
11 django/http/request.py
@@ -31,6 +31,15 @@ class UnreadablePostError(IOError):
pass
+class RawPostDataException(Exception):
+ """
+ You cannot access raw_post_data from a request that has
+ multipart/* POST data if it has been accessed via POST,
+ FILES, etc..
+ """
+ pass
+
+
class HttpRequest(object):
"""A basic HTTP request."""
@@ -192,7 +201,7 @@ def parse_file_upload(self, META, post_data):
def body(self):
if not hasattr(self, '_body'):
if self._read_started:
- raise Exception("You cannot access body after reading from request's data stream")
+ raise RawPostDataException("You cannot access body after reading from request's data stream")
try:
self._body = self.read()
except IOError as e:
View
7 tests/requests/tests.py
@@ -12,7 +12,8 @@
from django.core import signals
from django.core.exceptions import SuspiciousOperation
from django.core.handlers.wsgi import WSGIRequest, LimitedStream
-from django.http import HttpRequest, HttpResponse, parse_cookie, build_request_repr, UnreadablePostError
+from django.http import (HttpRequest, HttpResponse, parse_cookie,
+ build_request_repr, UnreadablePostError, RawPostDataException)
from django.test import SimpleTestCase, TransactionTestCase
from django.test.client import FakePayload
from django.test.utils import override_settings, str_prefix
@@ -263,7 +264,7 @@ def test_value_after_read(self):
'CONTENT_LENGTH': len(payload),
'wsgi.input': payload})
self.assertEqual(request.read(2), b'na')
- self.assertRaises(Exception, lambda: request.body)
+ self.assertRaises(RawPostDataException, lambda: request.body)
self.assertEqual(request.POST, {})
def test_non_ascii_POST(self):
@@ -308,7 +309,7 @@ def test_body_after_POST_multipart_form_data(self):
'CONTENT_LENGTH': len(payload),
'wsgi.input': payload})
self.assertEqual(request.POST, {'name': ['value']})
- self.assertRaises(Exception, lambda: request.body)
+ self.assertRaises(RawPostDataException, lambda: request.body)
def test_body_after_POST_multipart_related(self):
"""
Please sign in to comment.
Something went wrong with that request. Please try again.