aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--djangorestframework/mediatypes.py2
-rw-r--r--djangorestframework/request.py8
-rw-r--r--djangorestframework/tests/content.py38
3 files changed, 29 insertions, 19 deletions
diff --git a/djangorestframework/mediatypes.py b/djangorestframework/mediatypes.py
index d1641a8f..92d9264c 100644
--- a/djangorestframework/mediatypes.py
+++ b/djangorestframework/mediatypes.py
@@ -63,7 +63,7 @@ class MediaType(object):
"""
return self.media_type == 'application/x-www-form-urlencoded' or \
self.media_type == 'multipart/form-data'
-
+
def as_tuple(self):
return (self.main_type, self.sub_type, self.params)
diff --git a/djangorestframework/request.py b/djangorestframework/request.py
index f79354a1..988c0592 100644
--- a/djangorestframework/request.py
+++ b/djangorestframework/request.py
@@ -1,6 +1,7 @@
from djangorestframework.mediatypes import MediaType
from djangorestframework.utils import as_tuple
from djangorestframework.response import ResponseException
+from djangorestframework.parsers import FormParser, MultipartParser
from djangorestframework import status
#from djangorestframework.requestparsing import parse, load_parser
@@ -151,11 +152,18 @@ class RequestMixin(object):
if not self.USE_FORM_OVERLOADING or self.method != 'POST' or not self.content_type.is_form():
return
+ # Temporarily switch to using the form parsers, then parse the content
+ parsers = self.parsers
+ self.parsers = (FormParser, MultipartParser)
content = self.RAW_CONTENT
+ self.parsers = parsers
+
+ # Method overloading - change the method and remove the param from the content
if self.METHOD_PARAM in content:
self.method = content[self.METHOD_PARAM].upper()
del self._raw_content[self.METHOD_PARAM]
+ # Content overloading - rewind the stream and modify the content type
if self.CONTENT_PARAM in content and self.CONTENTTYPE_PARAM in content:
self._content_type = MediaType(content[self.CONTENTTYPE_PARAM])
self._stream = StringIO(content[self.CONTENT_PARAM])
diff --git a/djangorestframework/tests/content.py b/djangorestframework/tests/content.py
index 2e33fd87..05679b2f 100644
--- a/djangorestframework/tests/content.py
+++ b/djangorestframework/tests/content.py
@@ -67,25 +67,25 @@ class TestContentMixins(TestCase):
self.assertEqual(view.RAW_CONTENT, content)
def test_standard_behaviour_determines_no_content_GET(self):
- """Ensure request.RAW_CONTENT returns None for GET request with no content."""
+ """Ensure view.RAW_CONTENT returns None for GET request with no content."""
self.ensure_determines_no_content_GET(RequestMixin())
def test_standard_behaviour_determines_form_content_POST(self):
- """Ensure request.RAW_CONTENT returns content for POST request with form content."""
+ """Ensure view.RAW_CONTENT returns content for POST request with form content."""
self.ensure_determines_form_content_POST(RequestMixin())
def test_standard_behaviour_determines_non_form_content_POST(self):
- """Ensure StandardContentMixin.determine_content(request) returns (content type, content) for POST request with content."""
+ """Ensure view.RAW_CONTENT returns content for POST request with non-form content."""
self.ensure_determines_non_form_content_POST(RequestMixin())
def test_standard_behaviour_determines_form_content_PUT(self):
- """Ensure StandardContentMixin.determine_content(request) returns content for PUT request with content."""
+ """Ensure view.RAW_CONTENT returns content for PUT request with form content."""
self.ensure_determines_form_content_PUT(RequestMixin())
-# def test_standard_behaviour_determines_non_form_content_PUT(self):
-# """Ensure StandardContentMixin.determine_content(request) returns (content type, content) for PUT request with content."""
-# self.ensure_determines_non_form_content_PUT(StandardContentMixin())
-#
+ def test_standard_behaviour_determines_non_form_content_PUT(self):
+ """Ensure view.RAW_CONTENT returns content for PUT request with non-form content."""
+ self.ensure_determines_non_form_content_PUT(RequestMixin())
+
# # OverloadedContentMixin behavioural tests
#
# def test_overloaded_behaviour_determines_no_content_GET(self):
@@ -108,16 +108,18 @@ class TestContentMixins(TestCase):
# """Ensure StandardContentMixin.determine_content(request) returns (content type, content) for PUT request with content."""
# self.ensure_determines_non_form_content_PUT(OverloadedContentMixin())
#
-# def test_overloaded_behaviour_allows_content_tunnelling(self):
-# """Ensure determine_content(request) returns (content type, content) for overloaded POST request"""
-# content = 'qwerty'
-# content_type = 'text/plain'
-# form_data = {OverloadedContentMixin.CONTENT_PARAM: content,
-# OverloadedContentMixin.CONTENTTYPE_PARAM: content_type}
-# request = self.req.post('/', form_data)
-# self.assertEqual(OverloadedContentMixin().determine_content(request), (content_type, content))
-# self.assertEqual(request.META['CONTENT_TYPE'], content_type)
-#
+ def test_overloaded_behaviour_allows_content_tunnelling(self):
+ """Ensure request.RAW_CONTENT returns content for overloaded POST request"""
+ content = 'qwerty'
+ content_type = 'text/plain'
+ view = RequestMixin()
+ form_data = {view.CONTENT_PARAM: content,
+ view.CONTENTTYPE_PARAM: content_type}
+ view.request = self.req.post('/', form_data)
+ view.parsers = (PlainTextParser,)
+ view.perform_form_overloading()
+ self.assertEqual(view.RAW_CONTENT, content)
+
# def test_overloaded_behaviour_allows_content_tunnelling_content_type_not_set(self):
# """Ensure determine_content(request) returns (None, content) for overloaded POST request with content type not set"""
# content = 'qwerty'