solis: handle json response in self.request (#21737)

This commit is contained in:
Thomas NOËL 2018-02-08 20:10:23 +01:00
parent 717de86286
commit d0e89d2301
2 changed files with 20 additions and 20 deletions

View File

@ -82,16 +82,19 @@ class Solis(BaseResource):
class Meta:
verbose_name = _('Solis')
def request(self, endpoint, data=None):
def request(self, endpoint, data=None, response_is_json=True):
url = self.service_url + endpoint
headers = {'Accept': 'application/json'}
if data is None:
return self.requests.get(url, headers=headers)
return self.requests.post(url, json=data, headers=headers)
response = self.requests.get(url, headers=headers)
else:
response = self.requests.post(url, json=data, headers=headers)
def get_json(self, endpoint):
response = self.request(endpoint)
if response.status_code != 200:
if response.status_code // 100 != 2:
if not response_is_json:
raise APIError('error status:%s %r, content:%r' %
(response.status_code, response.reason, response.content[:1024]),
data={'status_code': response.status_code})
try:
json_content = response.json()
except ValueError:
@ -100,6 +103,9 @@ class Solis(BaseResource):
(response.status_code, response.reason, response.content[:1024]),
data={'status_code': response.status_code,
'json_content': json_content})
if not response_is_json:
return response.content
try:
return response.json()
except ValueError:
@ -108,19 +114,18 @@ class Solis(BaseResource):
def check_status(self):
# just raise an exception if something goes wrong
pong = self.request('main/isAlive')
pong.raise_for_status()
if not pong.json().get('response').startswith('Solis API'):
if not pong.get('response').startswith('Solis API'):
raise Exception('bad main/isAlive response body')
@endpoint(name='ping', description=_('Check Solis API availability'))
def ping(self, request):
pong = self.get_json('main/isAlive')
pong = self.request('main/isAlive')
try:
response = pong['response'] or 'empty'
except (TypeError, KeyError):
raise APIError('invalid response: %r' % pong.content[:1024])
raise APIError('invalid response: %r' % pong)
if not response.startswith('Solis API'):
raise APIError('response is %s' % response)
raise APIError('response is %s' % response, data=pong)
return {'data': 'pong', 'response': response}
def apa_token(self, user_id, code):
@ -128,12 +133,7 @@ class Solis(BaseResource):
'indexIndividu': user_id,
'codeConfidentiel': code,
})
if response.status_code == 403:
raise APIError('invalid credentials')
elif response.status_code != 200:
raise APIError('error status:%s %r, content:%r' %
(response.status_code, response.reason, response.content[:1024]))
return response.json().get('token')
return response.get('token')
def apa_get_information(self, information, user_id=None, code=None, token=None, index=None):
if token is None:
@ -141,7 +141,7 @@ class Solis(BaseResource):
endpoint = 'asg/apa/' + information + '/' + token
if index:
endpoint += '/' + index
return self.get_json(endpoint)
return self.request(endpoint)
@endpoint(name='apa-link', methods=['post'], perm='can_access',
description=_('Create link between name_id and '
@ -295,7 +295,7 @@ class Solis(BaseResource):
if args:
endpoint += '?' + urlencode(args)
content = self.get_json(endpoint)
content = self.request(endpoint)
if (not isinstance(content, dict) or len(content) != 1 or
not isinstance(content.values()[0], list)):

View File

@ -159,7 +159,7 @@ def test_solis_link_infos_unlink(app, solis):
assert requests_post.call_count == 1
assert requests_get.call_count == 0
assert resp.json['err'] == 1
assert 'invalid credentials' in resp.json['err_desc']
assert 'Code confidentiel non valide' in resp.json['err_desc']
assert SolisAPALink.objects.count() == 0