Handle HTTP errors before trying to parse JSON (#138)

This commit is contained in:
Tor Arne Vestbø 2017-07-08 23:14:24 +02:00 committed by GitHub
parent bda08319fc
commit be3d447c00

View file

@ -66,6 +66,9 @@ class PyiCloudSession(requests.Session):
response = super(PyiCloudSession, self).request(*args, **kwargs) response = super(PyiCloudSession, self).request(*args, **kwargs)
if not response.ok:
self._raise_error(response.status_code, response.reason)
content_type = response.headers.get('Content-Type', '').split(';')[0] content_type = response.headers.get('Content-Type', '').split(';')[0]
json_mimetypes = ['application/json', 'text/json'] json_mimetypes = ['application/json', 'text/json']
if content_type not in json_mimetypes: if content_type not in json_mimetypes:
@ -84,14 +87,17 @@ class PyiCloudSession(requests.Session):
reason = reason or json.get('errorReason') reason = reason or json.get('errorReason')
if not reason and isinstance(json.get('error'), six.string_types): if not reason and isinstance(json.get('error'), six.string_types):
reason = json.get('error') reason = json.get('error')
if not reason and not response.ok:
reason = response.reason
if not reason and json.get('error'): if not reason and json.get('error'):
reason = "Unknown reason" reason = "Unknown reason"
code = json.get('errorCode') code = json.get('errorCode')
if reason: if reason:
self._raise_error(code, reason)
return response
def _raise_error(self, code, reason):
if self.service.requires_2fa and \ if self.service.requires_2fa and \
reason == 'Missing X-APPLE-WEBAUTH-TOKEN cookie': reason == 'Missing X-APPLE-WEBAUTH-TOKEN cookie':
raise PyiCloud2FARequiredError(response.url) raise PyiCloud2FARequiredError(response.url)
@ -100,8 +106,6 @@ class PyiCloudSession(requests.Session):
logger.error(api_error) logger.error(api_error)
raise api_error raise api_error
return response
class PyiCloudService(object): class PyiCloudService(object):
""" """