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