From b69321a91ef0d751a631da1df0a43f8fd6839d39 Mon Sep 17 00:00:00 2001 From: Aaron Tan Date: Wed, 26 Jul 2017 13:53:33 -0400 Subject: [PATCH] Allow parsing null JSON data --- awx/api/parsers.py | 4 +++- awx/main/tests/unit/api/test_parsers.py | 29 +++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 awx/main/tests/unit/api/test_parsers.py diff --git a/awx/api/parsers.py b/awx/api/parsers.py index 468962976c..8115763ae9 100644 --- a/awx/api/parsers.py +++ b/awx/api/parsers.py @@ -57,8 +57,10 @@ class JSONParser(parsers.JSONParser): try: data = stream.read().decode(encoding) + if not data: + return {} obj = json.loads(data, object_pairs_hook=OrderedDict) - if not isinstance(obj, dict): + if not isinstance(obj, dict) and obj is not None: raise ParseError(_('JSON parse error - not a JSON object')) return obj except ValueError as exc: diff --git a/awx/main/tests/unit/api/test_parsers.py b/awx/main/tests/unit/api/test_parsers.py new file mode 100644 index 0000000000..7b3ee6db6b --- /dev/null +++ b/awx/main/tests/unit/api/test_parsers.py @@ -0,0 +1,29 @@ +import pytest +import StringIO + +# AWX +from awx.api.parsers import JSONParser + +# Django REST Framework +from rest_framework.exceptions import ParseError + + +@pytest.mark.parametrize( + 'input_, output', [ + ('{"foo": "bar"}', {'foo': 'bar'}), + ('null', None), + ('', {}), + ] +) +def test_jsonparser_valid_input(input_, output): + input_stream = StringIO.StringIO(input_) + assert JSONParser().parse(input_stream) == output + input_stream.close() + + +@pytest.mark.parametrize('invalid_input', ['1', '"foobar"', '3.14', '{"foo": "bar",}']) +def test_json_parser_invalid_input(invalid_input): + input_stream = StringIO.StringIO(invalid_input) + with pytest.raises(ParseError): + JSONParser().parse(input_stream) + input_stream.close()