diff --git a/graphene_django/tests/test_views.py b/graphene_django/tests/test_views.py index 729342344..c31db8dfb 100644 --- a/graphene_django/tests/test_views.py +++ b/graphene_django/tests/test_views.py @@ -457,6 +457,21 @@ def test_handles_invalid_json_bodies(client): } +def test_handles_django_request_error(client, monkeypatch): + def mocked_read(*args): + raise IOError("foo-bar") + + monkeypatch.setattr("django.http.request.HttpRequest.read", mocked_read) + + valid_json = json.dumps(dict(foo='bar')) + response = client.post(url_string(), valid_json, 'application/json') + + assert response.status_code == 400 + assert response_json(response) == { + 'errors': [{'message': 'foo-bar'}] + } + + def test_handles_incomplete_json_bodies(client): response = client.post(url_string(), '{"query":', 'application/json') diff --git a/graphene_django/views.py b/graphene_django/views.py index 412966802..afe04d771 100644 --- a/graphene_django/views.py +++ b/graphene_django/views.py @@ -179,7 +179,6 @@ def json_encode(self, request, d, pretty=False): return json.dumps(d, sort_keys=True, indent=2, separators=(',', ': ')) - # noinspection PyBroadException def parse_body(self, request): content_type = self.get_content_type(request) @@ -187,8 +186,14 @@ def parse_body(self, request): return {'query': request.body.decode()} elif content_type == 'application/json': + # noinspection PyBroadException try: - request_json = json.loads(request.body.decode('utf-8')) + body = request.body.decode('utf-8') + except Exception as e: + raise HttpError(HttpResponseBadRequest(str(e))) + + try: + request_json = json.loads(body) if self.batch: assert isinstance(request_json, list), ( 'Batch requests should receive a list, but received {}.' @@ -203,7 +208,7 @@ def parse_body(self, request): return request_json except AssertionError as e: raise HttpError(HttpResponseBadRequest(str(e))) - except: + except (TypeError, ValueError): raise HttpError(HttpResponseBadRequest('POST body sent invalid JSON.')) elif content_type in ['application/x-www-form-urlencoded', 'multipart/form-data']: