def _raise_error(self, code, reason): if self.service.requires_2fa and \ reason == 'Missing X-APPLE-WEBAUTH-TOKEN cookie': raise PyiCloud2FARequiredError(response.url) api_error = PyiCloudAPIResponseError(reason, code) logger.error(api_error) raise api_error
def request(self, *args, **kwargs): # Charge logging to the right service endpoint callee = inspect.stack()[2] module = inspect.getmodule(callee[0]) logger = logging.getLogger(module.__name__).getChild('http') if self.service._password_filter not in logger.filters: logger.addFilter(self.service._password_filter) logger.debug("%s %s %s", args[0], args[1], kwargs.get('data', '')) kwargs.pop('retried', None) response = super(PyiCloudSession, self).request(*args, **kwargs) content_type = response.headers.get('Content-Type', '').split(';')[0] json_mimetypes = ['application/json', 'text/json'] if not response.ok and content_type not in json_mimetypes: if kwargs.get('retried') is None and response.status_code == 450: api_error = PyiCloudAPIResponseError( response.reason, response.status_code, retry=True ) logger.warn(api_error) kwargs['retried'] = True return self.request(*args, **kwargs) self._raise_error(response.status_code, response.reason) if content_type not in json_mimetypes: return response try: json = response.json() except: logger.warning('Failed to parse response with JSON mimetype') return response logger.debug(json) reason = json.get('errorMessage') reason = reason or json.get('reason') reason = reason or json.get('errorReason') if not reason and isinstance(json.get('error'), six.string_types): reason = json.get('error') if not reason and json.get('error'): reason = "Unknown reason" code = json.get('errorCode') if not code and json.get('serverErrorCode'): code = json.get('serverErrorCode') if reason: self._raise_error(code, reason) return response
def request(self, *args, **kwargs): # Charge logging to the right service endpoint callee = inspect.stack()[2] module = inspect.getmodule(callee[0]) logger = logging.getLogger(module.__name__).getChild('http') if self.service._password_filter not in logger.filters: logger.addFilter(self.service._password_filter) logger.debug("%s %s %s", args[0], args[1], kwargs.get('data', '')) response = super(PyiCloudSession, self).request(*args, **kwargs) content_type = response.headers.get('Content-Type', '').split(';')[0] json_mimetypes = ['application/json', 'text/json'] if content_type not in json_mimetypes: return response try: json = response.json() except: logger.warning('Failed to parse response with JSON mimetype') return response logger.debug(json) reason = json.get('errorMessage') reason = reason or json.get('reason') reason = reason or json.get('errorReason') if not reason and isinstance(json.get('error'), six.string_types): reason = json.get('error') if not reason and not response.ok: reason = response.reason if not reason and json.get('error'): reason = "Unknown reason" code = json.get('errorCode') if reason: if self.service.requires_2fa and \ reason == 'Missing X-APPLE-WEBAUTH-TOKEN cookie': raise PyiCloud2FARequiredError(response.url) api_error = PyiCloudAPIResponseError(reason, code) logger.error(api_error) raise api_error return response
def _raise_error(self, code, reason): if self.service.requires_2sa and \ reason == 'Missing X-APPLE-WEBAUTH-TOKEN cookie': raise PyiCloud2SARequiredError(response.url) if code == 'ZONE_NOT_FOUND' or code == 'AUTHENTICATION_FAILED': reason = 'Please log into https://icloud.com/ to manually ' \ 'finish setting up your iCloud service' api_error = PyiCloudServiceNotActivatedErrror(reason, code) logger.error(api_error) raise(api_error) if code == 'ACCESS_DENIED': reason = reason + '. Please wait a few minutes then try ' \ 'again. The remote servers might be trying to ' \ 'throttle requests.' api_error = PyiCloudAPIResponseError(reason, code) logger.error(api_error) raise api_error
def upload_file(self, path): ''' Upload a photo from path, returns a recordName''' filename = os.path.basename(path) url = '{}/upload'.format(self._upload_url) with open(path, 'rb') as file_obj: request = self.session.post(url, data=file_obj.read(), params={ 'filename': filename, 'dsid': self.params['dsid'], }) if 'errors' in request.json(): raise PyiCloudAPIResponseError('', request.json()['errors']) return [ x['recordName'] for x in request.json()['records'] if x['recordType'] == 'CPLAsset' ][0]
def mock_raise_response_error(offset): raise PyiCloudAPIResponseError("Invalid global session", 100)