Prevent StopIteration exception during parse response

- Parse response body only if there is one top-level element
in JSON object because if there is nullable JSON in response body
six will throw us an StopIteration exception from six.next

Closes-Bug: #1529144

Change-Id: Iea2d0950b25cb8f576ca7e15383a205e04d7c9e3
This commit is contained in:
Victor Ryzhenkin 2015-12-22 21:23:20 +03:00
parent 963f4943d6
commit 6910813552
2 changed files with 8 additions and 1 deletions

View File

@ -461,7 +461,9 @@ class RestClient(object):
# } # }
try: try:
# Ensure there are not more than one top-level keys # Ensure there are not more than one top-level keys
if len(body.keys()) > 1: # NOTE(freerunner): Ensure, that JSON is not nullable to
# to prevent StopIteration Exception
if len(body.keys()) != 1:
return body return body
# Just return the "wrapped" element # Just return the "wrapped" element
first_key, first_item = six.next(six.iteritems(body)) first_key, first_item = six.next(six.iteritems(body))

View File

@ -244,6 +244,7 @@ class TestRestClientParseRespJSON(BaseRestClientTestClass):
keys[0]: values[0], keys[0]: values[0],
keys[1]: values[1], keys[1]: values[1],
}} }}
null_dict = {}
def setUp(self): def setUp(self):
self.fake_http = fake_http.fake_httplib2() self.fake_http = fake_http.fake_httplib2()
@ -273,6 +274,10 @@ class TestRestClientParseRespJSON(BaseRestClientTestClass):
body = self.rest_client._parse_resp(json.dumps(data)) body = self.rest_client._parse_resp(json.dumps(data))
self.assertEqual(data, body) self.assertEqual(data, body)
def test_parse_nullable_dict(self):
body = self.rest_client._parse_resp(json.dumps(self.null_dict))
self.assertEqual(self.null_dict, body)
class TestRestClientErrorCheckerJSON(base.TestCase): class TestRestClientErrorCheckerJSON(base.TestCase):
c_type = "application/json" c_type = "application/json"