Esempio n. 1
0
    def _mkarg(self, kargs):
        """change the argument list (encode value, add api key/secret)
        :return: the new argument list"""

        kargs = kargs.copy()
        kargs['api_key'] = self._api.key
        kargs['api_secret'] = self._api.secret
        for k, v in list(kargs.items()):
            if isinstance(v, Iterable) and not isinstance(v, basestring):
                kargs[k] = ','.join(v)
            elif isinstance(v, File) or v is None:
                del kargs[k]
            elif isinstance(v, numeric_types):
                kargs[k] = str(v)
            else:
                kargs[k] = v

        return kargs
Esempio n. 2
0
    def __call__(self, *args, **kargs):
        if len(args):
            raise TypeError('Only keyword arguments are allowed')
        form = _MultiPartForm()
        for (k, v) in kargs.items():
            if isinstance(v, File):
                form.add_file(k, v.get_filename(), v.content)

        url = self._urlbase
        for k, v in self._mkarg(kargs).items():
            form.add_field(k, v)

        body = form.bytes
        request = Request(url, data=body)
        request.add_header('Content-type', form.get_content_type())
        request.add_header('Content-length', str(len(body)))

        self._api.update_request(request)

        retry = self._api.max_retries
        while True:
            retry -= 1
            try:
                ret = urlopen(request, timeout=self._api.timeout).read()
                break
            except HTTPError as e:
                raise APIError(e.code, url, e.read())
            except (socket.error, URLError) as e:
                if retry < 0:
                    raise e
                _print_debug('caught error: {}; retrying'.format(e))
                time.sleep(self._api.retry_delay)

        if self._api.decode_result:
            try:
                # change due to compatibility problem with python 3.5
                #print(str(ret))
                ret = json.loads(ret.decode('utf-8'), object_hook=ObjectDict)
            except:
                raise APIError(-1, url,
                               'json decode error, value={0!r}'.format(ret))
        return ret
Esempio n. 3
0
def _print_debug(msg):
    if DEBUG_LEVEL:
        sys.stderr.write(str(msg) + '\n')