diff --git a/rest_framework/request.py b/rest_framework/request.py index 6f4269fe51..4f413e03f6 100644 --- a/rest_framework/request.py +++ b/rest_framework/request.py @@ -303,7 +303,7 @@ def _parse(self): stream = None if stream is None or media_type is None: - if media_type and not is_form_media_type(media_type): + if media_type and is_form_media_type(media_type): empty_data = QueryDict('', encoding=self._request._encoding) else: empty_data = {} diff --git a/rest_framework/test.py b/rest_framework/test.py index 87255bca03..ebad19a4e4 100644 --- a/rest_framework/test.py +++ b/rest_framework/test.py @@ -227,6 +227,15 @@ def options(self, path, data=None, format=None, content_type=None, **extra): data, content_type = self._encode_data(data, format, content_type) return self.generic('OPTIONS', path, data, content_type, **extra) + def generic(self, method, path, data='', + content_type='application/octet-stream', secure=False, **extra): + # Include the CONTENT_TYPE, regardless of whether or not data is empty. + if content_type is not None: + extra['CONTENT_TYPE'] = str(content_type) + + return super(APIRequestFactory, self).generic( + method, path, data, content_type, secure, **extra) + def request(self, **kwargs): request = super(APIRequestFactory, self).request(**kwargs) request._dont_enforce_csrf_checks = not self.enforce_csrf_checks diff --git a/tests/test_testing.py b/tests/test_testing.py index 4a68a1e1ea..1af6ef02e5 100644 --- a/tests/test_testing.py +++ b/tests/test_testing.py @@ -274,3 +274,12 @@ def test_request_factory_url_arguments_with_unicode(self): assert dict(request.GET) == {'demo': ['testé']} request = factory.get('/view/', {'demo': 'testé'}) assert dict(request.GET) == {'demo': ['testé']} + + def test_empty_request_content_type(self): + factory = APIRequestFactory() + request = factory.post( + '/post-view/', + data=None, + content_type='application/json', + ) + assert request.META['CONTENT_TYPE'] == 'application/json'
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: