Kaydet (Commit) 58d555ca authored tarafından Tim Graham's avatar Tim Graham

Fixed #16822 -- Added RawPostDataException

Thanks jaylett for the patch.
üst ddb53856
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,
......
...@@ -31,6 +31,15 @@ class UnreadablePostError(IOError): ...@@ -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): ...@@ -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:
......
...@@ -12,7 +12,8 @@ from django.db import connection, connections, DEFAULT_DB_ALIAS ...@@ -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): ...@@ -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): ...@@ -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):
""" """
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment