Add new error for invalid response
There are a number of places where we expect a certain format of response. If it's not found we often end up raising a KeyError when accessing data. Create a new Exception type that is raised when a HTTP response is not appropriate for parsing and use it within authentication calls. Closes-Bug: #1307306 Change-Id: I3cf2db07a8e76ee17702130e9efb0edf640d293a
This commit is contained in:
		| @@ -58,6 +58,7 @@ class BaseIdentityPlugin(base.BaseAuthPlugin): | |||||||
|         when invoked. If you are looking to just retrieve the current auth |         when invoked. If you are looking to just retrieve the current auth | ||||||
|         data then you should use get_access. |         data then you should use get_access. | ||||||
|  |  | ||||||
|  |         :raises InvalidResponse: The response returned wasn't appropriate. | ||||||
|         :raises HttpError: An error from an invalid HTTP response. |         :raises HttpError: An error from an invalid HTTP response. | ||||||
|  |  | ||||||
|         :returns AccessInfo: Token access information. |         :returns AccessInfo: Token access information. | ||||||
|   | |||||||
| @@ -84,7 +84,13 @@ class Auth(base.BaseIdentityPlugin): | |||||||
|  |  | ||||||
|         resp = session.post(url, json=params, headers=headers, |         resp = session.post(url, json=params, headers=headers, | ||||||
|                             authenticated=False) |                             authenticated=False) | ||||||
|         return access.AccessInfoV2(**resp.json()['access']) |  | ||||||
|  |         try: | ||||||
|  |             resp_data = resp.json()['access'] | ||||||
|  |         except (KeyError, ValueError): | ||||||
|  |             raise exceptions.InvalidResponse(response=resp) | ||||||
|  |  | ||||||
|  |         return access.AccessInfoV2(**resp_data) | ||||||
|  |  | ||||||
|     @abc.abstractmethod |     @abc.abstractmethod | ||||||
|     def get_auth_data(self, headers=None): |     def get_auth_data(self, headers=None): | ||||||
|   | |||||||
| @@ -108,8 +108,14 @@ class Auth(base.BaseIdentityPlugin): | |||||||
|  |  | ||||||
|         resp = session.post(self.token_url, json=body, headers=headers, |         resp = session.post(self.token_url, json=body, headers=headers, | ||||||
|                             authenticated=False) |                             authenticated=False) | ||||||
|  |  | ||||||
|  |         try: | ||||||
|  |             resp_data = resp.json()['token'] | ||||||
|  |         except (KeyError, ValueError): | ||||||
|  |             raise exceptions.InvalidResponse(response=resp) | ||||||
|  |  | ||||||
|         return access.AccessInfoV3(resp.headers['X-Subject-Token'], |         return access.AccessInfoV3(resp.headers['X-Subject-Token'], | ||||||
|                                    **resp.json()['token']) |                                    **resp_data) | ||||||
|  |  | ||||||
|     @staticmethod |     @staticmethod | ||||||
|     def _factory(auth_url, **kwargs): |     def _factory(auth_url, **kwargs): | ||||||
|   | |||||||
| @@ -61,3 +61,11 @@ class MissingAuthPlugin(ClientException): | |||||||
| class NoMatchingPlugin(ClientException): | class NoMatchingPlugin(ClientException): | ||||||
|     """There were no auth plugins that could be created from the parameters |     """There were no auth plugins that could be created from the parameters | ||||||
|     provided.""" |     provided.""" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class InvalidResponse(ClientException): | ||||||
|  |     """The response from the server is not valid for this request.""" | ||||||
|  |  | ||||||
|  |     def __init__(self, response): | ||||||
|  |         super(InvalidResponse, self).__init__() | ||||||
|  |         self.response = response | ||||||
|   | |||||||
| @@ -211,3 +211,25 @@ class V2IdentityPlugin(utils.TestCase): | |||||||
|                      endpoint_filter={'service_type': 'compute'}) |                      endpoint_filter={'service_type': 'compute'}) | ||||||
|         self.assertEqual(resp.status_code, 200) |         self.assertEqual(resp.status_code, 200) | ||||||
|         self.assertEqual(resp.text, 'SUCCESS') |         self.assertEqual(resp.text, 'SUCCESS') | ||||||
|  |  | ||||||
|  |     @httpretty.activate | ||||||
|  |     def test_invalid_auth_response_dict(self): | ||||||
|  |         self.stub_auth(json={'hello': 'world'}) | ||||||
|  |  | ||||||
|  |         a = v2.Password(self.TEST_URL, username=self.TEST_USER, | ||||||
|  |                         password=self.TEST_PASS) | ||||||
|  |         s = session.Session(auth=a) | ||||||
|  |  | ||||||
|  |         self.assertRaises(exceptions.InvalidResponse, s.get, 'http://any', | ||||||
|  |                           authenticated=True) | ||||||
|  |  | ||||||
|  |     @httpretty.activate | ||||||
|  |     def test_invalid_auth_response_type(self): | ||||||
|  |         self.stub_url(httpretty.POST, ['tokens'], body='testdata') | ||||||
|  |  | ||||||
|  |         a = v2.Password(self.TEST_URL, username=self.TEST_USER, | ||||||
|  |                         password=self.TEST_PASS) | ||||||
|  |         s = session.Session(auth=a) | ||||||
|  |  | ||||||
|  |         self.assertRaises(exceptions.InvalidResponse, s.get, 'http://any', | ||||||
|  |                           authenticated=True) | ||||||
|   | |||||||
| @@ -366,3 +366,25 @@ class V3IdentityPlugin(utils.TestCase): | |||||||
|                      endpoint_filter={'service_type': 'compute'}) |                      endpoint_filter={'service_type': 'compute'}) | ||||||
|         self.assertEqual(resp.status_code, 200) |         self.assertEqual(resp.status_code, 200) | ||||||
|         self.assertEqual(resp.text, 'SUCCESS') |         self.assertEqual(resp.text, 'SUCCESS') | ||||||
|  |  | ||||||
|  |     @httpretty.activate | ||||||
|  |     def test_invalid_auth_response_dict(self): | ||||||
|  |         self.stub_auth(json={'hello': 'world'}) | ||||||
|  |  | ||||||
|  |         a = v3.Password(self.TEST_URL, username=self.TEST_USER, | ||||||
|  |                         password=self.TEST_PASS) | ||||||
|  |         s = session.Session(auth=a) | ||||||
|  |  | ||||||
|  |         self.assertRaises(exceptions.InvalidResponse, s.get, 'http://any', | ||||||
|  |                           authenticated=True) | ||||||
|  |  | ||||||
|  |     @httpretty.activate | ||||||
|  |     def test_invalid_auth_response_type(self): | ||||||
|  |         self.stub_url(httpretty.POST, ['auth', 'tokens'], body='testdata') | ||||||
|  |  | ||||||
|  |         a = v3.Password(self.TEST_URL, username=self.TEST_USER, | ||||||
|  |                         password=self.TEST_PASS) | ||||||
|  |         s = session.Session(auth=a) | ||||||
|  |  | ||||||
|  |         self.assertRaises(exceptions.InvalidResponse, s.get, 'http://any', | ||||||
|  |                           authenticated=True) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Jamie Lennox
					Jamie Lennox