コード例 #1
0
ファイル: base.py プロジェクト: ckelly/hapipy
    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
コード例 #2
0
ファイル: base.py プロジェクト: ckelly/hapipy
    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
コード例 #3
0
ファイル: base.py プロジェクト: Evzdrop/hapipy
    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
コード例 #4
0
ファイル: base.py プロジェクト: pfitzsimmons/hapipy
    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
コード例 #5
0
ファイル: base.py プロジェクト: ocotopdf/hapipy
    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