This commit is contained in:
Soren L. Hansen 2016-10-05 12:51:22 +00:00 committed by GitHub
commit 5e72422ef3
3 changed files with 17 additions and 2 deletions

View File

@ -60,6 +60,9 @@ class JSONParser(BaseParser):
parser_context = parser_context or {} parser_context = parser_context or {}
encoding = parser_context.get('encoding', settings.DEFAULT_CHARSET) encoding = parser_context.get('encoding', settings.DEFAULT_CHARSET)
if not stream:
return {}
try: try:
data = stream.read().decode(encoding) data = stream.read().decode(encoding)
return json.loads(data) return json.loads(data)

View File

@ -298,7 +298,7 @@ class Request(object):
return (self._request.POST, self._request.FILES) return (self._request.POST, self._request.FILES)
stream = None stream = None
if stream is None or media_type is None: if stream is None and not media_type:
empty_data = QueryDict('', encoding=self._request._encoding) empty_data = QueryDict('', encoding=self._request._encoding)
empty_files = MultiValueDict() empty_files = MultiValueDict()
return (empty_data, empty_files) return (empty_data, empty_files)

View File

@ -13,7 +13,9 @@ from django.utils import six
from rest_framework import status from rest_framework import status
from rest_framework.authentication import SessionAuthentication from rest_framework.authentication import SessionAuthentication
from rest_framework.parsers import BaseParser, FormParser, MultiPartParser from rest_framework.parsers import (
BaseParser, FormParser, JSONParser, MultiPartParser
)
from rest_framework.request import Request from rest_framework.request import Request
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.test import APIClient, APIRequestFactory from rest_framework.test import APIClient, APIRequestFactory
@ -50,6 +52,16 @@ class TestContentParsing(TestCase):
request = Request(factory.head('/')) request = Request(factory.head('/'))
self.assertEqual(request.data, {}) self.assertEqual(request.data, {})
def test_empty_body_yields_empty_dict_for_json_POST(self):
"""
Ensure request.data returns empty dict for POST request with JSON
content type.
"""
request = Request(factory.post('/', CONTENT_TYPE='application/json'))
request.parsers = (JSONParser(),)
self.assertEquals(type(request.data), dict)
self.assertEquals(request.data, {})
def test_request_DATA_with_form_content(self): def test_request_DATA_with_form_content(self):
""" """
Ensure request.data returns content for POST request with form content. Ensure request.data returns content for POST request with form content.