summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Graham <timograham@gmail.com>2013-10-08 08:05:39 -0400
committerTim Graham <timograham@gmail.com>2013-10-08 08:05:39 -0400
commit58d555caf527d6f1bdfeab14527484e4cca68648 (patch)
tree175e77804c7a4606e16392a023f339e6967acee5
parentddb53856b62506128a6d19184dfa80da73c77db8 (diff)
Fixed #16822 -- Added RawPostDataException
Thanks jaylett for the patch.
-rw-r--r--django/http/__init__.py4
-rw-r--r--django/http/request.py11
-rw-r--r--tests/requests/tests.py7
3 files changed, 16 insertions, 6 deletions
diff --git a/django/http/__init__.py b/django/http/__init__.py
index be7b24b2e2..bd6429ffbb 100644
--- a/django/http/__init__.py
+++ b/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,
diff --git a/django/http/request.py b/django/http/request.py
index f19ccaf068..3972151865 100644
--- a/django/http/request.py
+++ b/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 @@ class HttpRequest(object):
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:
diff --git a/tests/requests/tests.py b/tests/requests/tests.py
index b5edc09deb..45e219f345 100644
--- a/tests/requests/tests.py
+++ b/tests/requests/tests.py
@@ -12,7 +12,8 @@ from django.db import connection, connections, DEFAULT_DB_ALIAS
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 @@ class RequestsTests(SimpleTestCase):
'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 @@ class RequestsTests(SimpleTestCase):
'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):
"""