Fixed #16822 -- Added RawPostDataException

Thanks jaylett for the patch.
This commit is contained in:
Tim Graham 2013-10-08 08:05:39 -04:00
parent ddb53856b6
commit 58d555caf5
3 changed files with 16 additions and 6 deletions

View File

@ -1,6 +1,6 @@
from django.http.cookie import SimpleCookie, parse_cookie from django.http.cookie import SimpleCookie, parse_cookie
from django.http.request import (HttpRequest, QueryDict, UnreadablePostError, from django.http.request import (HttpRequest, QueryDict, RawPostDataException,
build_request_repr) UnreadablePostError, build_request_repr)
from django.http.response import (HttpResponse, StreamingHttpResponse, from django.http.response import (HttpResponse, StreamingHttpResponse,
HttpResponseRedirect, HttpResponsePermanentRedirect, HttpResponseRedirect, HttpResponsePermanentRedirect,
HttpResponseNotModified, HttpResponseBadRequest, HttpResponseForbidden, HttpResponseNotModified, HttpResponseBadRequest, HttpResponseForbidden,

View File

@ -31,6 +31,15 @@ class UnreadablePostError(IOError):
pass 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): class HttpRequest(object):
"""A basic HTTP request.""" """A basic HTTP request."""
@ -192,7 +201,7 @@ class HttpRequest(object):
def body(self): def body(self):
if not hasattr(self, '_body'): if not hasattr(self, '_body'):
if self._read_started: 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: try:
self._body = self.read() self._body = self.read()
except IOError as e: except IOError as e:

View File

@ -12,7 +12,8 @@ from django.db import connection, connections, DEFAULT_DB_ALIAS
from django.core import signals from django.core import signals
from django.core.exceptions import SuspiciousOperation from django.core.exceptions import SuspiciousOperation
from django.core.handlers.wsgi import WSGIRequest, LimitedStream 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 import SimpleTestCase, TransactionTestCase
from django.test.client import FakePayload from django.test.client import FakePayload
from django.test.utils import override_settings, str_prefix from django.test.utils import override_settings, str_prefix
@ -263,7 +264,7 @@ class RequestsTests(SimpleTestCase):
'CONTENT_LENGTH': len(payload), 'CONTENT_LENGTH': len(payload),
'wsgi.input': payload}) 'wsgi.input': payload})
self.assertEqual(request.read(2), b'na') self.assertEqual(request.read(2), b'na')
self.assertRaises(Exception, lambda: request.body) self.assertRaises(RawPostDataException, lambda: request.body)
self.assertEqual(request.POST, {}) self.assertEqual(request.POST, {})
def test_non_ascii_POST(self): def test_non_ascii_POST(self):
@ -308,7 +309,7 @@ class RequestsTests(SimpleTestCase):
'CONTENT_LENGTH': len(payload), 'CONTENT_LENGTH': len(payload),
'wsgi.input': payload}) 'wsgi.input': payload})
self.assertEqual(request.POST, {'name': ['value']}) 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): def test_body_after_POST_multipart_related(self):
""" """