def _prepare_request(self, subpath, params, data, opts, doseq=False, query=''): params = params or {} if self.api_key: params['hapikey'] = params.get('hapikey') or self.api_key else: params['access_token'] = params.get('access_token') or self.access_token check = utils.auth_checker(params['access_token']) if check >= 400: try: token_response = utils.refresh_access_token(self.refresh_token, self.client_id) decoded = json.loads(token_response) params['access_token'] = decoded['access_token'] self.log.info("Tried to create a new access token: %s\n" % params['access_token']) except: raise Exception("Couldn't refresh the access token, please provide a valid access_token or refresh_token.") self.log.info("Couldn't refresh the access token, please provide a valid access_token or refresh_token.") if opts.get('hub_id') or opts.get('portal_id'): params['portalId'] = opts.get('hub_id') or opts.get('portal_id') if query == None: query = '' if query and query.startswith('?'): query = query[1:] if query and not query.startswith('&'): query = '&' + query url = opts.get('url') or '/%s?%s%s' % (self._get_path(subpath), urllib.urlencode(params, doseq), query) headers = opts.get('headers') or {} headers.update({ 'Accept-Encoding': 'gzip', 'Content-Type': opts.get('content_type') or 'application/json'}) if data and not isinstance(data, basestring) and headers['Content-Type']=='application/json': data = json.dumps(data) return url, headers, data
def _prepare_request(self, subpath, params, data, opts, doseq=False, query=''): params = params or {} if self.api_key: params['hapikey'] = params.get('hapikey') or self.api_key else: params['access_token'] = params.get( 'access_token') or self.access_token check = utils.auth_checker(params['access_token']) if check >= 400: try: token_response = utils.refresh_access_token( self.refresh_token, self.client_id) decoded = json.loads(token_response) params['access_token'] = decoded['access_token'] self.log.info("Tried to create a new access token: %s\n" % params['access_token']) except: raise Exception( "Couldn't refresh the access token, please provide a valid access_token or refresh_token." ) self.log.info( "Couldn't refresh the access token, please provide a valid access_token or refresh_token." ) if opts.get('hub_id') or opts.get('portal_id'): params['portalId'] = opts.get('hub_id') or opts.get('portal_id') if query == None: query = '' if query and query.startswith('?'): query = query[1:] if query and not query.startswith('&'): query = '&' + query url = opts.get('url') or '/%s?%s%s' % ( self._get_path(subpath), urllib.urlencode(params, doseq), query) headers = opts.get('headers') or {} headers.update({ 'Accept-Encoding': 'gzip', 'Content-Type': opts.get('content_type') or 'application/json' }) if data and not isinstance( data, basestring) and headers['Content-Type'] == 'application/json': data = json.dumps(data) return url, headers, data
def _call_raw(self, subpath, params=None, method='GET', data=None, doseq=False, query='', retried=False, **options): opts = self.options.copy() opts.update(options) url, headers, data = self._prepare_request(subpath, params, data, opts, doseq, query) kwargs = {} if not _PYTHON25: kwargs['timeout'] = opts['timeout'] num_retries = opts.get('number_retries', 0) # Never retry a POST, PUT, or DELETE unless explicitly told to if method != 'GET' and not opts.get('retry_on_post'): num_retries = 0 if num_retries > 6: num_retries = 6 emergency_brake = 10 try_count = 0 while True: emergency_brake -= 1 # avoid getting burned by any mistakes in While loop logic if emergency_brake < 1: break try: try_count += 1 connection = opts['connection_type'](opts['api_base'], **kwargs) request_info = self._create_request(connection, method, url, headers, data) result = self._execute_request_raw(connection, request_info) break except HapiUnauthorized, e: self.log.warning("401 Unauthorized response to API request.") if self.access_token and self.refresh_token and self.client_id and not retried: self.log.info("Refreshing access token") try: token_response = utils.refresh_access_token(self.refresh_token, self.client_id) decoded = json.loads(token_response) self.access_token = decoded['access_token'] self.log.info('Retrying with new token %s' % (self.access_token)) except Exception, e: self.log.error("Unable to refresh access_token: %s" % (e)) raise return self._call_raw(subpath, params=params, method=method, data=data, doseq=doseq, query=query, retried=True, **options) else: if self.access_token and self.refresh_token and self.client_id and retried: self.log.error("Refreshed token, but request still was not authorized. You may need to grant additional permissions.") elif self.access_token and not self.refresh_token: self.log.error("In order to enable automated refreshing of your access token, please provide a refresh token as well.") elif self.access_token and not self.client_id: self.log.error("In order to enable automated refreshing of your access token, please provide a client_id in addition to a refresh token.") raise
def _prepare_request(self, subpath, params, data, opts, doseq=False, query=""): params = params or {} if self.api_key: params["hapikey"] = params.get("hapikey") or self.api_key else: params["access_token"] = params.get("access_token") or self.access_token check = utils.auth_checker(params["access_token"]) if check >= 400: try: token_response = utils.refresh_access_token(self.refresh_token, self.client_id) decoded = json.loads(token_response) params["access_token"] = decoded["access_token"] self.log.info("Tried to create a new access token: %s\n" % params["access_token"]) except: raise Exception( "Couldn't refresh the access token, please provide a valid access_token or refresh_token." ) self.log.info( "Couldn't refresh the access token, please provide a valid access_token or refresh_token." ) if opts.get("hub_id") or opts.get("portal_id"): params["portalId"] = opts.get("hub_id") or opts.get("portal_id") if query == None: query = "" if query and query.startswith("?"): query = query[1:] if query and not query.startswith("&"): query = "&" + query url = opts.get("url") or "/%s?%s%s" % (self._get_path(subpath), urllib.urlencode(params, doseq), query) headers = opts.get("headers") or {} headers.update({"Accept-Encoding": "gzip", "Content-Type": opts.get("content_type") or "application/json"}) if data and not isinstance(data, basestring) and headers["Content-Type"] == "application/json": data = json.dumps(data) return url, headers, data
def _call_raw(self, subpath, params=None, method='GET', data=None, doseq=False, query='', retried=False, **options): opts = self.options.copy() opts.update(options) url, headers, data = self._prepare_request(subpath, params, data, opts, doseq, query) kwargs = {} if not _PYTHON25: kwargs['timeout'] = opts['timeout'] num_retries = opts.get('number_retries', 0) # Never retry a POST, PUT, or DELETE unless explicitly told to if method != 'GET' and not opts.get('retry_on_post'): num_retries = 0 if num_retries > 6: num_retries = 6 emergency_brake = 10 try_count = 0 while True: emergency_brake -= 1 # avoid getting burned by any mistakes in While loop logic if emergency_brake < 1: break try: try_count += 1 connection = opts['connection_type'](opts['api_base'], **kwargs) request_info = self._create_request(connection, method, url, headers, data) result = self._execute_request_raw(connection, request_info) break except HapiUnauthorized, e: self.log.warning("401 Unauthorized response to API request.") if self.access_token and self.refresh_token and self.client_id and not retried: self.log.info("Refreshing access token") try: token_response = utils.refresh_access_token( self.refresh_token, self.client_id) decoded = json.loads(token_response) self.access_token = decoded['access_token'] self.log.info('Retrying with new token %' % (self.access_token)) except Exception, e: self.log.error("Unable to refresh access_token: %s" % (e)) raise return self._call_raw(subpath, params=params, method=method, data=data, doseq=doseq, query=query, retried=True, **options) else: if self.access_token and self.refresh_token and self.client_id and retried: self.log.error( "Refreshed token, but request still was not authorized. You may need to grant additional permissions." ) elif self.access_token and not self.refresh_token: self.log.error( "In order to enable automated refreshing of your access token, please provide a refresh token as well." ) elif self.access_token and not self.client_id: self.log.error( "In order to enable automated refreshing of your access token, please provide a client_id in addition to a refresh token." ) raise