예제 #1
0
파일: dnspod.py 프로젝트: NewFuture/DNSPOD
def request(action, param=None, **params):
    """
    发送请求数据
    """
    if param:
        params.update(param)

    params.update({'login_token': '***', 'format': 'json'})
    logger.info("%s : params:%s", action, params)
    params['login_token'] = "%s,%s" % (ID, TOKEN)

    if PROXY:
        conn = HTTPSConnection(PROXY)
        conn.set_tunnel(API_SITE, 443)
    else:
        conn = HTTPSConnection(API_SITE)

    conn.request(API_METHOD, '/' + action, urllib.urlencode(params),
                 {"Content-type": "application/x-www-form-urlencoded"})
    response = conn.getresponse()
    res = response.read()
    conn.close()

    if response.status < 200 or response.status >= 300:
        logger.warn('%s : error:%s', action, res) 
        raise Exception(res)
    else:
        data = json.loads(res.decode('utf8'))
        logger.debug('%s : result:%s', action, data)
        if not data:
            raise Exception("empty response")
        elif data.get("status", {}).get("code") == "1":
            return data
        else:
            raise Exception(data.get('status', {}))
예제 #2
0
 def request(self, domain, path, method, data=None):
     if self.proxy_ip and self.proxy_port:
         connection = HTTPSConnection(self.proxy_ip, self.proxy_port, timeout=self.request_timeout)
         connection.set_tunnel(domain)
     else:
         connection = HTTPSConnection(domain, timeout=self.request_timeout)
     response_content = None
     try:
         headers = {'User-Agent': self.user_agent}
         if self.proxy_user and self.proxy_pass:
             base64_bytes = b64encode(
                 ("%s:%s" % (self.proxy_user, self.proxy_pass)).encode("ascii")
             ).decode("ascii")
             headers['Authorization'] = 'Basic %s' % base64_bytes
         connection.request(method, path, headers=headers, body=data)
         response = connection.getresponse()
         # In python3, defaultencoding is utf-8.
         # In python2, defaultencoding is ascii.
         response_content = response.read()
         try:
             # JSON
             return json.loads(response_content.decode('utf-8'))
         except:
             # XML
             return ET.fromstring(response_content)
     except ValueError as e:
         LOGGER.error("Value error (%s) in response_content: %s", e, response_content)
         raise APIResponseException(response_content)
     except (socket.timeout, ssl.SSLError) as e:
         LOGGER.error("Timed out request on %s, %s: %s", method, path, e)
         raise APIRequestTimedOutException("Timed out request: %s" % e)
     finally:
         connection.close()
예제 #3
0
def request(param=None, **params):
    """
    发送请求数据
    """
    if param:
        params.update(param)

    params.update({API.TOKEN_PARAM: '***'})
    info("%s/%s : %s", API.SITE, API.ACTION, params)
    params[API.TOKEN_PARAM] = Config.TOKEN

    if Config.PROXY:
        conn = HTTPSConnection(Config.PROXY)
        conn.set_tunnel(API.SITE, 443)
    else:
        conn = HTTPSConnection(API.SITE)

    conn.request(API.METHOD, '/' + API.ACTION, urlencode(params),
                 {"Content-type": "application/x-www-form-urlencoded"})
    response = conn.getresponse()
    res = response.read().decode('utf8')
    conn.close()

    if response.status < 200 or response.status >= 300:
        warning('%s : error[%d]:%s', API.ACTION, response.status, res)
        raise Exception(res)
    else:
        debug('%s : result:%s', API.ACTION, res)
        if not res:
            raise Exception("empty response")
        elif res[:5] == "nochg" or res[:4] == "good":  # No change or success
            return res
        else:
            raise Exception(res)
예제 #4
0
def request(action, param=None, **params):
    """
    发送请求数据
    """
    if param:
        params.update(param)

    params.update({'user_token': "%s,%s" % (ID, TOKEN), 'format': 'json'})
    log.debug("%s : params:%s", action, params)

    if PROXY:
        conn = HTTPSConnection(PROXY)
        conn.set_tunnel(API_SITE, 443)
    else:
        conn = HTTPSConnection(API_SITE)

    conn.request(API_METHOD, '/' + action, urllib.urlencode(params),
                 {
                     "Content-type": "application/x-www-form-urlencoded",
                     "User-Agent": "DDNS Client/1.0"
    })
    response = conn.getresponse()
    res = response.read()
    conn.close()

    if response.status < 200 or response.status >= 300:
        raise Exception(res)
    else:
        data = json.loads(res.decode('utf8'))
        if not data:
            raise Exception("empty response")
        elif data.get("status", {}).get("code") == "1":
            return data
        else:
            raise Exception(data.get('status', {}))
예제 #5
0
def request(action, param=None, **params):
    """
    发送请求数据
    """
    if param:
        params.update(param)
    params = signature(params)
    info("%s : params:%s", action, params)

    if PROXY:
        conn = HTTPSConnection(PROXY)
        conn.set_tunnel(API_SITE, 443)
    else:
        conn = HTTPSConnection(API_SITE)

    conn.request(API_METHOD, '/api/' + action + '/', urlencode(params),
                 {"Content-type": "application/x-www-form-urlencoded"})
    response = conn.getresponse()
    result = response.read()
    conn.close()

    if response.status < 200 or response.status >= 300:
        raise Exception(result)
    else:
        data = jsondecode(result.decode('utf8'))
        debug('%s : result:%s', action, data)
        if data.get('code') != 0:
            raise Exception("api error:", data.get('message'))
        data = data.get('data')
        if data is None:
            raise Exception('response data is none')
        return data
예제 #6
0
파일: dnscom.py 프로젝트: NewFuture/DNSPOD
def request(action, param=None, **params):
    """
    发送请求数据
    """
    if param:
        params.update(param)
    params = signature(params)
    logger.info("%s : params:%s", action, params)

    if PROXY:
        conn = HTTPSConnection(PROXY)
        conn.set_tunnel(API_SITE, 443)
    else:
        conn = HTTPSConnection(API_SITE)

    conn.request(API_METHOD, '/api/' + action + '/', urllib.urlencode(params),
                 {"Content-type": "application/x-www-form-urlencoded"})
    response = conn.getresponse()
    result = response.read()
    conn.close()

    if response.status < 200 or response.status >= 300:
        raise Exception(result)
    else:
        data = json.loads(result.decode('utf8'))
        logger.debug('%s : result:%s', action, data)
        if data.get('code') != 0:
            raise Exception("api error:", data.get('message'))
        data = data.get('data')
        if data is None:
            raise Exception('response data is none')
        return data
예제 #7
0
파일: alidns.py 프로젝트: NewFuture/DNSPOD
def request(param=None, **params):
    """
    发送请求数据
    """
    if param:
        params.update(param)
    params = signature(params)
    logger.debug("params:%s", params)

    if PROXY:
        conn = HTTPSConnection(PROXY)
        conn.set_tunnel(API_SITE, 443)
    else:
        conn = HTTPSConnection(API_SITE)

    conn.request(API_METHOD, '/', urllib.urlencode(params),
                 {"Content-type": "application/x-www-form-urlencoded"})
    response = conn.getresponse()
    data = response.read()
    conn.close()

    if response.status < 200 or response.status >= 300:
        logger.warn('%s : error:%s', params['Action'], data)       
        raise Exception(data)
    else:
        data = json.loads(data.decode('utf8'))
        logger.debug('%s : result:%s', params['Action'], data)
        return data
예제 #8
0
def request(param=None, **params):
    """
    发送请求数据
    """
    if param:
        params.update(param)
    params = dict((k, params[k]) for k in params if params[k] is not None)
    params = signature(params)
    info("%s: %s", API.SITE, params)

    if Config.PROXY:
        conn = HTTPSConnection(Config.PROXY)
        conn.set_tunnel(API.SITE, 443)
    else:
        conn = HTTPSConnection(API.SITE)
    conn.request(API.METHOD, '/', urlencode(params),
                 {"Content-type": "application/x-www-form-urlencoded"})
    response = conn.getresponse()
    data = response.read().decode('utf8')
    conn.close()

    if response.status < 200 or response.status >= 300:
        warning('%s : error[%d]: %s', params['Action'], response.status, data)
        raise Exception(data)
    else:
        data = jsondecode(data)
        debug('%s : result:%s', params['Action'], data)
        return data
예제 #9
0
파일: dnspod.py 프로젝트: zz942694364/DDNS
def request(action, param=None, **params):
    """
    发送请求数据
    """
    if param:
        params.update(param)

    params.update({API.TOKEN_PARAM: '***', 'format': 'json'})
    info("%s/%s : %s", API.SITE, action, params)
    params[API.TOKEN_PARAM] = "%s,%s" % (ID, TOKEN)

    if PROXY:
        conn = HTTPSConnection(PROXY)
        conn.set_tunnel(API.SITE, 443)
    else:
        conn = HTTPSConnection(API.SITE)

    conn.request(API.METHOD, '/' + action, urlencode(params),
                 {"Content-type": "application/x-www-form-urlencoded"})
    response = conn.getresponse()
    res = response.read()
    conn.close()

    if response.status < 200 or response.status >= 300:
        warning('%s : error:%s', action, res)
        raise Exception(res)
    else:
        data = jsondecode(res.decode('utf8'))
        debug('%s : result:%s', action, data)
        if not data:
            raise Exception("empty response")
        elif data.get("status", {}).get("code") == "1":
            return data
        else:
            raise Exception(data.get('status', {}))
예제 #10
0
def request(param=None, **params):
    """
    发送请求数据
    """
    if param:
        params.update(param)
    params = signature(params)
    logger.debug("params:%s", params)

    if PROXY:
        conn = HTTPSConnection(PROXY)
        conn.set_tunnel(API_SITE, 443)
    else:
        conn = HTTPSConnection(API_SITE)

    conn.request(API_METHOD, '/', urllib.urlencode(params),
                 {"Content-type": "application/x-www-form-urlencoded"})
    response = conn.getresponse()
    data = response.read()
    conn.close()

    if response.status < 200 or response.status >= 300:
        logger.warn('%s : error:%s', params['Action'], data)
        raise Exception(data)
    else:
        data = json.loads(data.decode('utf8'))
        logger.debug('%s : result:%s', params['Action'], data)
        return data
예제 #11
0
def request(method, action, param=None, **params):
    """
        发送请求数据
    """
    if param:
        params.update(param)

    params = dict((k, params[k]) for k in params if params[k] is not None)
    info("%s/%s : %s", API.SITE, action, params)
    if Config.PROXY:
        conn = HTTPSConnection(Config.PROXY)
        conn.set_tunnel(API.SITE, 443)
    else:
        conn = HTTPSConnection(API.SITE)

    if method in ['PUT', 'POST', 'PATCH']:
        # 从public_v(4,6)获取的IP是bytes类型,在json.dumps时会报TypeError
        params['content'] = str(params.get('content'))
        params = jsonencode(params)
    else:  # (GET, DELETE) where DELETE doesn't require params in Cloudflare
        if params:
            action += '?' + urlencode(params)
        params = None
    if not Config.ID:
        headers = {
            "Content-type": "application/json",
            "Authorization": "Bearer " + Config.TOKEN
        }
    else:
        headers = {
            "Content-type": "application/json",
            "X-Auth-Email": Config.ID,
            "X-Auth-Key": Config.TOKEN
        }
    conn.request(method, '/client/v4/zones' + action, params, headers)
    response = conn.getresponse()
    res = response.read().decode('utf8')
    conn.close()
    if response.status < 200 or response.status >= 300:
        warning('%s : error[%d]:%s', action, response.status, res)
        raise Exception(res)
    else:
        data = jsondecode(res)
        debug('%s : result:%s', action, data)
        if not data:
            raise Exception("Empty Response")
        elif data.get('success'):
            return data.get('result', [{}])
        else:
            raise Exception(data.get('errors', [{}]))
예제 #12
0
    def push_to_sysinf(put_url, info):
        """
        Attempt to post the given URL to the central sysinf server. First, try directly.
        then try through local Squid proxy, then throught Squid on 'appserver.gwn', then
        give up.
        """
        headers = {'Content-Type': 'application/json'}
        sysinf_success = False
        info['sysinf_access'] = 'direct'
        json_info = dumps(info)

        try:
            # Try to send DIRECTLY to the new sysinf server
            sysinf = HTTPSConnection('sysinf.getwellnetwork.com', timeout=15)
            sysinf.request('PUT', put_url, json_info, headers)
            sysinf.getresponse()
            sysinf.close()
            sysinf_success = True
        except Exception as e:
            pass

        if not sysinf_success:
            try:
                # Try to send via LOCAL Squid port (if site enforces upstream proxy) to the new sysinf server
                info['sysinf_access'] = 'local-proxy'
                json_info = dumps(info)
                sysinf = HTTPSConnection('localhost', 3128, timeout=15)
                sysinf.set_tunnel('sysinf.getwellnetwork.com', 443)
                sysinf.request('PUT', put_url, json_info, headers)
                sysinf.getresponse()
                sysinf.close()
                sysinf_success = True
            except Exception as e:
                pass

        if not sysinf_success:
            try:
                # Try to send VIA APPSERVER to the new sysinf server
                info['sysinf_access'] = 'proxy'
                json_info = dumps(info)
                sysinf = HTTPSConnection('appserver.gwn', 3128, timeout=15)
                sysinf.set_tunnel('sysinf.getwellnetwork.com', 443)
                sysinf.request('PUT', put_url, json_info, headers)
                sysinf.getresponse()
                sysinf.close()
                sysinf_success = True
            except Exception as e:
                pass
예제 #13
0
    def __init__(self, parent, site_customization):
        InterfaceAction.__init__(self, parent, site_customization)

        https_proxy = get_proxies(debug=False).get('https', None)
        if https_proxy:
            https_address = ':'.join(https_proxy.split(':')[:-1])
            https_port = int(https_proxy.split(':')[-1])
            goodreads_conn = HTTPSConnection(https_address, https_port)
            goodreads_conn.set_tunnel('www.goodreads.com', 443)
            amazon_conn = HTTPSConnection(https_address, https_port)
            amazon_conn.set_tunnel('www.amazon.com', 443)
        else:
            goodreads_conn = HTTPSConnection('www.goodreads.com')
            amazon_conn = HTTPSConnection('www.amazon.com')

        self._connections = {'goodreads': goodreads_conn, 'amazon': amazon_conn}
        self.menu = QMenu(self.gui)
예제 #14
0
def request(method, action, param=None, **params):
    """
        发送请求数据
    """
    if param:
        params.update(param)

    info("$s %s : params:%s", action, params)
    if PROXY:
        conn = HTTPSConnection(PROXY)
        conn.set_tunnel(API_SITE, 443)
    else:
        conn = HTTPSConnection(API_SITE)

    if method in ['PUT', 'POST', 'PATCH']:
        # 从public_v(4,6)获取的IP是bytes类型,在json.dumps时会报TypeError
        params['content'] = str(params.get('content'))
        params = jsonencode(params)
    else:  # (GET, DELETE) where DELETE doesn't require params in Cloudflare
        if params:
            action += '?' + urlencode(params)
        params = None
    conn.request(
        method, '/client/v4/zones' + action, params, {
            "Content-type": "application/json",
            "X-Auth-Email": ID,
            "X-Auth-Key": TOKEN
        })
    response = conn.getresponse()
    res = response.read()
    conn.close()
    if response.status < 200 or response.status >= 300:
        raise Exception(res)
    else:
        data = jsondecode(res.decode('utf8'))
        debug('%s : result:%s', action, data)
        if not data:
            raise Exception("Empty Response")
        elif data.get('success'):
            return data.get('result', [{}])
        else:
            raise Exception(data.get('errors', [{}]))
예제 #15
0
    def __init__(self, parent, site_customization):
        InterfaceAction.__init__(self, parent, site_customization)

        https_proxy = get_proxies(debug=False).get('https', None)
        if https_proxy:
            https_address = ':'.join(https_proxy.split(':')[:-1])
            https_port = int(https_proxy.split(':')[-1])
            goodreads_conn = HTTPSConnection(https_address, https_port)
            goodreads_conn.set_tunnel('www.goodreads.com', 443)
            amazon_conn = HTTPSConnection(https_address, https_port)
            amazon_conn.set_tunnel('www.amazon.com', 443)
        else:
            goodreads_conn = HTTPSConnection('www.goodreads.com')
            amazon_conn = HTTPSConnection('www.amazon.com')

        self._connections = {
            'goodreads': goodreads_conn,
            'amazon': amazon_conn
        }
        self.menu = QMenu(self.gui)
예제 #16
0
def request(action, param=None, **params):
    """
    发送请求数据
    """
    if param:
        params.update(param)
    params = dict((k, params[k]) for k in params if params[k] is not None)
    params.update({API.TOKEN_PARAM: '***', 'format': 'json'})
    info("%s/%s : %s", API.SITE, action, params)
    params[API.TOKEN_PARAM] = "%s,%s" % (Config.ID, Config.TOKEN)
    params[API.LENGTH] = "3000"  #添加参数
    if Config.PROXY:
        conn = HTTPSConnection(Config.PROXY)
        conn.set_tunnel(API.SITE, 443)
    else:
        conn = HTTPSConnection(API.SITE)

    conn.request(
        API.METHOD, '/' + action, urlencode(params), {
            "Content-type":
            "application/x-www-form-urlencoded",
            "User-Agent":
            "DDNS/%s ([email protected])" %
            environ.get("DDNS_VERSION", "1.0.0")
        })
    response = conn.getresponse()
    res = response.read().decode('utf8')
    conn.close()

    if response.status < 200 or response.status >= 300:
        warning('%s : error[%d]:%s', action, response.status, res)
        raise Exception(res)
    else:
        data = jsondecode(res)
        debug('%s : result:%s', action, data)
        if not data:
            raise Exception("empty response")
        elif data.get("status", {}).get("code") == "1":
            return data
        else:
            raise Exception(data.get('status', {}))
예제 #17
0
def request(method, action, param=None, **params):
    """
        发送请求数据
    """
    if param:
        params.update(param)

    logger.info("$s %s : params:%s", action, params)
    if PROXY:
        conn = HTTPSConnection(PROXY)
        conn.set_tunnel(API_SITE, 443)
    else:
        conn = HTTPSConnection(API_SITE)

    if method in ['PUT', 'POST', 'PATCH']:
        # 从public_v(4,6)获取的IP是bytes类型,在json.dumps时会报TypeError
        params['content'] = str(params.get('content'))
        params = json.dumps(params)
    else:  # (GET, DELETE) where DELETE doesn't require params in Cloudflare
        if params:
            action += '?' + urllib.urlencode(params)
        params = None
    conn.request(method, '/client/v4/zones' + action, params,
                 {"Content-type": "application/json",
                  "X-Auth-Email": ID,
                  "X-Auth-Key": TOKEN})
    response = conn.getresponse()
    res = response.read()
    conn.close()
    if response.status < 200 or response.status >= 300:
        raise Exception(res)
    else:
        data = json.loads(res.decode('utf8'))
        logger.debug('%s : result:%s', action, data)
        if not data:
            raise Exception("Empty Response")
        elif data.get('success'):
            return data.get('result', [{}])
        else:
            raise Exception(data.get('errors', [{}]))
예제 #18
0
    def _new_conn(self):
        """
		Return a fresh HTTPSConnection.
		"""
        self.num_connections += 1
        if self.proxyURL:
            headers = {}
            try:
                url = urlparse.urlparse(self.proxyURL)
                if url.password:
                    logger.setConfidentialString(url.password)
                logger.debug(
                    u"Starting new HTTPS connection (%d) to %s:%d over proxy-url %s"
                    % (self.num_connections, self.host, self.port,
                       self.proxyURL))
                conn = HTTPSConnection(host=url.hostname, port=url.port)
                if url.username and url.password:
                    logger.debug(
                        u"Proxy Authentication detected, setting auth with user: '******'"
                        % url.username)
                    auth = "{username}:{password}".format(
                        username=url.username, password=url.password)
                    headers[
                        'Proxy-Authorization'] = 'Basic ' + base64.base64encode(
                            auth)
                conn.set_tunnel(self.host, self.port, headers)
                logger.debug(u"Connection established to: %s" % self.host)
            except Exception as e:
                logger.logException(e)
        else:
            logger.debug(u"Starting new HTTPS connection (%d) to %s:%d" %
                         (self.num_connections, self.host, self.port))
            conn = HTTPSConnection(host=self.host, port=self.port)
            logger.debug(u"Connection established to: %s" % self.host)

        if self.verifyServerCert or self.verifyServerCertByCa:
            try:
                non_blocking_connect_https(conn, self.connectTimeout,
                                           self.caCertFile)
                if not self.verifyServerCertByCa:
                    self.serverVerified = True
                    logger.debug("Server verified.")
            except ssl_module.SSLError as error:
                logger.debug(u"Verification failed: {0!r}", error)
                if self.verifyServerCertByCa:
                    raise OpsiServiceVerificationError(
                        u"Failed to verify server cert by CA: %s" % error)

                logger.debug("Going to try a connect without caCertFile...")
                non_blocking_connect_https(conn, self.connectTimeout)
            except Exception as error:
                logger.debug(u"Verification failed: {0!r}", error)
                raise OpsiServiceVerificationError(forceUnicode(error))

        self.peerCertificate = getPeerCertificate(conn, asPEM=True)
        if self.verifyServerCertByCa:
            logger.debug("Attempting to verify server cert by CA...")
            try:
                if self.peerCertificate:
                    commonName = crypto.load_certificate(
                        crypto.FILETYPE_PEM,
                        self.peerCertificate).get_subject().commonName
                    host = self.host
                    if re.search(r'^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$',
                                 host):
                        fqdn = socket.getfqdn(host)
                        if fqdn == host:
                            raise OpsiServiceVerificationError(
                                u"Failed to get fqdn for ip %s" % host)
                        host = fqdn
                    if not host or not commonName or (host.lower() !=
                                                      commonName.lower()):
                        raise OpsiServiceVerificationError(
                            u"Host '%s' does not match common name '%s'" %
                            (host, commonName))
                    self.serverVerified = True
                else:
                    raise OpsiServiceVerificationError(
                        u"Failed to get peer certificate")
            except Exception:
                closeConnection(conn)
                raise

        return conn
예제 #19
0
파일: huaweidns.py 프로젝트: zs819/DDNS
def request(method, path, param=None, body=None, **params):
    # path 是不带host但是 前面需要带 / , body json 字符串或者自己从dict转换下
    # 也可以自己改成 判断下是不是post 是post params就是body
    if param:
        params.update(param)

    query = urlencode(sorted(params.items()))
    headers = {"content-type": "application/json"}  # 初始化header
    headers["X-Sdk-Date"] = datetime.strftime(datetime.utcnow(),
                                              BasicDateFormat)
    headers["host"] = API.SITE
    # 如何后来有需要把header头 key转换为小写 value 删除前导空格和尾随空格
    sign_headers = []
    for key in headers:
        sign_headers.append(key.lower())
    # 先排序
    sign_headers.sort()

    if body is None:
        body = ""

    hex_encode = HexEncodeSHA256Hash(body.encode('utf-8'))
    # 生成文档中的CanonicalRequest
    canonical_headers = CanonicalHeaders(headers, sign_headers)

    # 签名中的path 必须 / 结尾
    if path[-1] != '/':
        sign_path = path + "/"
    else:
        sign_path = path

    canonical_request = "%s\n%s\n%s\n%s\n%s\n%s" % (method.upper(
    ), sign_path, query, canonical_headers, ";".join(sign_headers), hex_encode)

    hashed_canonical_request = HexEncodeSHA256Hash(
        canonical_request.encode('utf-8'))

    # StringToSign
    str_to_sign = "%s\n%s\n%s" % (Algorithm, headers['X-Sdk-Date'],
                                  hashed_canonical_request)

    secret = Config.TOKEN
    # 计算签名  HexEncode(HMAC(Access Secret Key, string to sign))
    signature = hmac.new(secret.encode('utf-8'),
                         str_to_sign.encode('utf-8'),
                         digestmod=hashlib.sha256).digest()
    signature = binascii.hexlify(signature).decode()
    # 添加签名信息到请求头
    auth_header = "%s Access=%s, SignedHeaders=%s, Signature=%s" % (
        Algorithm, Config.ID, ";".join(sign_headers), signature)
    headers['Authorization'] = auth_header
    # 创建Http请求

    if Config.PROXY:
        conn = HTTPSConnection(Config.PROXY)
        conn.set_tunnel(API.SITE, 443)
    else:
        conn = HTTPSConnection(API.SITE)
    conn.request(method, API.SCHEME + "://" + API.SITE + path + '?' + query,
                 body, headers)
    info(API.SCHEME + "://" + API.SITE + path + '?' + query, body)
    resp = conn.getresponse()
    data = resp.read().decode('utf8')
    resp.close()
    if resp.status < 200 or resp.status >= 300:

        warning('%s : error[%d]: %s', path, resp.status, data)
        raise Exception(data)
    else:
        data = json.loads(data)
        debug('%s : result:%s', path, data)
        return data