diff options
| author | Tom Christie | 2011-04-11 12:19:28 +0100 |
|---|---|---|
| committer | Tom Christie | 2011-04-11 12:19:28 +0100 |
| commit | 0fe8d1a15dab8c1da37b4e966ccfe9095f24fa76 (patch) | |
| tree | 42e7fa28d2cb63ba9a7123ea1ab351115f0ce339 /djangorestframework | |
| parent | e29a3f4cf12ea4c7cc616f27441b44639c736334 (diff) | |
| download | django-rest-framework-0fe8d1a15dab8c1da37b4e966ccfe9095f24fa76.tar.bz2 | |
form overloading tests passing
Diffstat (limited to 'djangorestframework')
| -rw-r--r-- | djangorestframework/mediatypes.py | 2 | ||||
| -rw-r--r-- | djangorestframework/request.py | 8 | ||||
| -rw-r--r-- | djangorestframework/tests/content.py | 38 |
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' |
